如果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')
答案 0 :(得分:4)
根据我对符号数学包的经验,我不建议使用浮点常量执行(符号)计算。最好使用符号常量定义方程式,尽可能地执行计算,然后用数值替换。
通过这种方法,Sympy可以为这个D.E.提供解决方案。
首先,定义符号常量。为了帮助计算,请注意我们可以提供有关这些常量的其他信息(例如,真实,正面,e.t.c)
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
将是k
,m
,g
和常量C1
的函数。通常,将有两个复杂的C1
值对应于初始条件。但是,在C1
中替换时,sol
的两个值都会生成相同的(实值)解决方案。
请注意,如果您不需要符号解决方案,则可以使用数字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
是与v(t)
元素对应的样本数组tn