我不知道這個問題是否已經在SO之前問過了,我會繼續並將它發佈在這裏,我試圖用一個PID來解決一個簡單的系統控制器,我的微分方程系統如下。我基本上試圖編寫非常基本的PID算法。我的控制結構u依賴於誤差項的導數和積分。我對衍生術語沒有任何問題,它是在我的代碼中創建問題的積分術語。如果我在開頭 中指定s = 0,並在我的函數中使用它(如我的代碼中所述),該問題就會出現。有沒有辦法繞過它?我試着將s分配給全局變量,但它並沒有解決我的問題。簡而言之,我所做的是 - 我每次都添加狀態x1並乘以dt(用t表示)。Python:如何求解一個具有積分項的常微分方程
請幫我化解這個問題,PFA我的代碼附後。
import numpy as np
from scipy.integrate import ode
import matplotlib.pyplot as plt
plt.style.use('bmh')
t0=0
y0=[0.1,0.2]
kp,kd,ki=2,0.5,0.8
s,told=0,0
def pid(t,Y):
x1,x2=Y[0],Y[1]
e=x1-1
de=x2
s=(x1+s)
integral=s*(t-told)
told=t
#ie=
u=kp*e+kd*de+ki*integral
x1dot=x2
x2dot=u-5*x1-2*x2
return[x1dot,x2dot]
solver=ode(pid).set_integrator('dopri5',rtol=1e-6,method='bdf',nsteps=1e5,max_step=1e-3)
solver.set_initial_value(y0,t0)
t1=10
dt=5e-3
sol = [ [yy] for yy in y0 ]
t=[t0]
while solver.successful() and solver.t<t1:
solver.integrate(solver.t+dt)
for k in range(2): sol[k].append(solver.y[k]);
t.append(solver.t)
print(len(sol[0]))
print(len(t))
x1=np.array(sol[0])
x2=np.array(sol[1])
e=x1-1
de=x2
u=kp*e+kd*de
for k in range(2):
if k==0:
plt.subplot(2,1,k+1)
plt.plot(t,sol[k],label='x1')
plt.plot(t,sol[k+1],label='x2')
plt.legend(loc='lower right')
else:
plt.subplot(2,1,k+1)
plt.plot(t,u)
plt.show()
究竟是什麼問題?你描述你試圖做的事情,但不是你確切的問題。也許包括控制檯的一些輸出? – SBylemans
確切的問題是 - 文件「pid。py「,第14行,在pid中 s =(x1 + s) UnboundLocalError:在賦值之前引用的局部變量's' –
問題是在定義中使用s,但這是該函數中的局部變量。不是使用你之前定義的s。 – SBylemans