我用薛定谔方程分别求出199个phi和199个psi,现在的问题是phi*psi后求积分求不出来,代码如图所示。我尝试了很多种method都不行。求助广大强大的网友,该怎么求积分呢? 返回小木虫查看更多
1D的高度振荡的波函数的积分
mathematica
L = 1000*10^-10; F = 10^7; m = 0.0665*9.1*10^-31; mhole = 0.34*9.1*10^-31; e = 1.6*10^-19; \[HBar] = 1.05*10^-34; Ne = 199;eqn1 = (-(\[HBar]^2/(2 m))* (\[Phi]^\[Prime]\[Prime])[x] + e*F*x*\[Phi][x]);{phivals, phifuns} = NDEigensystem[{eqn1, DirichletCondition[\[Phi][x] == 0, x \[GreaterSlantEqual] L/2 || x <= -L/2]}, \[Phi][x], {x, -L/2, L/2}, Ne, Method -> {"SpatialDiscretization" -> {"FiniteElement", \ {"MeshOptions" -> {MaxCellMeasure -> 10^-9}}}}];eqn2 = (-(\[HBar]^2/(2 mhole))* (\[Psi]^\[Prime]\[Prime])[x] - e*F*x*\[Psi][x]);{psivals, psifuns} = NDEigensystem[{eqn2, DirichletCondition[[Psi][x] == 0, x [GreaterSlantEqual] L/2 || x <= -L/2]}, [Psi][x], {x, -L/2, L/2}, Ne, Method -> {"SpatialDiscretization" -> {"FiniteElement", \ {"MeshOptions" -> {MaxCellMeasure -> 10^-9}}}}];Etable = Table[(psivals[] + phivals[[j]])/(1.6*10^-22), {i, Ne}, {j, Ne}];Itable = Table[ Abs[NIntegrate[psifuns[]*phifuns[[j]], {x, -L/2, L/2}, Method -> {"ExtrapolatingOscillatory"}]], {i, Ne}, {j, Ne}];,
L = 1000*10^-10; F = 10^7; m = 0.0665*9.1*10^-31; mhole = 0.34*9.1*10^-31; e = 1.6*10^-19; \[HBar] = 1.05*10^-34; Ne = 199;eqn1 = (-(\[HBar]^2/(2 m))* (\[Phi]^\[Prime]\[Prime])[x] + e*F*x*\[Phi][x]);{phivals, phifuns} = NDEigensystem[{eqn1, DirichletCondition[\[Phi][x] == 0, x \[GreaterSlantEqual] L/2 || x <= -L/2]}, \[Phi][x], {x, -L/2, L/2}, Ne, Method -> {"SpatialDiscretization" -> {"FiniteElement", \ {"MeshOptions" -> {MaxCellMeasure -> 10^-9}}}}];eqn2 = (-(\[HBar]^2/(2 mhole))* (\[Psi]^\[Prime]\[Prime])[x] - e*F*x*\[Psi][x]);{psivals, psifuns} = NDEigensystem[{eqn2, DirichletCondition[[Psi][x] == 0, x [GreaterSlantEqual] L/2 || x <= -L/2]}, [Psi][x], {x, -L/2, L/2}, Ne, Method -> {"SpatialDiscretization" -> {"FiniteElement", \ {"MeshOptions" -> {MaxCellMeasure -> 10^-9}}}}];Etable = Table[(psivals + phivals[[j]])/(1.6*10^-22), {i, Ne}, {j, Ne}];Itable = Table[ Abs[NIntegrate[psifuns[]*phifuns[[j]], {x, -L/2, L/2}, Method -> {"ExtrapolatingOscillatory"}]], {i, Ne}, {j, Ne}];
L = 1000*10^-10; F = 10^7; m = 0.0665*9.1*10^-31; mhole = 0.34*9.1*10^-31; e = 1.6*10^-19; [HBar] = 1.05*10^-34; Ne = 199; eqn1 = (-(\[HBar]^2/(2 m))* (\[Phi]^\[Prime]\[Prime])[x] + e*F*x*\[Phi][x]); eqn2 = (-(\[HBar]^2/(2 mhole))* (\[Psi]^\[Prime]\[Prime])[x] - e*F*x*\[Psi][x]) {phivals, phifuns} = NDEigensystem[{eqn1, DirichletCondition[\[Phi][x] == 0, x \[GreaterSlantEqual] L/2 || x <= -L/2]}, \[Phi][x], {x, -L/2, L/2}, Ne, Method -> {"SpatialDiscretization" ->{"FiniteElement", {"MeshOptions" -> {MaxCellMeasure -> 10^-9}}}}]; {psivals, psifuns} = NDEigensystem[{eqn2, DirichletCondition[\[Psi][x] == 0, x \[GreaterSlantEqual] L/2 || x <= -L/2]}, \[Psi][x], {x, -L/2, L/2}, Ne, Method -> {"SpatialDiscretization" -> "FiniteElement", \{"MeshOptions" -> {MaxCellMeasure -> 10^-9}}}}];
既然phi和psi都已经计算出来(离散数据点),那么phi*psi也是确定的离散点,直接用梯形公式求解,当然这种精度也较低。可以采用样条插值增加点数,然后再计算积分,这样可以提高精度
1D的高度振荡的波函数的积分
mathematica
L = 1000*10^-10; F = 10^7; m = 0.0665*9.1*10^-31; mhole =
0.34*9.1*10^-31; e = 1.6*10^-19; \[HBar] = 1.05*10^-34; Ne = 199;eqn1 = (-(\[HBar]^2/(2 m))* (\[Phi]^\[Prime]\[Prime])[x] +
e*F*x*\[Phi][x]);{phivals, phifuns} =
NDEigensystem[{eqn1,
DirichletCondition[\[Phi][x] == 0,
x \[GreaterSlantEqual] L/2 || x <= -L/2]}, \[Phi][x], {x, -L/2,
L/2}, Ne,
Method -> {"SpatialDiscretization" -> {"FiniteElement", \
{"MeshOptions" -> {MaxCellMeasure -> 10^-9}}}}];eqn2 = (-(\[HBar]^2/(2 mhole))* (\[Psi]^\[Prime]\[Prime])[x] -
e*F*x*\[Psi][x]);{psivals, psifuns} = NDEigensystem[{eqn2, DirichletCondition[[Psi][x] == 0, x [GreaterSlantEqual] L/2 || x <= -L/2]}, [Psi][x], {x, -L/2, L/2}, Ne, Method -> {"SpatialDiscretization" -> {"FiniteElement", \ {"MeshOptions" -> {MaxCellMeasure -> 10^-9}}}}];Etable = Table[(psivals[] + phivals[[j]])/(1.6*10^-22), {i, Ne}, {j, Ne}];Itable = Table[ Abs[NIntegrate[psifuns[]*phifuns[[j]], {x, -L/2, L/2}, Method -> {"ExtrapolatingOscillatory"}]], {i, Ne}, {j, Ne}];,
L = 1000*10^-10; F = 10^7; m = 0.0665*9.1*10^-31; mhole =
0.34*9.1*10^-31; e = 1.6*10^-19; \[HBar] = 1.05*10^-34; Ne = 199;eqn1 = (-(\[HBar]^2/(2 m))* (\[Phi]^\[Prime]\[Prime])[x] +
e*F*x*\[Phi][x]);{phivals, phifuns} =
NDEigensystem[{eqn1,
DirichletCondition[\[Phi][x] == 0,
x \[GreaterSlantEqual] L/2 || x <= -L/2]}, \[Phi][x], {x, -L/2,
L/2}, Ne,
Method -> {"SpatialDiscretization" -> {"FiniteElement", \
{"MeshOptions" -> {MaxCellMeasure -> 10^-9}}}}];eqn2 = (-(\[HBar]^2/(2 mhole))* (\[Psi]^\[Prime]\[Prime])[x] -
e*F*x*\[Psi][x]);{psivals, psifuns} = NDEigensystem[{eqn2, DirichletCondition[[Psi][x] == 0, x [GreaterSlantEqual] L/2 || x <= -L/2]}, [Psi][x], {x, -L/2, L/2}, Ne, Method -> {"SpatialDiscretization" -> {"FiniteElement", \ {"MeshOptions" -> {MaxCellMeasure -> 10^-9}}}}];Etable = Table[(psivals + phivals[[j]])/(1.6*10^-22), {i, Ne}, {j, Ne}];Itable = Table[ Abs[NIntegrate[psifuns[]*phifuns[[j]], {x, -L/2, L/2}, Method -> {"ExtrapolatingOscillatory"}]], {i, Ne}, {j, Ne}];
L = 1000*10^-10; F = 10^7; m = 0.0665*9.1*10^-31; mhole = 0.34*9.1*10^-31; e = 1.6*10^-19; [HBar] = 1.05*10^-34; Ne = 199;
eqn1 = (-(\[HBar]^2/(2 m))* (\[Phi]^\[Prime]\[Prime])[x] + e*F*x*\[Phi][x]);
eqn2 = (-(\[HBar]^2/(2 mhole))* (\[Psi]^\[Prime]\[Prime])[x] - e*F*x*\[Psi][x])
{phivals, phifuns} = NDEigensystem[{eqn1, DirichletCondition[\[Phi][x] == 0, x \[GreaterSlantEqual] L/2 || x <= -L/2]}, \[Phi][x], {x, -L/2, L/2}, Ne, Method -> {"SpatialDiscretization" ->{"FiniteElement", {"MeshOptions" -> {MaxCellMeasure -> 10^-9}}}}];
{psivals, psifuns} = NDEigensystem[{eqn2, DirichletCondition[\[Psi][x] == 0, x \[GreaterSlantEqual] L/2 || x <= -L/2]}, \[Psi][x], {x, -L/2, L/2}, Ne, Method -> {"SpatialDiscretization" -> "FiniteElement", \{"MeshOptions" -> {MaxCellMeasure -> 10^-9}}}}];
既然phi和psi都已经计算出来(离散数据点),那么phi*psi也是确定的离散点,直接用梯形公式求解,当然这种精度也较低。可以采用样条插值增加点数,然后再计算积分,这样可以提高精度