代码之家  ›  专栏  ›  技术社区  ›  Seward Hercules

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

  •  0
  • Seward Hercules  · 技术社区  · 7 年前

    我设法计算了常数,但我不知道如何交换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 回复  |  直到 7 年前
        1
  •  2
  •   user6655984 user6655984    7 年前

    替换可以通过 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)
    

    但是如果您使用 current master branch of SymPy 来自GitHub,其中初始和边界条件 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)
    

    答案同上,

    等式(x(t),g*m*t/K-g*m**2/K**2+g*m**2*exp(-K*t/m)/K**2)
    
    推荐文章