簡體   English   中英

解非線性微分方程對稱

[英]Solving Non-Linear Differential Equation Sympy

如果v(t)不平方,則此代碼僅適用於求解微分方程v_equation。 當我平方時,它返回錯誤PolynomialDivisionFailed。 還有另一種使用Sympy進行此操作的方法,還是應該找一個不同的python軟件包來進行這類計算。

from sympy import *
from matplotlib import pyplot as plt
import numpy as np

m = float(raw_input('Mass:\n> '))
g = 9.8
k = float(raw_input('Drag Coefficient:\n> '))
f1 = g * m
t = Symbol('t')
v = Function('v')
v_equation = dsolve(f1 - k * (v(t) ** 2) - m * Derivative(v(t)), 0)
C1 = Symbol('C1')
C1_ic = solve(v_equation.rhs.subs({t:0}),C1)[0]
v_equation = v_equation.subs({C1:C1_ic})

func = lambdify(t, v_equation.rhs,'numpy')

根據我使用符號數學包的經驗,我不建議使用浮點常量執行(符號)計算。 最好使用符號常量定義方程,盡可能執行計算,然后用數值代替。

通過這種方法,Sympy可以為此DE提供解決方案

首先,定義符號常量。 為了幫助計算,請注意,我們可以提供有關這些常數的其他信息(例如,實數,正數等)

import sympy as sp

t = sp.symbols('t', real = True)
g, k, m = sp.symbols('g, k, m', real = True, positive = True)
v = sp.Function('v')

DE的符號解可以如下獲得

f1 = g * m
eq = f1 - k * (v(t) ** 2) - m * sp.Derivative(v(t))
sol = sp.dsolve(eq,v(t)).simplify()

sol將是kmg和常數C1的函數。 通常,將有兩個與初始條件相對應的復雜C1值。 但是,當替換為sol時, C1兩個值都導致相同(實值)的解決方案。

注意,如果不需要符號解,則可以使用數字ODE求解器,例如Scipy的odeint 代碼如下(對於初始條件0 ):

from scipy.integrate import odeint

def fun(v, t, m, k, g):
    return (g*m - k*v**2)/m

tn = np.linspace(0, 10, 101)
soln = odeint(fun, 0, tn, args=(1000, 0.2, 9.8))

soln是對應於tn元素的樣本v(t)的數組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM