如何用Sympy求解一对非线性微分方程

时间:2017-01-14 10:33:38

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

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

我为此编写了以下代码,以使用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,但它一直无限运行,没有结果。 enter image description here 有人可以使用Sympy或Mathematica为这样的系统建议解决方案吗?

2 个答案:

答案 0 :(得分:0)

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

  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}]

enter image description here

答案 1 :(得分:0)

您可以使用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}
 ]