どのような数値積分量子高調波発振器の波動関数?
質問
どのような 数値積分 (数値解析法、さらにお得な価格での使用のための一次元統合の上限範囲は、一つ以上の機能のintegrandいて 1次元量子高調波発振器 波。そしたいの算定マトリクス要素の一部機能の高調波発振器基準:
phin(x)=Nn Hn(x)exp(-x2/2)
Hn(x)が Hermite多項式Vm,n =\int_{-infinity}^{infinity}phim(x)V(x)phin(x)dx
ものが存在する場合の量子波wavefunctionsで幅の異なる.
問題はwavefunctions phin(x)の振動挙動が問題にな大 n, は、アルゴリズムのように適応的ガウス-Kronrodの積分公式からGSL(GNU Scientific Library)において、長を計算し、大きます。
解決
不完全な答えはいっても、私は少し短時間でその瞬間;場合その他いを、供給できます詳細は後述します。
適用直行性のwavefunctionsいつでもどこでも可能です。これを大幅に削減量の計算である。
いづもできます。リフト数、積分による部品である。分離の関心領域;最wavefunctionsのバンド限定のものの利息がたくさん保存します。
ための積分公式そのもの、ほとんどの場合分割を行うwavefunctions三個を各別の振動ビットのセンターの指数関数的に減衰する尻尾ます。場合の波動関数が奇数、ラッキの尻尾まだまだ心配しなく。もwavefunctionsだけを統合し、ダブルで(hoorayのための対称性を!).その他、統合のしっぽを使用することができ、ガウス-ラゲー積分公式の規則です。なければならなくなるかもしれの計算ルールに自分自身;わからない場合はテーブルリストの良いガウス-ラゲールとしてではないで使用いたしました。きょうもチェックしたい、エラー行動しているノードのルールが、して使ってガウス-ラゲールが思い出せば、いまルンゲ-クッタの現象になります。統合センター部分を使う方法です。Gauss-Kronrodは固体の選択はもちろんの域を出ないのも事実でFejerの積分公式(時にはスケールによる多数のノードがすぐに仕事に振動integrandものが台形のルールを示す見事な精度で一定の振動。最し、ぜひ利用してみてください;た場合の結果は貧しいのは、もう一つの方法がシュートを放ちます。
硬質問に際しては、従来にも増して"と思いますよね(笑)。ほとんど:)
他のヒント
されています。数その他のもの
- うに変える機能を有限領域の統合がより管理しやすいものとなる。
- 利用の対称性が破断での和の積分からの負の無限大に近づくようにゼロゼロを無限大の場合この機能には対称性または反対称.も可能あるいはお客様のコンピュータに簡単です。
- 見 ガウス-ラゲー積分公式 とを確認してくださいすることができます。
私は今、この権利のいずれかを説明したり、資格つもりはありません。このコードは、おそらく間違っているとのように書かれています。私はそれが私が探していたコードである場合にもわからない、私はちょうど数年前、私はこの問題を行なったし、私のアーカイブを検索すると、私はこれを見つけたことを覚えておいてください。あなたは、いくつかの命令が提供され、出力を自分でプロットする必要があります。私は無限の範囲にわたる統合は、私が対処し、コードの実行時に、それは(数値だけ大きな意味)「無限大」でエラーオフラウンドを述べている問題であると言うだろう。
// 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);
}
このコードは、正しい間違っている、興味深いと思われるか、具体的な質問が尋ねていないと私はそれらを答える場合ます。
私は物理学を専攻学生です、と私はまた、問題が発生しました。これらの日私は、この質問について考えておくと、私自身の答えを得ます。私はそれはあなたがこの質問を解決するのに役立つかもしれないと思います。
qawo&qawfを -1.In GSL、あなたは振動機能を統合することができます機能があります。たぶん、あなたは、のA の値を設定することができます。積分は[ 、0]、トウ部分に分離することができる[ A 、pos_infinity]。最初の区間では、あなたが望む任意のGSLの統合機能を使用することができ、第二の間隔で、あなたはqawoやqawfを使用することができます。
2.Orあなた上限に機能を統合することができ、のB の、それは[0、のB の]に統合されています。だから、統合はガウスの伝説法を用いて計算することができ、これはGSLで提供されています。実際の値と計算値との間におそらくいくつかの違いがあるが、しかし、あなたは、のB を設定している場合、正しく、差は無視することができます。限り、違いはあなたが望む精度未満であると。そして、この戻り値がポイントとそれに対応する重みであり、そして統合をfの合計のみ(XI)であるため、GSLの機能を利用する方法は、一度だけ呼び出され、何度も使用することができます* WI、詳細については、あなたはガウスルジャンドルを検索することができますウィキペディアに直交。複数とさらに操作が統合よりもはるかに高速です。
あなたはGSL-ユーザーのガイドでそれを検索することができ、qagi -3.Thereも無限大の面積積分を計算することができる機能です。しかし、これはあなたが統合を計算する必要があるたびに呼び出され、これが消費するいくつかの時間を引き起こすかもしれないが、私はそれはあなたのプログラムに使用されますどのくらいかわからない。
私は私が提供NO.2の選択肢を提案します。
あなたがしようとする場合があります:
http://www.mymathlib.com/quadrature/gauss_hermite.htmlする
プログラム100はゼロと重み(H_100のゼロ)を有するガウスエルミート直交介して積分を計算します。あなたがHermite_100越えるたら積分は限り正確ではありません。
私はあなたが計算したいと、それはかなりうまく機能まさに計算するプログラムを書いたこの統合の方法を使用。また、そこにエルミート多項式のゼロの漸近形を使用することにより、N = 100を超えて移動するための方法かもしれないが、私はそれに見ていない。