【问题标题】:How to solve pair of nonlinear differential equations using Sympy如何使用 Sympy 求解一对非线性微分方程
【发布时间】:2017-05-29 16:10:16
【问题描述】:

我有一个由两个耦合非线性微分方程组成的系统

为此,我编写了以下代码来使用 Sympy 获取两个函数的值:

from sympy import *
t = symbols('t')
c, b, B, alp, mu = symbols('c b B alp mu', integer=True)
f, g = symbols('f g', cls=Function)
print(solve([Eq(f(t).diff(t)+c*f(t)+0.5*B*f(t)**2-b*g(t), 0), Eq(g(t).diff(t)+b*g(t)-c*f(t), (1-alp)*mu)], [f(t),g(t)]))

但是,我得到的结果仍然是导数形式,不能用于我的目的。我也尝试过 Mathematica,但它继续无限期地运行而没有结果。 有人可以建议使用 Sympy 或 Mathematica 的此类系统的解决方案吗?

【问题讨论】:

  • 您能否提供数学格式的 ode 以及其他信息?
  • 提供您的 Mathematica 代码。
  • 添加方程。我现在无法访问 Mathematica,因此无法提供。

标签: python-2.7 wolfram-mathematica sympy nonlinear-functions


【解决方案1】:

您可以使用 ParametricNDSolve 允许稍后确定任意数量的参数。然后使用 Manipulate 进行探索。这是示例代码:

{fx, gx} = Block[ {f, g, c, \[Beta], b, \[Alpha], \[Mu], f0, g0, tmax},
   {f, g} /. ParametricNDSolve[ {
      f'[t] + c f[t] + 0.5 \[Beta] f[t]^2 - b g[t] == 0,
      g'[t] + b g[t] - c f[t] - (1 - \[Alpha]) \[Mu] == 0,
      f[0] == f0, g[0] == g0
      }, {f, g}, {t, tmax}, {c, \[Beta], b, \[Alpha], \[Mu], f0, g0, 
      tmax} ]
   ];
Manipulate[
 ParametricPlot[ {fx[c, \[Beta], b, \[Alpha], \[Mu], f0, g0, 2^
     ln2tmax][t], 
   gx[c, \[Beta], b, \[Alpha], \[Mu], f0, g0, 2^ln2tmax][t]},
  {t, 0, 2^ln2tmax} ],
 {{c, 1}, -1, 1, 0.05},
 {{\[Beta], 1}, -1, 1, 0.05},
 {{b, 1}, -1, 1, 0.05},
 {{\[Alpha], 1}, -1, 1, 0.05},
 {{\[Mu], 1}, -1, 1, 0.05},
 Delimiter,
 {{f0, 1}, -1, 1, 0.05},
 {{g0, 1}, -1, 1, 0.05},
 Delimiter,
 {{ln2tmax, 0}, -3, 10, 0.5}
 ]

【讨论】:

    【解决方案2】:

    您可以在 Mathematica 中非常轻松地解决您的系统问题,NDSolve 为您提供数值解决方案。但为此,您需要指定参数的数值和两个初始条件。这里我选择随机的。

      ClearAll["Gobal"]
    Eq1 = f'[t] + c1*f[t] + 0.5*B1*f[t]^2 - b1*g[t] == 0;
    Eq2 = g'[t] + b1*g[t] - c1*f[t] == (1 - alp)*mu;
    ibcs = {f[0] == 1, g[0] == 0};
    sys = Join[{Eq1, Eq2}, ibcs];
    B1 = 1; b1 = 1; c1 = 1; alp = 1; mu = 1;
    sol1 = NDSolve[sys, {f[t], g[t]}, {t, 0, 10}];
    Plot[{f[t], g[t]} /. sol1, {t, 0, 10}]
    

    【讨论】:

    • 谢谢,但是否有可能以隐式解析方程而不是绘图的形式获得输出?
    • @Ashish 我无法为这个非线性耦合系统生成解析解。
    • 到目前为止相同。我添加了 Mathematica 实现并发表了评论。
    • @Ashish 为什么不用数值解?
    • 因为它是解析方程的一部分,因此必须与数值解进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多