【问题标题】:Sympy not solving linear ODEsSympy 不解决线性 ODE
【发布时间】:2021-11-25 19:18:40
【问题描述】:

我正在尝试解决一些非常基本的 ODE 系统:

t = symbols("t")
x, y = symbols("x y", cls=Function)
a = dsolve_system([
  Eq(y(t).diff(t), 1),
  Eq(x(t).diff(t), 1),
])

输出:

[[Eq(x(t), C1 + Integral(1, t)), Eq(y(t), C2 + Integral(1, t))]]

我期待像 x(t) = C1 + t 和 y(t) = C2 + t 这样的东西,但由于某种原因,积分没有得到解决。

当我试图提供初始条件时:

t = symbols("t")
x, y = symbols("x y", cls=Function)
a = dsolve_system([
  Eq(y(t).diff(t), 1),
  Eq(x(t).diff(t), 1),
], ics={x(0): 1, y(0): 2})

程序刚刚出错:

NotAlgebraic                              Traceback (most recent call last)
<ipython-input-38-86edc5171650> in <module>()
      4   Eq(y(t).diff(t), 1),
      5   Eq(x(t).diff(t), 1),
----> 6 ], ics={x(0): 1, y(0): 2})
      7 a

14 frames
/usr/local/lib/python3.7/dist-packages/sympy/polys/numberfields.py in _minpoly_compose(ex, x, dom)
    583         res = _minpoly_rootof(ex, x)
    584     else:
--> 585         raise NotAlgebraic("%s doesn't seem to be an algebraic element" % ex)
    586     return res
    587 

NotAlgebraic: Integral(1, (t, 0)) doesn't seem to be an algebraic element

【问题讨论】:

    标签: python sympy ode


    【解决方案1】:

    dsolve_system 和 dsolve(内部调用 dsolve_system)之间的一个区别是,在 dsolve_system 中,除非您通过 doit=True,否则不会自动计算积分:

    In [16]: dsolve_system(eqs)
    Out[16]: 
    ⎡⎡            ⌠                   ⌠     ⎤⎤
    ⎢⎢y(t) = C₁ + ⎮ 1 dt, x(t) = C₂ + ⎮ 1 dt⎥⎥
    ⎣⎣            ⌡                   ⌡     ⎦⎦
    
    In [17]: dsolve_system(eqs, doit=True)
    Out[17]: [[y(t) = C₁ + t, x(t) = C₂ + t]]
    

    在这种情况下,它并没有太大区别,但在一般情况下,积分的计算可能比其他计算慢很多,因此在调用 dsolve_system 时默认情况下不会这样做。

    您也可以自己致电doit 来评估积分:

    In [18]: [[sol1, sol2]] = dsolve_system(eqs)
    
    In [19]: sol1
    Out[19]: 
                ⌠     
    y(t) = C₁ + ⎮ 1 dt
                ⌡     
    
    In [20]: sol1.doit()
    Out[20]: y(t) = C₁ + t
    

    dsolve_system 和 ics 参数的问题在于未计算的积分如何在内部处理。 dsolve 没有发现该错误,因为它总是计算积分。

    【讨论】:

    【解决方案2】:

    对于以后遇到此问题的任何人,以下是我的解决方法:

    我没有使用dsolve_system,而是使用了dsolve。无论出于何种原因,dsolve 不会产生那些奇怪的Integral(1,t)。但是,提供初始条件仍然会出错。因此,我使用solve 手动解决了C1 和C2。我不确定我的方法有多强大,但至少它们是有效的:

    t = symbols("t")
    x, y = symbols("x y", cls=Function)
    
    solutions = dsolve([
      Eq(x(t).diff(t), 1),
      Eq(y(t).diff(t), 1),
    ])
    C1, C2 = symbols("C1 C2")
    initial_conditions = solve([
      Eq(3, solutions[0].rhs.subs(t, 0)), # 3 == the first function evaluated at t = 0
      Eq(5, solutions[1].rhs.subs(t, 0)), # 5 == the second function evaluated at t = 0
    ])
    solutions = [
      solutions[0].subs(C1, initial_conditions[C1]).subs(C2, initial_conditions[C2]),
      solutions[1].subs(C1, initial_conditions[C1]).subs(C2, initial_conditions[C2]),
    ]
    solutions
    

    输出:

    [Eq(x(t), t + 3), Eq(y(t), t + 5)]
    

    不过,如果您知道我最初做错了什么,或者为什么在致电 dsolve 时无法提供初始条件,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多