在二阶微分方程中代入常数

Substitute a constant in a differential equation of second order

我设法计算了常量,但我不知道如何交换 C1 中的常量。有人可以帮忙吗? :)

import sympy as sym
x, g, K, m, t = sym.symbols('x, g, K, m, t', positive=True, real=True)
dxx = sym.Eq(x(t).diff(t, 2), g - K/m*x(t).diff(t))
rešitev = sym.dsolve(dxx) 
y_res = rešitev.args[1] 
C2_enačba = sym.Eq(sym.diff(y_res.subs(x, 0), t), 0)
C2 = sym.solve(C2_enačba, 'C2')
display(C2)
C1_subs = y_res.subs(x, 0)
C1_enačba = sym.Eq(C1_subs, 0)
C1 = sym.solve(C1_enačba, 'C1') 
display(C1)

替换可以用subs:

rešitev.subs({sym.Symbol('C1'): C1[0], sym.Symbol('C2'): C2[0]})

但是,您找到常量的过程不正确;您可以看到 "constants" 包含变量 t。这是因为公式中混淆了 x 和 t。这是更正后的版本:

import sympy as sym
x, g, K, m, t = sym.symbols('x, g, K, m, t', positive=True, real=True)
dxx = sym.Eq(x(t).diff(t, 2), g - K/m*x(t).diff(t))
rešitev = sym.dsolve(dxx) 
y_res = rešitev.args[1] 
C2_enačba = sym.Eq(sym.diff(y_res, t).subs(t, 0), 0)   # derivative at 0 is 0
C2 = sym.solve(C2_enačba, 'C2')
C1_subs = y_res.subs(t, 0)                           
C1_enačba = sym.Eq(C1_subs, 0)                         # the value at 0 is 0
C1 = sym.solve(C1_enačba, 'C1') 
answer = rešitev.subs({sym.Symbol('C1'): C1[0], sym.Symbol('C2'): C2[0]})

答案是

Eq(x(t), g*m*t/K - g*m**2/K**2 + g*m**2*exp(-K*t/m)/K**2)

但是如果您使用 GitHub 中的 current master branch of SymPy,您的代码可能会简单得多,其中实现了 dsolve 中的初始条件和边界条件。

import sympy as sym
x, g, K, m, t = sym.symbols('x, g, K, m, t', positive=True, real=True)
dxx = sym.Eq(x(t).diff(t, 2), g - K/m*x(t).diff(t))
ics = {x(0): 0, x(t).diff(t).subs(t, 0): 0}
answer = sym.dsolve(dxx, ics=ics)

答案同上,

Eq(x(t), g*m*t/K - g*m**2/K**2 + g*m**2*exp(-K*t/m)/K**2)