繁体   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