代表numpy中的一阶微分方程

时间:2017-03-06 15:37:28

标签: numpy matplotlib derivative

我有一个等式dy/dx = x + y/5和一个初始值y(0) = -3

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

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

提前致谢。

2 个答案:

答案 0 :(得分:3)

为了完整起见,可以使用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()

enter image description here

答案 1 :(得分:2)

鉴于你需要解决d.e.你可能更愿意用代数来代数做这个。 (或者你可能不会。)

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

>>> from sympy import *
>>> f = Function('f')
>>> var('x')
x

调用解算器。注意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))

正如您所料,解决方案是根据任意常数给出的。我们必须使用初始值来解决这个问题。我们将其定义为一个同情变量。

>>> var('C1')
C1

现在我们创建一个表达式来表示这个任意常量,作为我们可以求解的等式的左侧。我们将 f(0)替换为初始条件下的值。然后我们在该条件下替换 x 的值来得到 C1 中的等式。

>>> expr = -3 - ( (C1 + 5*(-x - 5)*exp(-x/5))*exp(x/5) )
>>> expr.subs(x,0)
-C1 + 22

换句话说,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

(通常只有当我忘记检查它们时才会出错。这就是生活。)

我也可以同情地描绘这一点。

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

solution to d.e.