Как сделать численное интегрирование с квантовой волновой функцией генератора гармоник?

Спасибо за создание песочницы. Я смог решить проблему, с которой вы столкнулись. Я немного изменил ваш компонент Posts. Вы были близки, но имели одну или две вещи, которые вы пропустили. Пожалуйста, смотрите мои изменения ниже:

class Posts extends Component {
  constructor() {
    super();
    this.state = {
      posts: [
        { _id: 1, title: "title1", body: "body1", author: "author1" },
        { _id: 2, title: "title2", body: "body2", author: "author2" },
        { _id: 3, title: "title3", body: "body3", author: "author3" }
      ],
      postId: null,
      modalShow: false
    };
  }
  modalClose = id => {
    this.setState({ modalShow: !this.state.modalShow, postId: id });
  };
  renderModal = () => {
    const { modalShow, postId, posts } = this.state;
    const post = posts.find(post => (post._id === postId));

    return (
      <MyVerticallyCenteredModal
        show={modalShow}
        title={post.title}
        body={post.body}
        onHide={this.modalClose}
      />
    );
  };
  render() {
    return (
      <div className="Posts">
        <h2>Posts</h2>
        <CardDeck>
          {this.state.posts.map(post => (
            <Card key={post._id + post.title}>
              <Card.Body>
                <Card.Title>"{post.title}"</Card.Title>
                <Card.Text>
                  {post.body}
                  <ButtonToolbar>
                    <Button
                      variant="primary"
                      onClick={() => this.modalClose(post._id)}
                    >
                      Read
                    </Button>
                  </ButtonToolbar>
                </Card.Text>
              </Card.Body>
              <Card.Footer>
                <Container>
                  <Row>
                    <Col>
                      <small className="text-muted">
                        Author: {post.author}{" "}
                      </small>
                    </Col>
                  </Row>
                </Container>
              </Card.Footer>
            </Card>
          ))}
        </CardDeck>
        {this.state.modalShow && this.renderModal()}
      </div>
    );
  }
}

Надеюсь, это поможет вам.

Это не идеально, но что-то, чтобы помочь вам понять, что было изначально неправильно.

6
задан 4 revs, 3 users 65% 14 October 2009 в 14:40
поделиться

4 ответа

Неполный ответ, так как я немного короток вовремя в данный момент; если другие не могут завершить изображение, я могу предоставить больше деталей позже.

  1. Примените ортогональность волновых функций каждый раз, когда и везде, где возможно. Это должно значительно сократить объем вычисления.

  2. Сделайте аналитически независимо от того, что Вы можете. Константы лифта, интегралы разделения частями, безотносительно. Изолируйте видимую область; большинство волновых функций ограничено полосой, и сокращение сферы интересов сделает много для сохранения работы.

  3. Для самой квадратуры Вы, вероятно, хотите разделить волновые функции на три части и интегрировать каждого отдельно: колебательный бит в центре плюс экспоненциально затухающие хвосты с обеих сторон. Если волновая функция нечетна, Вы становитесь удачливыми, и хвосты отменят друг друга, означая, что только необходимо волноваться о центре. Даже для волновых функций только необходимо интегрировать один и удвоить его (ура для симметрии!). Иначе интегрируйте хвосты с помощью старшего разряда квадратурное правило Лагерра Гаусса. Вам, возможно, придется вычислить правила самим; я не знаю, приводят ли таблицы хорошие правила Лагерра Гаусса, поскольку они не используются слишком часто. Вы, вероятно, также хотите проверить ошибочное поведение, когда количество узлов в правиле повышается; это было долгое время, так как я использовал правила Лагерра Гаусса, и я не помню, показывают ли они явление Рунге. Интегрируйте центральную часть с помощью любого метода, который Вы любите; Гаусс - Кронрод является серьезным выбором, конечно, но существует также Fejer квадратура (который иногда масштабируется лучше к высоким числам узлов, которые могли бы работать более хорошие над колебательным подынтегральным выражением), и даже метод трапеций (который показывает ошеломляющую точность с определенными колебательными функциями). Выберите один и испытайте его; если результаты плохи, дают другому методу выстрел.

Самый трудный вопрос когда-нибудь на ТАК? Едва :)

8
ответ дан 8 December 2019 в 18:42
поделиться

Приближение WKB?

1
ответ дан 8 December 2019 в 18:42
поделиться

Я бы порекомендовал еще несколько вещей:

  1. Попробуйте преобразовать функцию в конечную область, чтобы сделать интеграцию более управляемой.
  2. По возможности используйте симметрию - разбейте ее на сумма двух интегралов от отрицательной бесконечности до нуля и от нуля до бесконечности и посмотрите, является ли функция симметричной или антисимметричной. Это могло бы упростить ваши вычисления.
  3. Изучите квадратуру Гаусса-Лагерра и посмотрите, может ли она вам помочь.
4
ответ дан 8 December 2019 в 18:42
поделиться

Я не собираюсь сейчас объяснять или уточнять что-либо из этого. Этот код написан как есть и, вероятно, неверен. Я даже не уверен, что это именно тот код, который я искал, я просто помню, что много лет назад я столкнулся с этой проблемой и при поиске в своих архивах нашел это. Вам нужно будет самостоятельно построить график вывода, некоторые инструкции предоставляются. Я скажу, что интеграция в бесконечном диапазоне - это проблема, к которой я обратился, и после выполнения кода в ней указывается ошибка округления на «бесконечности» (что численно означает просто большое).

// compile g++ base.cc -lm
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <math.h>

using namespace std;

int main ()
        {
        double xmax,dfx,dx,x,hbar,k,dE,E,E_0,m,psi_0,psi_1,psi_2;
        double w,num;
        int n,temp,parity,order;
        double last;
        double propogator(double E,int parity);
        double eigen(double E,int parity);
         double f(double x, double psi, double dpsi);
        double g(double x, double psi, double dpsi);
        double rk4(double x, double psi, double dpsi, double E);

        ofstream datas ("test.dat");

        E_0= 1.602189*pow(10.0,-19.0);// ev joules conversion
        dE=E_0*.001;
//w^2=k/m                 v=1/2 k x^2             V=??? = E_0/xmax   x^2      k-->
//w=sqrt( (2*E_0)/(m*xmax) );
//E=(0+.5)*hbar*w;

        cout << "Enter what energy level your looking for, as an (0,1,2...) INTEGER: ";
        cin >> order;

        E=0;
        for (n=0; n<=order; n++)
                {
                parity=0;
//if its even parity is 1 (true)
                temp=n;
                if ( (n%2)==0 ) {parity=1; }
                cout << "Energy " << n << " has these parameters: ";
                E=eigen(E,parity);
                if (n==order)
                        {
                        propogator(E,parity);
                        cout <<" The postive values of the wave function were written to sho.dat \n";
                        cout <<" In order to plot the data should be reflected about the y-axis \n";
                        cout <<"  evenly for even energy levels and oddly for odd energy levels\n";
                        }
                E=E+dE;
                }
        }

double propogator(double E,int parity)
        {
        ofstream datas ("sho.dat") ;

        double hbar =1.054*pow(10.0,-34.0);
        double m =9.109534*pow(10.0,-31.0);
        double E_0= 1.602189*pow(10.0,-19.0);
        double dx =pow(10.0,-10);
        double xmax= 100*pow(10.0,-10.0)+dx;
        double dE=E_0*.001;
        double last=1;
        double x=dx;
        double psi_2=0.0;
        double psi_0=0.0;
        double psi_1=1.0;
//      cout <<parity << " parity passsed \n";
        psi_0=0.0;
        psi_1=1.0;
        if (parity==1)
                {
                psi_0=1.0;
                psi_1=m*(1.0/(hbar*hbar))* dx*dx*(0-E)+1 ;
                }

        do
                {
                datas << x << "\t" << psi_0 << "\n";
                psi_2=(2.0*m*(dx/hbar)*(dx/hbar)*(E_0*(x/xmax)*(x/xmax)-E)+2.0)*psi_1-psi_0;
//cout << psi_1 << "=psi_1\n";
                psi_0=psi_1;
                psi_1=psi_2;
                x=x+dx;
                } while ( x<= xmax);
//I return 666 as a dummy value sometimes to check the function has run
        return 666;
        }


   double eigen(double E,int parity)
        {
        double hbar =1.054*pow(10.0,-34.0);
        double m =9.109534*pow(10.0,-31.0);
        double E_0= 1.602189*pow(10.0,-19.0);
        double dx =pow(10.0,-10);
        double xmax= 100*pow(10.0,-10.0)+dx;
        double dE=E_0*.001;
        double last=1;
        double x=dx;
        double psi_2=0.0;
        double psi_0=0.0;
        double psi_1=1.0;
        do
                {
                psi_0=0.0;
                psi_1=1.0;

                if (parity==1)
                        {double psi_0=1.0; double psi_1=m*(1.0/(hbar*hbar))* dx*dx*(0-E)+1 ;}
                x=dx;
                do
                        {
                        psi_2=(2.0*m*(dx/hbar)*(dx/hbar)*(E_0*(x/xmax)*(x/xmax)-E)+2.0)*psi_1-psi_0;
                        psi_0=psi_1;
                        psi_1=psi_2;
                        x=x+dx;
                        } while ( x<= xmax);


                if ( sqrt(psi_2*psi_2)<=1.0*pow(10.0,-3.0))
                        {
                        cout << E << " is an eigen energy and " << psi_2 << " is psi of 'infinity'  \n";
                        return E;
                        }
                else
                        {
                        if ( (last >0.0 && psi_2<0.0) ||( psi_2>0.0 && last<0.0) )
                                {
                                E=E-dE;
                                dE=dE/10.0;
                                }
                        }
                last=psi_2;
                E=E+dE;
                } while (E<=E_0);
        }

Если этот код кажется правильным, неправильным, интересно или у вас есть конкретные вопросы, и я отвечу на них.

0
ответ дан 8 December 2019 в 18:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: