2017-03-06 673 views
1

我有一个方程dy/dx = x + y/5和一个初始值,y(0) = -3代表一个numpy的一阶微分方程

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

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

在此先感谢。

+0

你需要首先解决您的微分方程。 –

+0

看看是否有帮助:http://stackoverflow.com/questions/16001341/having-trouble-while-using-scipy-integrate-odeint-with-python –

回答

2

鉴于您需要解决d.e.你可能更喜欢用代数的方式来做这件事。 (或者你可能不会)。

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

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

调用解算器。请注意,d.e.的所有术语。必须转换到等号左边,并且该功能的指示符必须替换为

>>> dsolve(Derivative(f(x),x)-x-f(x)/5) 
Eq(f(x), (C1 + 5*(-x - 5)*exp(-x/5))*exp(x/5)) 

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

​​

现在我们创建一个表达式来表示这个任意常数作为我们可以求解的方程的左边。我们用其在初始条件下的值代替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 

(通常东西只有当我忘记检查它们不正确。生活就是这样。)

我还可以sympy绘制这一点。

>>> 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.

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