我正在尝试编写一个方程来建模,然后绘制一个积分控制系统(特别是关于巡航控制)。但是,每当我运行它时,我都会收到两个错误:
ValueError: object too deep for required array odepack.error: 函数调用的结果不是正确的浮点数组。
我读过这些问题:
- scipy curve_fit 错误:函数调用的结果不是正确的浮点数组
- 如何使用 scipy odeint 求解这个微分方程?
- 对象对于所需数组来说太深 - scipy.integrate.odeint
看起来它们应该会有所帮助,但是我不确定如何将它们应用于我的问题。我对 python 还很陌生,所以如果我错过了一些明显的事情或做了一些特别愚蠢的事情,请多多包涵。我对绘制它没有任何问题,所以一旦我弄清楚如何真正让它工作,我想我已经准备好了。
import numpy as np
import scipy.integrate as integrate
##Parameters
kp=.5 #proportional gain
ki=.1 #integral gain
vr=30 #desired velocity in m/s
Tm=190 #Max Torque in Nm
wm=420 #engine speed
B=0.4 #Beta
an=12 #at gear 4
p=1.3 #air density
Cd=0.32 #Drag coefficient
Cr=.01 #Coefficient of rolling friction
A=2.4 #frontal area
##Variables
m=18000 #weight
v=20 #starting velocity
time=np.linspace(0,10,50) #time
theta=np.radians(4) #Theta
def vderivs(state,t):
v = state
vel=[]
ti=0
while ti < t:
v1 = an*controller(ti,vr,v)*torque(v)
v2 = m*Cr*np.sign(v)
v3 = 0.5*p*Cd*A*v**2
v4 = m*np.sin(theta)
if t < 10:
vtot = v1+v2+v3
vfin = np.divide(vtot,m)
else:
vtot = v1+v2+v3+v4
vfin = np.divide(vtot,m)
vel.append(vfin)
ti+=1
trueVel = np.array(vel, float)
return trueVel
def uderivs(state,t):
v = state
deltax = vr - v
return deltax
def controller(time,desired,currentV):
z = integrate.odeint(uderivs, currentV, time)
u = kp*(vr-currentV)+ki*z
return u.flatten()
def torque(v):
return Tm*(1-B*(np.divide(an*v,wm)-1)**2)
def velocity(mass,desired,theta,t):
v = integrate.odeint(vderivs, desired, t)
return v.flatten()
test = velocity(m,vr,theta,time)
print(test)
请让我知道您是否还有其他需要我的东西!