如何解决用SymPy求解微分方程组
我正在尝试求解从调谐质量阻尼器得到的微分方程组: https://en.wikipedia.org/wiki/Tuned_mass_damper。
我首先初始化所有需要的常量,变量和函数。
from sympy import *
m1,m2,c1,c2,k1,k2,F0,t,x10,x20 = symbols('m1 m2 c1 c2 k1 k2 F0 t x10 x20')
x1,x2 = symbols('x1 x2',cls=Function)
x1_ = x1(t).diff(t)
x1__ = x1_.diff(t)
x2_ = x2(t).diff(t)
x2__ = x2_.diff(t)
eq1 = Eq(m1*x1__ + c1*x1_ + k1*x1(t) - m2*x2__ - c2*x2_ - k2*x2(t) - F0)
eq2 = Eq(m2*x2__ + c2*x2_ + k1*x2(t))
pprint(eq1)
pprint(eq2)
打印:
2
d d d
-F₀ + c₁⋅──(x₁(t)) - c₂⋅──(x₂(t)) + k₁⋅x₁(t) - k₂⋅x₂(t) + m₁⋅───(x₁(t)) - m₂⋅─
dt dt 2
dt
2
d
── (x₂(t)) = 0
2
dt
2
d d
c₂⋅──(x₂(t)) + k₁⋅x₂(t) + m₂⋅───(x₂(t)) = 0
dt 2
dt
然后我尝试使用适当的初始条件将两个方程传递给dsolve sympy函数:
system = [eq1,eq2]
ics = {x1(0): x10,x2(0): x20}
solution = dsolve(system,(x1(t),x2(t)),ics=ics)
pprint(solution)
Traceback (most recent call last):
File "/Users/wyatt_blair/...",line 22,in <module>
solution = dsolve(system,ics=ics)
File "/Users/wyatt_blair/anaconda3/lib/python3.6/site-packages/sympy/solvers/ode.py",line 584,in dsolve
match = classify_sysode(eq,func)
File "/Users/wyatt_blair/anaconda3/lib/python3.6/site-packages/sympy/solvers/ode.py",line 1458,in classify_sysode
type_of_equation = check_linear_2eq_order2(eq,funcs,func_coef)
File "/Users/wyatt_blair/anaconda3/lib/python3.6/site-packages/sympy/solvers/ode.py",line 1568,in check_linear_2eq_order2
x = func[0].func
AttributeError: 'list' object has no attribute 'func'
我尝试在ode.py中打印变量func
,发现它是:[[x1(t),x2(t)]]
。
似乎ode.py期望func
看起来像这样:[x1(t),x2(t)]
。如果我更改ode.py中的两个有问题的行,但失败了:
x = func[0][0].func
y = func[0][1].func
我得到一个ImplementationError
,这很奇怪,因为这个方程看起来像SymPy可以处理的,因为它不太疯狂。
我误传了x1(t)
和x2(t)
吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。