自Sympy
版本1.2起,python Sympy
已实现了在给定一些初始条件的情况下求解简单微分方程中常数的功能。我正在尝试测试此功能,但是不断收到我不知道如何解决的错误。
documentation表示初始条件的以下格式,我尝试遵循实现该功能的实际拉取请求中指定的格式。这是代码和错误。
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
答案 0 :(得分:1)
我不是sympy的重度用户,但我确实可以使用它-
问题是,当您定义x = sp.Function('x')(t)
时,您已经
参数t
传递给它,并且在该行不能再为其传递0
res = sp.dsolve(diffeq, t, ics={x(0): 0, sp.diff(x(t), t).subs(t,0): 0})
-
用{t)调用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
做dsolve会产生另一个错误。The docs告诉sympy应该能够正确地猜测它,所以我省略了它-只是找到了正确的论点,以后会有x(t)
)
这给了我res =
Eq(x(t), exp(t)/4 - cos(t)/2 + exp(-t)/4)