首页 > 解决方案 > Sympy:求解具有初始条件误差的微分方程

问题描述

Sympy1.2 版开始,pythonSympy已经实现了在给定一些初始条件的情况下求解简单微分方程中的常数的能力。我试图测试此功能,但不断收到我不知道如何解决的错误。

文档指出了初始条件的以下格式,我尝试遵循实现该功能的实际拉取请求中指定的内容。这是代码和错误。

import sympy as sp

t = sp.symbols('t')
x = sp.Function('x')(t)

diffeq = sp.Eq(x.diff(t,t) - x, sp.cos(t))
res = sp.dsolve(diffeq, t, ics={x(0): 0, 
                            x.diff(t).subs(t, 0): 0})

错误是:

Traceback (most recent call last):

  File "<ipython-input-20-75c3e1d53138>", line 1, in <module>
    res = sp.dsolve(diffeq, t, ics={x(0): 0, sp.diff(x(t), t).subs(t,0): 0})

TypeError: 'x' object is not callable

标签: pythonsympydifferential-equations

解决方案


我不是 sympy 的重度用户,但我得到了它的工作 - 问题是当你定义时x = sp.Function('x')(t)你已经得到了t它的参数,并且不能再0在行中传递它 - with (t)res = sp.dsolve(diffeq, t, ics={x(0): 0, sp.diff(x(t), t).subs(t,0): 0})的调用使得x它是一个“定义的函数”。

所以,x作为一个未定义的函数,只t在创建微分方程时需要的点传递它是要走的路:


import sympy as sp

t = sp.symbols('t')
x = sp.Function('x')

diffeq = sp.Eq(x(t).diff(t, t) - x(t), sp.cos(t)) 
res = sp.dsolve(diffeq, ics={x(0): 0, sp.diff(x(t), t).subs(t,0): 0})

(另外,尝试传入t第二个参数 do dsolve 会产生另一个错误。文档告诉 sympy 应该能够正确猜测它,所以我把它省略了 - 只是为了找到正确的参数,x(t)稍后会出现)

这给了我 res =

Eq(x(t), exp(t)/4 - cos(t)/2 + exp(-t)/4)

推荐阅读