Python 求解非线性微分方程

Python 求解非线性微分方程,python,numpy,sympy,Python,Numpy,Sympy,如果v(t)不是平方的,这个代码只适用于求解微分方程v_方程。当我将其平方时,它返回错误PolynomialDivisionFailed。使用Symphy还有其他方法吗?或者我应该找一个不同的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_inp

如果v(t)不是平方的,这个代码只适用于求解微分方程v_方程。当我将其平方时,它返回错误PolynomialDivisionFailed。使用Symphy还有其他方法吗?或者我应该找一个不同的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')

根据我使用符号数学软件包的经验,我不建议使用浮点常量执行(符号)计算。最好使用符号常量定义方程,尽可能执行计算,然后用数值代替

通过这种方法,Symphy可以为这种D.E.提供解决方案

首先,定义符号常量。为了帮助计算,请注意,我们可以提供有关这些常数的附加信息(例如,实值、正值、e.t.c)

DE的符号解如下所示

f1 = g * m
eq = f1 - k * (v(t) ** 2) - m * sp.Derivative(v(t))
sol = sp.dsolve(eq,v(t)).simplify()
解决方案
sol
将是
k
m
g
和常数
C1
的函数。通常,将有两个与初始条件相对应的复杂
C1
值。但是,当在
sol
中替换时,
C1
的两个值产生相同的(实值)解

请注意,如果不需要符号解,可以使用数值ODE解算器,例如Scipy的
odeint
。代码如下(对于初始条件
0
):


soln
是一个与
tn
元素相对应的样本数组
v(t)
,谢谢,这帮了大忙。此外,我是否能够使用scipy将微分方程的解作为函数返回?@KKlj8原则上,答案是否定的,scipy(和任何其他数值解算器)只能提供与自变量有限值集对应的函数样本。但是,您始终可以使用这组样本作为设置函数的基础,该函数通过以下方式为自变量的任何其他(任意)值提供值:
m
k
使用什么值?这对我在Symphy 1.0中的一些测试值是有效的。@asmurer我使用的是m=96和k=0.2。它对哪些值起作用?我明白了。这对我来说也是失败的。为此,我在一家报纸上发表了一篇文章。
f1 = g * m
eq = f1 - k * (v(t) ** 2) - m * sp.Derivative(v(t))
sol = sp.dsolve(eq,v(t)).simplify()
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))