Sympy 用情节解决

Sympy dsolve with plots

我正在使用 Sympy 求解 ODE。等式是

ODE

为了解决这个问题,我使用了这个小代码,returns 这个结果。

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


x = symbols('x')
y = Function('y')


f = y(x)
print(f)

edo = Eq(f.diff()+3*x**2*f, 6*x**2)
print(edo)

edoSolve = dsolve(edo, f)
print(edoSolve)

C1*exp(-x**3) + 2

我的问题是,如何绘制 x 范围为 0 到 10 的结果?

首先将这两行结合起来是有问题的:

from sympy import *
from numpy import *

这两个库定义了许多同名的函数,将它们混在一起会导致问题。为了清楚起见,最好做类似的事情:

import sympy as sym
import numpy as np

如果您为除了要绘制的符号之外的所有符号都给出数字,则只能绘制一个 sympy 表达式(即本例中的 x)。这意味着您需要为积分常数 C1 提供一个具体值。你可以通过给 dsolve 一个初始条件 (ics) 参数来得到它。此外,由于 dsolve returns 方程式,您需要选择方程式的一侧作为要绘制的表达式。完成后 sym.plot 函数将完全按照您的要求执行:

In [10]: import sympy as sym

In [11]: sol = sym.dsolve(edo, f, ics={f.subs(x, 0): 1})

In [12]: sol
Out[12]: 
              3
            -x 
y(x) = 2 - ℯ   

In [13]: sym.plot(sol.rhs, (x, 0, 10))
Out[13]: <sympy.plotting.plot.Plot at 0x7f346de1caf0>

如果您想一起显示 C1 的多个值的解决方案,您可以附加图:

from sympy import symbols, Function, Eq, dsolve, plot

x = symbols('x')
y = Function('y')
f = y(x)

edo = Eq(f.diff() + 3 * x ** 2 * f, 6 * x ** 2)

edoSolve = dsolve(edo, f)

plot1 = plot(show=False)
for c1 in range(-5, 6):
    plotc1 = plot(edoSolve.subs('C1', c1).rhs, (x, 0, 10), show=False)
    plot1.append(plotc1[0])
plot1.show()