[英]How to solve a Second order and Second Degree Differential Equation ( in python )?
[英]Second order differential numerically with python
我想使用Python
而不使用內置函數來計算二階微分方程,但是結果僅對一階方程是正確的。
讓我給你一個例子(插圖沒有聲譽!-為了更好的方程式外觀)
dy/dt = -ky
並使用導數的基本定義
f'(x)= h ->0 (f(x+h)-f(x))/h
我們可以寫出k = 0.3的基本python代碼
def first_order(dt):
t = np.arange(0, 20, dt)
k = 0.3
y = np.zeros(len(t))
y[0] = 5
for i in range(1, len(t)):
y[i] = - k* y[i - 1] * dt + y[i-1]
return t, y
這樣做很好,但是當我嘗試計算相應的方程式時:
dp^2/dx^2 = (p- p0)/L
使用: f''(x)= h ->0 (f(x+h)-2f(x)+ f(xh)/h^2
二階導數方程的初始條件是p(0) = 10^14
, p0 = 10^13
, L = 10 ^-6
和p(infinity) = p0
,第二個條件可能使它出錯。
我試圖以簡單的方式解決此問題-與以前類似
def diffusion_lenght(dt):
p0 = 10 ** 13 # initial state
t = np.arange(0, 20, dt)
p = np.zeros(len(t))
L = 1 * 10 ** -6
p[0] = 10 ** 14
p[len(t)-1] = p0
for i in range(1, len(t)):
p[i] = (2* p[i-1]- p[i-2]- p0 * dt ** 2 / L) / (1 - dt ** 2 / L)
print(p)
return t, p
但是結果不正確。 它應該使我與x
呈指數遞減,但我得到的直線收斂到dt
值。
如果您不介意的話,我幾年前就這樣做了,我為它准備了一些小腳本,因此我將為您提供代碼,而不是在您的代碼中發現錯誤。
我認為它非常清楚明確。
import numpy as np
class dif_eq(object):
def __init__(self):
pass
def ft4(self,dt,u,x1_before,x2_before,x3_before,x4_before,functionn):
x1_now = x1_before + dt * x2_before
x2_now = x2_before + dt * x3_before
x3_now = x3_before + dt * x4_before
x4_now = x4_before + dt * functionn(u,x1_before,x2_before,x3_before,x4_before)
vals = [x1_now,x2_now,x3_now,x4_now]
return vals
def ft3(self,dt,u,x1_before,x2_before,x3_before,functionn):
x1_now = x1_before + dt * x2_before
x2_now = x2_before + dt * x3_before
x3_now = x3_before + dt*functionn(u,x1_before,x2_before,x3_before)
vals = [x1_now,x2_now,x3_now]
return vals
def ft2(self,dt,u,x1_before,x2_before,functionn):
x1_now = x1_before + dt * x2_before
x2_now = x2_before+ dt * functionn(u,x1_before,x2_before)
vals = [x1_now,x2_now]
return vals
def ft1(self,dt,u,x1_before,functionn):
x1_now = x1_before + dt*functionn(u,x1_before)
vals = [x1_now]
return vals
使用示例:
"""
def order3equation(u,b,c,a): # Your differential equations
y=u-b*2-c*2.5-a*3.6 #+ noise*np.random.rand()/5
return y
def order1equation.....
....
return y
d=dif_eq()
val=[0] # init for 1order
val3=[0,0,0] # init for 3order
dt=0.05
result1order=[]
result3order=[]
for i in range(100):
val=d.ft1(dt,u,val[0],order1equation)
result1order.append(val[0])
for i in range(1000):
val3=d.ft3(dt,u,val3[0],val3[1],val3[2],order3equation)
result3order.append(val3[0])
"""
valx / vals是導數的實際值。 第一次傳遞初始值,但隨后將函數實際返回的值傳遞給函數。
工作示例-不穩定的系統
u = 1 # input/impulse or whatever name it is
d=dif_eq()
val3=[0,0,0]
dt=0.05
zz=[]
def my3(u, b, c, a):
y = u - b * 1 - c * 1 - a *1
return y
for i in range(1000):
val3=d.ft3(dt,u,val3[0],val3[1],val3[2],my3)
zz.append(val3[0])
from matplotlib.pyplot import *
plot(zz)
show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.