2017-03-06 671 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