level 6
薛定谔那只该死的喵嗷
楼主
我需要求一个积分,积分中有一个函数YO[x],YO函数为YO[x_] = Sum[E^(((I*h*Pi)/(\[Lambda]*f))*x^2)*Subscript[Y, h][x, z = 13.5], {h, -5, -1}] /. S(其中Subscript [Y,h][x,z]是偏微分方程的一个解)。我在{x,0,30}x的正向区间运行了一下YO[3],发现可以得到具体的值。在这之后我需要把只包含x正方向函数的YO拓展到{x,-30,30},负区间上函数值和正区间的值是对称的。所以我手动定义了一个分段函数,用Piecewise和If函数都试了一下,将函数YO[x]在负区间时的值等于YO[Abs[x]],但是我发现计算后运行YO[3]得不到具体的数值,只能返回YO[3]本身。
基于以上情况,我用未拓展的YO进行积分是可以的,但是如果我用Piecewise或If函数拓展后的YO进行积分就会报错:对于采样点在某一处是非数值的。同时我对积分的结果进行寻找最大值点时也会报错,不管是拓展前的YO还是未拓展的YO进行积分后的函数,都会报错: 显示函数值不是一个实数,但是我的函数值是取模后平方的数值,肯定是一个实数,这些天找了好久的相关知识也没有解决掉,所以想请教一下大家我的程序是哪里出了问题。
另外我对未拓展的函数YO[x]直接进行积分是可以得到具体的数值的,但是用Piecewise和If拓展过后的函数YO[x]进行积分就得不到具体的数值了,只能得到含有Subscript [Y,h]的函数式。
以下是我的代码:
ClearAll["Global`*"];
\[Theta] = 0;
\[Lambda] = 1.2398/(19.5*10^3);
f = 4.72*10^3;
Subscript[\[Delta], 1] = 1.274/10^6;
Subscript[\[Delta], 2] = 4.304/10^6;
Subscript[bt, 1] = 5.254/10^9;
Subscript[bt, 2] = 2.435/10^7;
\[Chi]1 = -2*Subscript[\[Delta], 1] + 2*I*Subscript[bt, 1];
\[Chi]2 = -2*Subscript[\[Delta], 2] + 2*I*Subscript[bt, 2];
\[CapitalDelta]\[Chi] = \[Chi]1 - \[Chi]2;
k = 2*(Pi/\[Lambda]);
Table[\[Beta][
b] = -((2*(b*x)*Sin[\[Theta]])/f) - ((b*x)/f)^2, {b, -5, 5}];
Table[\[Chi][
a] = (\[CapitalDelta]\[Chi]*(1 - (-1)^Abs[a]))/(2*I*a*
Pi), {a, -10, -1}];
Table[\[Chi][
a] = (\[CapitalDelta]\[Chi]*(1 - (-1)^Abs[a]))/(2*I*a*Pi), {a, 1,
10}];
Table[\[Chi][a] = (\[Chi]1 + \[Chi]2)/2, {a, 0, 0}];
eqns = Join[
Table[(Sin[\[Theta]] + (h*x)/f)*D[Subscript[Y, h][x, z], x] +
Cos[\[Theta]]*D[Subscript[Y, h][x, z], z] ==
((I*Pi)*(\[Beta][h]*Subscript[Y, h][x, z] +
Sum[\[Chi][h - l]*Subscript[Y, l][x, z],
{l, -5, 5}]))/\[Lambda], {h, -5, 5}],
Table[Subscript[Y, h][x, 0] == If[h == 0, 1, 0],
{h, -5, 5}]];
s = NDSolve[eqns,
Table[Subscript[Y, h][x, z], {h, -5, 5}], {x, 0, 30}, {z, 0, 30},
Method -> {"MethodOfLines",
"SpatialDiscretization" -> {"TensorProductGrid",
"MaxPoints" -> 100, "MinPoints" -> 100,
"DifferenceOrder" -> 4},
"TemporalVariable" -> z}];
(************************在这之前的代码都是没有问题的,已经经过了验证**************************)
\
(*分段函数*)
YO[(x_)?NumericQ] := Piecewise[
{{Sum[
E^(((I*h*Pi)/(\[Lambda]*f))*x^2)*
Subscript[Y, h][x, z = 13.5], {h, -5, -1}],
20 >= x >= 0}, {Sum[
E^(((I*h*Pi)/(\[Lambda]*f))*x^2)*
Subscript[Y, h][Abs[x], z = 13.5],
{h, -5, -1}],
Inequality[0, Greater, x, GreaterEqual, -20]}}, {x, -20, 20}]/.s;
(*未分段的函数*)
(*YO[x_] = Sum[E^(((I*h*Pi)/(\[Lambda]*f))*x^2)*Subscript[Y, h][x, z \
= 13.5], {h, -5, -1}] /. s;*)
f1[(xo_)?NumericQ, (zo_)?NumericQ] :=
NIntegrate[(E^(I*k*zo)*YO[x]*E^(((I*k)*x^2)/(2*zo))*
E^(((I*k)*xo^2)/(2*zo)))/
E^(((I*k)*x*xo)/zo)/(I*\[Lambda]*zo^0.5), {x, -20, 20}] /.
s;
g[(xo_)?NumericQ, (zo_)?NumericQ] := Abs[f1[xo, zo]^2];
FindArgMax[{g[xo, zo], -20 <= xo <= 20 && 3000 <= zo <= 5000}, {{xo,
0}, {zo, 4000}}]
DensityPlot[g[xo, zo], {xo, -20, 20}, {zo, 3000, 5000},
PlotLegends -> Automatic]
2021年01月08日 06点01分
1
基于以上情况,我用未拓展的YO进行积分是可以的,但是如果我用Piecewise或If函数拓展后的YO进行积分就会报错:对于采样点在某一处是非数值的。同时我对积分的结果进行寻找最大值点时也会报错,不管是拓展前的YO还是未拓展的YO进行积分后的函数,都会报错: 显示函数值不是一个实数,但是我的函数值是取模后平方的数值,肯定是一个实数,这些天找了好久的相关知识也没有解决掉,所以想请教一下大家我的程序是哪里出了问题。
另外我对未拓展的函数YO[x]直接进行积分是可以得到具体的数值的,但是用Piecewise和If拓展过后的函数YO[x]进行积分就得不到具体的数值了,只能得到含有Subscript [Y,h]的函数式。
以下是我的代码:
ClearAll["Global`*"];
\[Theta] = 0;
\[Lambda] = 1.2398/(19.5*10^3);
f = 4.72*10^3;
Subscript[\[Delta], 1] = 1.274/10^6;
Subscript[\[Delta], 2] = 4.304/10^6;
Subscript[bt, 1] = 5.254/10^9;
Subscript[bt, 2] = 2.435/10^7;
\[Chi]1 = -2*Subscript[\[Delta], 1] + 2*I*Subscript[bt, 1];
\[Chi]2 = -2*Subscript[\[Delta], 2] + 2*I*Subscript[bt, 2];
\[CapitalDelta]\[Chi] = \[Chi]1 - \[Chi]2;
k = 2*(Pi/\[Lambda]);
Table[\[Beta][
b] = -((2*(b*x)*Sin[\[Theta]])/f) - ((b*x)/f)^2, {b, -5, 5}];
Table[\[Chi][
a] = (\[CapitalDelta]\[Chi]*(1 - (-1)^Abs[a]))/(2*I*a*
Pi), {a, -10, -1}];
Table[\[Chi][
a] = (\[CapitalDelta]\[Chi]*(1 - (-1)^Abs[a]))/(2*I*a*Pi), {a, 1,
10}];
Table[\[Chi][a] = (\[Chi]1 + \[Chi]2)/2, {a, 0, 0}];
eqns = Join[
Table[(Sin[\[Theta]] + (h*x)/f)*D[Subscript[Y, h][x, z], x] +
Cos[\[Theta]]*D[Subscript[Y, h][x, z], z] ==
((I*Pi)*(\[Beta][h]*Subscript[Y, h][x, z] +
Sum[\[Chi][h - l]*Subscript[Y, l][x, z],
{l, -5, 5}]))/\[Lambda], {h, -5, 5}],
Table[Subscript[Y, h][x, 0] == If[h == 0, 1, 0],
{h, -5, 5}]];
s = NDSolve[eqns,
Table[Subscript[Y, h][x, z], {h, -5, 5}], {x, 0, 30}, {z, 0, 30},
Method -> {"MethodOfLines",
"SpatialDiscretization" -> {"TensorProductGrid",
"MaxPoints" -> 100, "MinPoints" -> 100,
"DifferenceOrder" -> 4},
"TemporalVariable" -> z}];
(************************在这之前的代码都是没有问题的,已经经过了验证**************************)
\
(*分段函数*)
YO[(x_)?NumericQ] := Piecewise[
{{Sum[
E^(((I*h*Pi)/(\[Lambda]*f))*x^2)*
Subscript[Y, h][x, z = 13.5], {h, -5, -1}],
20 >= x >= 0}, {Sum[
E^(((I*h*Pi)/(\[Lambda]*f))*x^2)*
Subscript[Y, h][Abs[x], z = 13.5],
{h, -5, -1}],
Inequality[0, Greater, x, GreaterEqual, -20]}}, {x, -20, 20}]/.s;
(*未分段的函数*)
(*YO[x_] = Sum[E^(((I*h*Pi)/(\[Lambda]*f))*x^2)*Subscript[Y, h][x, z \
= 13.5], {h, -5, -1}] /. s;*)
f1[(xo_)?NumericQ, (zo_)?NumericQ] :=
NIntegrate[(E^(I*k*zo)*YO[x]*E^(((I*k)*x^2)/(2*zo))*
E^(((I*k)*xo^2)/(2*zo)))/
E^(((I*k)*x*xo)/zo)/(I*\[Lambda]*zo^0.5), {x, -20, 20}] /.
s;
g[(xo_)?NumericQ, (zo_)?NumericQ] := Abs[f1[xo, zo]^2];
FindArgMax[{g[xo, zo], -20 <= xo <= 20 && 3000 <= zo <= 5000}, {{xo,
0}, {zo, 4000}}]
DensityPlot[g[xo, zo], {xo, -20, 20}, {zo, 3000, 5000},
PlotLegends -> Automatic]

