在NDSolve中调用含参变量的NIntegrate
mathematica吧
全部回复
仅看楼主
level 8
Repentanze 楼主
我简化一下我的问题:
我定义了一个含参的数值积分函数
f[R_]:=NIntegrate[R,{r,0,10}]
然后我希望在NDSolve中调用它
sol=NDSolve[{a'[t]==f[t],a[0]==1},{a},{t,0,1}]
然而此时会报错NIntegrate::inumr。我明白问题出现的原因,但是我不知道怎么解决。
注:两个函数都是well-defined,我在这里简化了一下。
2023年03月22日 11点03分 1
level 8
Repentanze 楼主
自我回复:
我没有找到直接的解决方案,但是我用一个间接的方法实现了我的目标。
方案是使用插值函数:
List1 = Table[f[i], {i, 0, 30, 1];
f1 = ListInterpolation[List1, {{0, 30}}];
sol=NDSolve[{a'[t]==f1[t],a[0]==1},{a},{t,0,1}];
其中的f1是使用插值函数得到的数值函数,因此可以在ndsolve中使用。
2023年03月24日 10点03分 3
吧务
level 12
报错是NIntegrate得到非数值结果,出现原因是R作为符号而非数值被传入,解决方法很简单,给f添加一个NumericQ判断即可
ClearAll[f];
f[R_?NumericQ] := NIntegrate[R, {r, 0, 10}]
sol = NDSolve[{a'[t] == f[t], a[0] == 1}, {a}, {t, 0, 1}]
另:在NDSolve中调用NIntegrate的时间开销可能会非常大,所以你的间接解决方案在某种意义上其实是更好的方案,只要注意取点够密让插值函数误差不要太大就可以
2023年03月24日 12点03分 4
我之前试过没成功,现在发现是我里面嵌套的函数忘了跟着一起改了。多谢
2023年03月29日 10点03分
1