【发布时间】:2014-06-21 12:45:06
【问题描述】:
我需要使用 NDSolve,它又使用另一个 ODE 的解作为另一个 NDSolve 的输出的函数。
如果我使用 NDSolve 中一阶微分方程的精确解,就可以了。但是当我以函数的形式(使用 InterpolatingFunction)使用相同的解决方案时,它不起作用。
我相信,这与 NDSolve 输出的结构有关。任何人都可以请教我。会有很大帮助!
代码是:
feq = 2 V alpha fip F''[fi] - (V^2 - (V^2 + sigma - 2 fi) (F'[fi])^2 + (F'[fi])^4
Frange[lo_, hi_] :=
Module[{fii, sol},
sol = NDSolve[{(feq == 0 /.fi -> fii), F[0] == 0}, F, {fii, lo, hi}]]
eqpois = fi''[x] == ne[x] - F[fi[x]]/.sol
NDSolve[{eqpois, fi'[0] == 0, fi[0] == 0}, fi, {x,0,1}]
这里为了找到 F[phi],我需要求解第一个 diff eq 即 feq,它由函数 Frange[lo,hi] 中的 NDSolve 求解。然后在第二个方程 eqpois 中使用该解,该方程必须再次使用 NDSolve 求解.问题出现在第二个 NDSolve 中,它不会产生结果。如果我在eqopis中使用Fφ的解析解,那就没有问题了。
示例问题
我对此做了一个小实验。让我们以耦合 ODE 为例
1st eqn : dg/dx = 2f(g) 初始条件为g(0) = 1
函数f(y) 是另一个ODE 的解,比如说,
2nd eqn : df/dy = 2y带ICf(0) = 0
第二个 ODE 的解是f(y) = y^2,当放入第一个 ODE 时变成
dg/dx = 2 g^2 最终解决方案是g(x) = 1/(1-2x)
问题:
当我使用 DSolve 时,它会正确找到答案
In[39]:= s = DSolve[{f'[y] == 2 y, f[0] == 0}, f, y]
Out[39]= {{f -> Function[{y}, y^2]}}
In[40]:= ss = DSolve[{g'[x] == 2 (f[g[x]]/.First@s), g[0] == 1}, g, x]
Out[40]= {{g -> Function[{y}, 1/(1 - 2 x)]}}
当我使用 NDSolve 时问题来了
In[41]:= s = NDSolve[{f'[y] == 2 y, f[0] == 0}, f, {y, 1, 5}]
Out[41]= {{f -> InterpolatingFunction[{{1., 5.}}, <>]}}
In[42]:= ss1 = NDSolve[{g'[x] == 2 (Evaluate[f[g[x]]/.First@s1]), g[0] == 1}, g, {x, 1, 2}]
Out[42]= {}
错误是:
在评估 In[41]:= InterpolatingFunction::dmval 期间:输入值 {2.01726} 位于插值函数的数据范围之外。将使用外推法。 >>
在评估 In[41]:= InterpolatingFunction::dmval 期间:输入值 {2.01726} 位于插值函数的数据范围之外。将使用外推法。 >>
在计算 In[41]:= InterpolatingFunction::dmval 期间:输入值 {2.04914} 位于插值函数中的数据范围之外。将使用外推法。 >>
在计算 In[41]:= General::stop 期间:在此计算期间将抑制 InterpolatingFunction::dmval 的进一步输出。 >>
在 In[41]:= NDSolve::ndsz 求值期间:在 y == 0.16666654771477857 处,步长实际上为零;怀疑是奇点或僵硬系统。 >>
在 In[41]:= NDSolve::ndsz 求值期间:在 y == 0.16666654771477857 处,步长实际上为零;怀疑是奇点或僵硬系统。 >>
我们将非常感谢您在这方面的任何帮助!
--- 马杜尔贾
【问题讨论】:
-
没有代码很难猜出你在做什么
-
对不起乔治!代码已添加。
-
try:
eqpois = (fi''[x] == ne[x] - F[fi[x]])/.First@sol我怀疑问题是NDsolve返回了一个列表.. (不过我没有尝试运行它。顺便说一下,您的模块缺少关闭],我'我假设一切都在模块中(?)。 -
我添加了一个病理问题来突出这个问题。请调查一下。