SymPy求解二阶常微分方程组IVP代入初始条件报错如何解决
错误原因
dsolve的ics参数要求传入单个包含所有初始条件的字典,不支持传入字典列表。你之前将两个函数的初始条件拆分到两个字典再封装为列表传入,才触发了list没有items方法的报错。
修改方案
把两个初始条件字典合并为单个字典,直接传给ics参数即可,修改后的代码如下:
from sympy import * import numpy as np import matplotlib.pyplot as plt x1,x2 = symbols('x1,x2', cls=Function) t, k1, k2, m1, m2 = symbols('t k1 k2 m1 m2', real=True) k1 = 1.0 k2 = 1.0 m1 = 1.0 m2 = 1.0 eq1 = Eq(m1*diff(x1(t), t, 2) + k1*x1(t) - k2*(x2(t)-x1(t)), 0) eq2 = Eq(m2*diff(x2(t), t, 2) + k2*(x2(t)-x1(t)), 0) eqs = [eq1, eq2] # 合并所有初始条件到单个字典 ics = { x1(0): 0, diff(x1(t), t).subs(t, 0): 0, x2(0): 1, diff(x2(t), t).subs(t, 0): 0 } sol = dsolve(eqs, [x1(t), x2(t)], ics=ics) print(sol)
运行输出
[Eq(x1(t), -0.223606797749979*sin(0.618033988749895*t) + 0.223606797749979*sin(1.61803398874989*t)), Eq(x2(t), 0.723606797749979*cos(0.618033988749895*t) + 0.276393202250021*cos(1.61803398874989*t))]
如果需要保留符号形式不代入k、m的数值,删掉给k1、k2、m1、m2赋浮点值的四行代码即可,dsolve会直接返回含参数的符号解析解。
内容的提问来源于stack exchange,提问作者Staffan Lundberg
相关产品推荐
相关产品推荐

