我有一个简单的二阶 ODE 的齐次解,当我尝试使用 Sympy 求解初始值时,它返回相同的解。它应该替代 y(0) 和 y'(0) 并产生一个没有常数的解,但事实并非如此。这是建立方程的代码(它是一个弹簧平衡方程,k = 弹簧常数,m = 质量)。我在其他地方使用了一些多余的符号,抱歉。
%matplotlib inline
from sympy import *
m,k, x,t,s,T, omega,A,B = symbols('m k x t s T omega A B',float=True)
a = symbols('a', positive=True)
f,y,g,H,delta,S=symbols('f y g H delta S',cls=Function)
Eq1 = Eq(m*diff(y(t),t,2)+k*y(t))
Eq1
结果是(正确):
$y{\left (t \right )} = C_{1} e^{- t \sqrt{- \frac{k}{m}}} + C_{2} e^{t \sqrt{- \frac {k}{m}}}$
y(t)=C1e^(−t√(−k/m))+C2e^(t√(−km)),也有 y_n = c1.cos(√(−k/m)t)+c2 .sin(√(−k/m)t)。
当对该方程进行解析求解,并使用正弦和余弦将其转换为 omega = sqrt(-k/m) 的解时,则 c1 = y(0) 且 c2 = y'(0)/omega。因此,虽然解部分涉及复数,但 dsolve 当然只是返回原始齐次方程,如上所述。我计算 y(0) 和 y'(0) 处 ODE 的代码是:
Eq1_soln_IVP =dsolve(Eq1,y(t),x0=0, ics={y(0): a, y(t).diff(t).subs(t, 0): a})
我知道 dsolve 可能根本无法分析地处理这个 IVP,但如果这是基于它的其他能力,我会感到惊讶。对于如何解决这个问题以及其他分析二阶问题的任何帮助将不胜感激。问题的核心在于:
ics={y(0): a, y(t).diff(t).subs(t, 0): a}
所以我尝试的解决方案(迪特里希也证实了这一点)是:
#Create IVP for y(0)
expr = Eq(Eq1_soln_IVP.rhs.subs(sqrt(-k/m),I*omega),y(0))
#Create IVP for y'(0)
expr2 = Eq(diff(y(t),t).subs(t,0),expr.lhs.diff(t))
#Maps all free variables and solves for each where t = 0.
solve([expr.subs(t,0),expr2.subs(t,0)])
虽然它是“一个”解决方案,但这似乎是一种非常复杂的查找 y(t) = y(0)cos(omega*t - phi) 的方法...它回答了有关该求解器和直接求解器的一些限制的隐含问题关于 ics arg 如何解决的问题。谢谢。