用numpy表示一阶微分方程

用numpy表示一阶微分方程,numpy,matplotlib,derivative,Numpy,Matplotlib,Derivative,我有一个方程和一个初始值,y(0)=-3 我想知道如何使用pyplot绘制此函数的精确图形 我还有一个x=np.linspace(0,interval,steps+1),我想用它作为x轴。所以我只寻找y轴的值 提前谢谢。考虑到你需要解d.e.你可能更喜欢用代数方法,用sympy。(或许你不会。) 导入模块并定义函数和因变量 >>> from sympy import * >>> f = Function('f') >>> var('x') x

我有一个方程和一个初始值,
y(0)=-3

我想知道如何使用pyplot绘制此函数的精确图形

我还有一个
x=np.linspace(0,interval,steps+1)
,我想用它作为x轴。所以我只寻找y轴的值


提前谢谢。

考虑到你需要解d.e.你可能更喜欢用代数方法,用sympy。(或许你不会。)

导入模块并定义函数和因变量

>>> from sympy import *
>>> f = Function('f')
>>> var('x')
x
>>> var('C1')
C1
调用解算器。请注意,d.e.的所有术语必须转置到等号的左侧,y必须替换为该函数的指示符

>>> dsolve(Derivative(f(x),x)-x-f(x)/5)
Eq(f(x), (C1 + 5*(-x - 5)*exp(-x/5))*exp(x/5))
正如您所期望的,解是以任意常数的形式给出的。我们必须使用初始值来解决这个问题。我们把它定义为一个sympy变量

>>> from sympy import *
>>> f = Function('f')
>>> var('x')
x
>>> var('C1')
C1
现在我们创建一个表达式,将这个任意常数表示为我们可以求解的方程的左侧。我们用它在初始条件下的值替换f(0)。然后我们在该条件下替换x的值,得到C1中的方程

换句话说,C1=22。最后,我们可以利用这个值得到微分方程的特解

>>> ((C1 + 5*(-x - 5)*exp(-x/5))*exp(x/5)).subs(C1,22)
((-5*x - 25)*exp(-x/5) + 22)*exp(x/5)
因为我心不在焉,并且害怕犯惊人的错误,所以我检查这个函数是否满足初始条件

>>> (((-5*x - 25)*exp(-x/5) + 22)*exp(x/5)).subs(x,0)
-3
(通常情况下,只有当我忘记检查时,事情才会出错。这就是生活。)

我也可以用sympy来描绘

>>> plot(((-5*x - 25)*exp(-x/5) + 22)*exp(x/5),(x,-1,5))
<sympy.plotting.plot.Plot object at 0x0000000008C2F780>
>>绘图((-5*x-25)*exp(-x/5)+22)*exp(x/5)、(x,-1,5))

为了完整起见,这类方程可以使用
scipy.integrate.odeint
轻松地进行数值积分

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt

# function dy/dx = x + y/5.
func = lambda y,x : x + y/5.
# Initial condition
y0 = -3  # at x=0
# values at which to compute the solution (needs to start at x=0)
x = np.linspace(0, 4, 101)
# solution
y = odeint(func, y0, x)
# plot the solution, note that y is a column vector
plt.plot(x, y[:,0])
plt.xlabel('x')
plt.ylabel('y')
plt.show()

您需要先解微分方程。看看这是否有帮助: