Python ode第一顺序,如何使用Sympy来解决这个问题

时间:2017-02-04 08:43:02

标签: ode

当我尝试使用Sympy来解决第一个颂歌时,如下所示:

import sympy
y = sympy.Function('y')
t = sympy.Symbol('t')

ode = sympy.Eq(y(t).diff(t),(1/y(t))*sympy.sin(t))
sol = sympy.dsolve(ode,y(t))
csol=sol.subs([(t,0),(y(0),-4)]) # the I.C. is y(0) = 1
ode_sol= sol.subs([(csol.rhs,csol.lhs)])
print(sympy.pprint(ode_sol))

它给了我这个错误:

Traceback (most recent call last):
File "C:/Users/Mohammed Alotaibi/AppData/Local/Programs/Python/Python35/ODE2.py", line 26, in <module>
csol=sol.subs([(t,0),(y(0),-4)]) # the I.C. is y(0) = 1
AttributeError: 'list' object has no attribute 'subs'

1 个答案:

答案 0 :(得分:1)

您的问题是此ODE没有唯一的解决方案。因此,它返回一个解决方案列表,您可以从错误消息中找到并打印sol

循环评估,

for psol in sol:
    csol = psol.subs([(t,0),(y(0),-4)]);
    ode_sol = psol.subs([(csol.rhs,csol.lhs)]);
    print(sympy.pprint(ode_sol))

找到下一个错误,替换不解决常量。有效的是定义C1=sympy.Symbol("C1")和使用

    ode_sol= psol.subs([(C1, sympy.solve(csol)[0])]);

但是这仍然感觉很难过。或者更好地避免第二种情况不可解决的错误消息:

C1=sympy.Symbol("C1");
for psol in sol:
    csol = psol.subs([(t,0),(y(0),-4)]);
    for cc1 in sympy.solve(csol):
        ode_sol= psol.subs([(C1, cc1)]);
        print(sympy.pprint(ode_sol))