2017-09-03 52 views
-2

我写了一个简单的python代码来模拟自适应模糊滑模控制。我的问题是不管我做什么,我得到这个错误。我试图将列表转换为数组等,但没有效果。请帮我解决这个问题。我试图做的是,我创建了一个返回53个元素的函数,然后scipy的ode方法将它整合。Python:ValueError:使用序列设置数组元素。解决简单问题时出错

这是我的代码。 PFA-

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.integrate import ode 
from numpy import exp,sin,cos,concatenate,transpose,pi,tanh 
from mpl_toolkits.mplot3d import Axes3D 

c,eta,k,gamma1,gamma2,gamma3,gamma4,gamma5,gamma21,gamma22,gamma23,gamma24,gamma25=2,1.5,2,1,2,3,4,5,6,7,8,9,10 
x=np.linspace(0,10,100) 
xdot=np.linspace(0,10,100) 
def member(x,z): 
    return exp(-((x+z)/(pi/24))**2) 
m=[] 
b=[pi/6,pi/12,0,-pi/12,-pi/6] 

def f(t,Y): 
    x1,x2,x3,eta1,eta2,eta3,eta4,eta5,eta6,eta7,eta8,eta9,eta10,eta11,eta12,eta13,eta14,eta15,eta16,eta17,eta18,eta19,eta20,eta21,eta22,eta23,eta24,eta25,geta1,geta2,geta3,geta4,geta5,geta6,geta7,geta8,geta9,geta10,geta11,geta12,geta13,geta14,geta15,geta16,geta17,geta18,geta19,geta20,geta21,geta22,geta23,geta24,geta25=Y 
    eta=np.array([eta1,eta2,eta3,eta4,eta5,eta6,eta7,eta8,eta9,eta10,eta11,eta12,eta13,eta14,eta15,eta16,eta17,eta18,eta19,eta20,eta21,eta22,eta23,eta24,eta25]) 
    geta=np.array([geta1,geta2,geta3,geta4,geta5,geta6,geta7,geta8,geta9,geta10,geta11,geta12,geta13,geta14,geta15,geta16,geta17,geta18,geta19,geta20,geta21,geta22,geta23,geta24,geta25]) 
    m,z=[],[] 
    for i in range(5): 
     for j in range(5): 
      m.append(member(x1,b[i])*member(x2,b[j])) 
    for i in range(25): 
     z.append(m[i]/sum(m)) 
    z=np.array(z) 
    e,de=x1-sin(t),x2-cos(t) 
    s=de+c**2*x3+2*c*e 
    f=np.dot(eta,z) 
    g=np.dot(geta,z) 
    u=(1./g)*(-f-c**2*e-2*c*de-sin(t)-eta*tanh(s)-k*s) 
    x1dot=x2 
    x2dot=f+g*u 
    x3dot=e 
    eta1dot,eta2dot,eta3dot,eta4dot,eta5dot,eta6dot,eta7dot,eta8dot,eta9dot,eta10dot,eta11dot,eta12dot,eta13dot,eta14dot,eta15dot,eta16dot,eta17dot,eta18dot,eta19dot,eta20dot,eta21dot,eta22dot,eta23dot,eta24dot,eta25dot,geta1dot,geta2dot,geta3dot,geta4dot,geta5dot,geta6dot,geta7dot,geta8dot,geta9dot,geta10dot,geta11dot,geta12dot,geta13dot,geta14dot,geta15dot,geta16dot,geta17dot,geta18dot,geta19dot,geta20dot,geta21dot,geta22dot,geta23dot,geta24dot,geta25dot=-2*s*z[0],-2*s*z[1],-2*s*z[2],-2*s*z[3],-2*s*z[4],-2*s*z[5],-2*s*z[6],-2*s*z[7],-2*s*z[8],-2*s*z[9],-2*s*z[10],-2*s*z[11],-2*s*z[12],-2*s*z[13],-2*s*z[14],-2*s*z[15],-2*s*z[16],-2*s*z[17],-2*s*z[18],-2*s*z[19],-2*s*z[20],-2*s*z[21],-2*s*z[22],-2*s*z[23],-2*s*z[24],-3*s*z[0]*u,-3*s*z[1]*u,-3*s*z[2]*u,-3*s*z[3]*u,-3*s*z[4]*u,-3*s*z[5]*u,-3*s*z[6]*u,-3*s*z[7]*u,-3*s*z[8]*u,-3*s*z[9]*u,-3*s*z[10]*u,-3*s*z[11]*u,-3*s*z[12]*u,-3*s*z[13]*u,-3*s*z[14]*u,-3*s*z[15]*u,-3*s*z[16]*u,-3*s*z[17]*u,-3*s*z[18]*u,-3*s*z[19]*u,-3*s*z[20]*u,-3*s*z[21]*u,-3*s*z[22]*u,-3*s*z[23]*u,-3*s*z[24]*u 
    return[x1dot,x2dot,x3dot,eta1dot,eta2dot,eta3dot,eta4dot,eta5dot,eta6dot,eta7dot,eta8dot,eta9dot,eta10dot,eta11dot,eta12dot,eta13dot,eta14dot,eta15dot,eta16dot,eta17dot,eta18dot,eta19dot,eta20dot,eta21dot,eta22dot,eta23dot,eta24dot,eta25dot,geta1dot,geta2dot,geta3dot,geta4dot,geta5dot,geta6dot,geta7dot,geta8dot,geta9dot,geta10dot,geta11dot,geta12dot,geta13dot,geta14dot,geta15dot,geta16dot,geta17dot,geta18dot,geta19dot,geta20dot,geta21dot,geta22dot,geta23dot,geta24dot,geta25dot] 
Y,t=[],[] 
for i in range(50): 
    Y.append(0.1) 
#Y=np.array(Y) 
y0=[0,0,0] 
y0=y0+Y 
t0=0 
def int_amar(): 
    t1,dt=10,.01 
    x=[] 
    for i in range(53): 
     x.append([]) 
    #import pdb; pdb.set_trace() 
    odee=ode(f).set_integrator('dopri5',method='bdf',nsteps=1e6) 
    odee.set_initial_value(y0,t0) 
    while odee.successful() and odee.t<t1: 
     odee.integrate(odee.t+dt) 
     for i in range(53): 
      x[i].append(odee.y[i]) 
     t.append(odee.t) 
    #for i in range(53): 
    # x[i]=np.array(x[i]) 


    print(x1.shape) 
    return x 

def main(): 
    fun=int_amar() 
    Z,f,g,m=[[],[],[],[],[]],[],[],[] 
    for i in range(5): 
     for j in range(5): 
      m.append(member(fun[0],b[i])*member(fun[1],b[j])) 
    for i in range(25): 
     Z[i].append(m[i]/sum(m)) 


    zetta1,zetta2,zetta3,zetta4,zetta5,zetta6,zetta7,zetta8,zetta9,zetta10,zetta11,zetta12,zetta13,zetta14,zetta15,zetta16,zetta17,zetta18,zetta19,zetta20,zetta21,zetta22,zetta23,zetta24,zetta25=Z[0],Z[1],Z[2],Z[3],Z[4],Z[5],Z[6],Z[7],Z[8],Z[9],Z[10],Z[11],Z[12],Z[13],Z[14],Z[15],Z[16],Z[17],Z[18],Z[19],Z[20],Z[21],Z[22],Z[23],Z[24],Z[25] 
    e=fun[0]-sin(t) 
    s=fun[1]+c**2*fun[2]+2*c*e 

    for i in range(len(fun[2])): 
     f.append(np.dot(np.array([[fun[3][i],fun[4][i],fun[5][i],fun[6][i],fun[7][i],fun[8][i],fun[9][i],fun[10][i],fun[11][i],fun[12][i],fun[13][i],fun[14][i],fun[15][i],fun[16][i],fun[17][i],fun[18][i],fun[19][i],fun[20][i],fun[21][i],fun[22][i],fun[23][i],fun[24][i],fun[25][i],fun[26][i],fun[27][i]]]),np.array([[zetta1[i]],[zetta2[i]],[zetta3[i]],[zetta4[i]],[zetta5[i]],[zetta6[i]],[zetta7[i]],[zetta8[i]],[zetta9[i]],[zetta10[i]],[zetta11[i]],[zetta12[i]],[zetta13[i]],[zetta14[i]],[zetta15[i]],[zetta16[i]],[zetta17[i]],[zetta18[i]],[zetta19[i]],[zetta20[i]],[zetta21[i]],[zetta22[i]],[zetta23[i]],[zetta24[i]],[zetta25[i]]]))) 
     g.append(np.dot(np.array([[fun[28][i],fun[29][i],fun[30][i],fun[31][i],fun[32][i],fun[33][i],fun[34][i],fun[35][i],fun[36][i],fun[37][i],fun[38][i],fun[39][i],fun[40][i],fun[41][i],fun[42][i],fun[43][i],fun[44][i],fun[45][i],fun[46][i],fun[47][i],fun[48][i],fun[49][i],fun[50][i],fun[51][i],fun[52][i]]]),np.array([[zetta1[i]],[zetta2[i]],[zetta3[i]],[zetta4[i]],[zetta5[i]],[zetta6[i]],[zetta7[i]],[zetta8[i]],[zetta9[i]],[zetta10[i]],[zetta11[i]],[zetta12[i]],[zetta13[i]],[zetta14[i]],[zetta15[i]],[zetta16[i]],[zetta17[i]],[zetta18[i]],[zetta19[i]],[zetta20[i]],[zetta21[i]],[zetta22[i]],[zetta23[i]],[zetta24[i]],[zetta25[i]]]))) 


    f,g=np.array(f),np.array(g) 
    u=(1./g)*(-f-c*e-sin(t)-eta*tanh(s)-k*s) 
    print(u.shape) 
    for i in range(12): 
     plt.subplot(3,4,i+1) 
     plt.plot(t,fun[i]) 
    #plt.figure(2) 
    #plt.plot(t,u) 
    plt.show() 
if __name__=='__main__': 
    main() 
+4

你应该看看[问]和[MCVE]。 – pvg

+0

如果你在np.array中有单个元组,那么你应该使用([括号来代替([[ –

+2

这段代码是非常可写的,请将它重构为一个可以被其他人阅读的表单) –

回答

1

的问题是,在第30行:

u=(1./g)*(-f-c**2*e-2*c*de-sin(t)-eta*tanh(s)-k*s)

eta是一个数组,但条款的其余部分是标量。这会导致u成为一个数组,并且返回列表结合了标量和数组。

您可能在此输入了错误的等式。

+0

哦,天哪!该死的你是对的!这是一个错字,说实话,与tanh的eta应该只是一个标量= 1.5,而在我的代码中,它将它视为一个数组,我猜! –

相关问题