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



我设法计算常量,但我不知道如何在 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]})

但是,您找到常量的过程不正确;您可以看到"常量"包含变量 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 中 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)

最新更新