想对自己定义的S函数做数值积分
mathematica吧
全部回复
仅看楼主
level 4
XzqQAQ 楼主
首先我定义了S函数,我想对w变量进行数值积分
S[w_, l_, m_, mi_, ma_] := {
so = NSolve[{r + 2 m*Log[r/(2 m) - 1] == mi}, r];
bd = r /. so;
sol =
NDSolve[{\[Phi]''[
s] + (w^2 - (R[s] - 2*m)/
R[s]*((l*(l + 1))/R[s]^2 + (2*m)/R[s]^3)) \[Phi][s] == 0,
R'[s] == 1 - (2*m)/R[s], \[Phi][mi] == 1, \[Phi]'[mi] == -I*w,
R[mi] == bd[[1]]}, {\[Phi], R}, {s, mi, ma}];
Pfun = \[Phi] /. sol[[1, 1]];
Rfun = R /. sol[[1, 2]];
Abs[Exp[-2*I*w*ma]*(I*w*Pfun[ma] + Pfun'[ma])/(
I*w*Pfun[ma] - Pfun'[ma])]
}
NIntegrate[S[x, 0, 1, -20, 20], {x, 0, 1}]
但是我发现NIntegrate先执行了S[x, 0, 1, -20, 20],然而x必须得先是个数,S函数才能正常出一个数。于是我就会有这样的报错:
NDSolve::ndinnt: 初始条件 (0. -1. I) x 不是一个数,也不是由数组成的矩形数组.
请问大佬们,我如何才能使用NIntegrate对我自己定义的S做数值积分?
2023年12月19日 03点12分 1
level 9
S[w_, l_, m_, mi_,
ma_] := (so = NSolve[{r + 2 m*Log[r/(2 m) - 1] == mi}, r];
bd = r /. so;
sol = NDSolve[{\[Phi]''[
s] + (w^2 - (R[s] - 2*m)/
R[s]*((l*(l + 1))/R[s]^2 + (2*m)/R[s]^3)) \[Phi][s] == 0,
R'[s] == 1 - (2*m)/R[s], \[Phi][mi] == 1, \[Phi]'[mi] == -I*w,
R[mi] == bd[[1]]}, {\[Phi], R}, {s, mi, ma}];
Pfun = \[Phi] /. sol[[1, 1]];
Rfun = R /. sol[[1, 2]];
Abs[Exp[-2*I*w*
ma]*(I*w*Pfun[ma] + Pfun'[ma])/(I*w*Pfun[ma] - Pfun'[ma])])
points =
Last@Reap[
Plot[S[x, 0, 1, -20, 20], {x, 0, 1},
EvaluationMonitor :> Sow[{x, S[x, 0, 1, -20, 20]}]]];
f = Interpolation[Flatten[points, 1]];
NIntegrate[f[x], {x, 0, 1}]
想到一种奇技淫巧,先取出图像上的散点,生成插值函数,对插值函数进行积分。这不是最好的方法,因为我不知道怎么针对报错修改
2023年12月19日 09点12分 2
感谢您,我后来也想到用插值了
2023年12月19日 11点12分
level 7
不用什么奇技淫巧,标准做法是定义函数的时候给参数加上?NumericQ(这里其他参数都是给定的,加到第一个参数上就行了),其次中间变量最好用Block包起来,你这种写法还会导致结果多一层{},这也是积不出来的原因之一
S[w_?NumericQ,l_,m_,mi_,ma_]:=Block[{so,bd,sol,Pfun,Rfun},so=NSolve[{r+2 m*Log[r/(2 m)-1]==mi},r];
bd=r/. so;
sol=NDSolve[{\[Phi]''[s]+(w^2-(R[s]-2*m)/R[s]*((l*(l+1))/R[s]^2+(2*m)/R[s]^3)) \[Phi][s]==0,R'[s]==1-(2*m)/R[s],\[Phi][mi]==1,\[Phi]'[mi]==-I*w,R[mi]==bd[[1]]},{\[Phi],R},{s,mi,ma}];
Pfun=\[Phi]/. sol[[1,1]];
Rfun=R/. sol[[1,2]];
Abs[Exp[-2*I*w*ma]*(I*w*Pfun[ma]+Pfun'[ma])/(I*w*Pfun[ma]-Pfun'[ma])]]
NIntegrate[S[x,0,1,-20,20],{x,0,1}]
2023年12月19日 10点12分 3
感谢您的教导,以后我写程序会注意
2023年12月19日 11点12分
1