首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python ode一阶,如何使用Sympy解决这个问题

Python ode一阶,如何使用Sympy解决这个问题
EN

Stack Overflow用户
提问于 2017-02-04 16:43:02
回答 1查看 257关注 0票数 0

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

代码语言:javascript
代码运行次数:0
运行
复制
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))

它给出了这个错误:

代码语言:javascript
代码运行次数:0
运行
复制
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'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-04 18:48:13

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

在循环中进行评估,

代码语言:javascript
代码运行次数:0
运行
复制
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")并使用

代码语言:javascript
代码运行次数:0
运行
复制
    ode_sol= psol.subs([(C1, sympy.solve(csol)[0])]);

但这仍然让人感觉很老套。或者更好地避免第二种情况的不可解性的错误消息:

代码语言:javascript
代码运行次数: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))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42038324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档