【问题标题】:NDSolve inside NDSolve in MathematicaMathematica 中的 NDSolve 中的 NDSolve
【发布时间】: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 返回了一个列表.. (不过我没有尝试运行它。顺便说一下,您的模块缺少关闭 ],我'我假设一切都在模块中(?)。
  • 我添加了一个病理问题来突出这个问题。请调查一下。

标签: wolfram-mathematica


【解决方案1】:

我得到了你的简单示例来使用一个小模块..

 f0 = First@First@DSolve[{f'[y] == 2 y, f[0] == 0}, f, y]
 g0 = g /. 
     First@First@DSolve[{g'[x] == 2 (f[g[x]] /. f0), g[0] == 1}, g, x]
 fn = f /. First@First@NDSolve[{f'[y] == 2 y, f[0] == 0}, f, {y, 0, 10}]
 gn = g /. 
      First@First@
         NDSolve[{g'[x] == 2 (fn[g[x]]), g[0] == 1}, g, {x, 0, 9/20}]
 GraphicsRow[{
  Plot[{g0@x, gn@x}, {x, 0, 9/20}, 
       PlotStyle -> {{Thick, Black}, {Thin, Red, Dashed}}],
  Plot[{f@x /. f0, fn@x}, {x, 0, 2}, 
       PlotStyle -> {{Thick, Black}, {Thin, Red, Dashed}}]}]

请注意,我们需要确保第一个NDSolve 中的y 范围足以覆盖第二个g 的预期范围。这就是所有这些插值范围误差的来源。

【讨论】:

  • 感谢乔治的精彩回答!真的谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多