0

我正在用 Sympy 解决 ODE。方程是

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

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 的结果?

4

2 回答 2

1

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

from sympy import *
from numpy import *

这两个库定义了许多具有相同名称的函数,将它们混合在一起会导致问题。为了清楚起见,最好执行以下操作:

import sympy as sym
import numpy as np

如果您为除要绘制的符号之外的所有符号(即x在此示例中)提供数字,则只能绘制 sympy 表达式。这意味着您需要有一个具体的积分常数值C1。您可以通过将初始条件 ( ics) 参数赋予dsolve. 此外,由于dsolve返回一个方程,您需要选择方程的一侧作为要绘制的表达式。完成后,该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>

解图

于 2022-02-02T22:20:52.700 回答
1

如果您想同时显示多个值的解决方案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()

sympy 将多个解决方案一起绘制

于 2022-02-02T22:40:27.793 回答