用二阶微分方程代替常数

时间:2018-01-05 23:26:43

标签: sympy differential-equations

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

1 个答案:

答案 0 :(得分:2)

可以使用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中的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)