我正在用 Python 编写下面的代码来模拟控制系统。但是,当我调试代码时,我面临以下问题:
matmul:输入操作数 1 没有足够的维度(有 0,gufunc 核心,签名为 (n?,k),(k,m?) ->(n?,m?) 需要 1) 文件“D:\Área de Trabalho\GitHub\TCC\Códigos Marcela\SistemaSISO_tres_estados_new.py”,第 110 行,位于 un[i]= α + beta@vn[i] ValueError: matmul: 输入操作数 1 没有足够的维度(有 0,带有签名 (n?,k),(k,m?)->(n?,m?) 的 gufunc 核心需要 1)
您可以吗请帮我解决这个问题??
import numpy as np
from numpy import cos,sin
import matplotlib.pyplot as plt
import control.matlab as mat
from scipy.linalg import solve_continuous_are as arec
plt.close('all')
#Vetor Tempo ---------------------------------------------------
inter =20#tempo de simulação
T = 0.05#frequencia de simulação
t = np.arange(0,4*inter,T)
#Ganho estático ------------------------------------------------
A=np.array([[0,1,0],
[0,0,1],
[0,0,0],
])
B=np.array([[0],
[0],
[1],
])
# K= mat.place(A,B,[-10,-9,-28])
ep=3
K= mat.place(A,B,[-1.0253*ep,-0.3830*ep,-1.1998*ep])
print(K)
#Constantes do modelo -------------------------------------------
Mg = 0.88
I1 = 6.8e-2
I2 = 2e-2
B1_psi = 6e-3
B1_phi = 1e-1
Kgy = 0.05
K1 = 1.1
K2 = 0.8
T11 = 1.1
T10 = 1
T21 = 1
T20 = 1
Kc = -0.2
a1 = 0.0135
b1 = 0.0924
a2 = 0.02
b2 = 0.09
#Setpoint ------------------------------------------------------
SetPoint = np.ones((3,len(t))) #pré alocando o vetor de setpoint
h0 = [0.1, 0.32, -0.15, -0.15 ]
h1 = [0.05, 0.1, 0.02, -0.1]
c1 = 3
SetPoint[0,:] = SetPoint[0,:]*h0[0]
SetPoint[1,:] = SetPoint[1,:]*0
for k in range(len(t)):
for i in range(1,len(h0)):
SetPoint[0,k] += (h0[i] - h0[i-1] )/( 1 + np.exp(-c1*(t[k] - inter*i - 0.1 )) )
SetPoint[2,:] = (-b1 + np.sqrt(b1**2 + 4*a1*Mg*np.sin(SetPoint[0,:])))/(2*a1)
# Pré alocação dos vetores do sistema =============================
# Sistema Nominal ------------------------------------------------
xn = np.zeros((3,len(t))) #pré alocando o vetor de estados
un = np.zeros(len(t)) #pré alocando o vetor de sinal de controle não linear
vn = np.zeros(len(t)) #pré alocando o vetor de sinal linear
en= np.zeros((3,1)) #pré alocando o vetor de erro
# Condições Iniciais----------------------------------------------
xn[0,0]=0.1
xn[1,0]=0
xn[2,0]=0
# # Outras definições
# iF = 1.4 # iF = 0.9 deixa o sistema incerto instável quando não tem saturação no sinal de controle
# iG1 = 1
# iG2 = 1
while i<(len(t)-1):
x1 = xn[0,i]
x2 = xn[1,i]
x3 = xn[2,i]
en[0,0] = x1 - SetPoint[0,i]
en[1,0] = x2 - SetPoint[1,i]
en[2,0] = -B1_psi*x2/I1 - Mg*sin(x1)/I1 + a1*x3**2/I1 + b1*x3/I1 -(-B1_psi*SetPoint[1,i]/I1 - Mg*sin(SetPoint[0,i])/I1 + a1*SetPoint[2,i]**2/I1 + b1*SetPoint[2,i]/I1)
vn[i] = np.reshape(-K@en, (1))
A = np.array([[K1*(2*a1*x3/I1 + b1/I1)/T11, 0], [-1.75*K1*Kc*(2*a1*x3 + b1)/(I2*T11), K2*(b2/I2)/T21]])
Lf = np.array([[-B1_psi*(-B1_psi*x2/I1 - Mg*sin(x1)/I1 + a1*x3**2/I1 + b1*x3/I1)/I1 - T10*(2*a1*x3/I1 + b1/I1)*x3/T11 + (-Kgy*(a1*x3**2 + b1*x3)*cos(x1)/I1)*(- 1.75*Kc*(a1*x3**2 + b1*x3)/I2) + (-Mg*cos(x1)/I1)*x2], [-B1_phi*(- 1.75*Kc*(a1*x3**2 + b1*x3)/I2)/I2 - 1.75*Kc*T10*(2*a1*x3 + b1)*x3/(I2*T11)]])
F1 = x2
F2 = a1/I1*x3**2 + b1/I1*x3 -Mg/I1*sin(x1) - B1_psi/I1*x2
F3 = -T10/T11*x3
F = np.array([F1, F2, F3])
G1 = np.array([10e-7,10e-7,K1/T11])
# try:
# beta = 1/G1
# alpha = -F/G1
beta = np.linalg.inv(A)
alpha = -beta@Lf
un[i]= alpha + beta@vn[i]
# except:
# print('Matriz singular')
# un[i] = 1
xn[:, i + 1] = xn[:, i] + T * (F + G1 * un[i])
i=i+1
un[-1]=un[-2]
plt.figure(1)
plt.subplot(311)
plt.plot(t,xn[0,:],'b')
plt.plot(t,SetPoint[0,:],'--k')
plt.xlim((0,80))
plt.ylim((-0.2,0.55))
plt.ylabel('$x_1$ $[rad]$')
#plt.xlabel('t [s]')
plt.grid()
plt.subplot(312)
plt.plot(t,xn[1,:],'b')
plt.plot(t,SetPoint[1,:],'--k')
plt.xlim((0,80))
#plt.ylim((0,70))
plt.ylabel('$x_2$ $[rad/s]$')
#plt.xlabel('t [s]')
plt.grid()
plt.subplot(313)
plt.plot(t,xn[2,:],'b')
plt.plot(t,SetPoint[2,:],'--k')
plt.xlim((0,80))
#plt.ylim((0,70))
plt.ylabel('$x_5$ $[Nm]$')
#plt.xlabel('t [s]')
plt.grid()
plt.show()
我尝试使用重塑来更改矢量尺寸,但它不起作用......
错误信息 "matmul: 输入操作数 1 没有足够的维度(有 0,gufunc 核心,签名为 (n?,k),(k,m?) ->(n?,m?) 需要 1)" 表示正在尝试将两个数组相乘,其中第一个数组的维度不足。在的代码中,该错误发生在以下行:
un[i]= alpha + beta@vn[i]
具体来说,错误在于
beta@vn[i]
部分。
@
运算符执行矩阵乘法,而根据错误消息,
vn[i]
的维度为 0,这意味着它是一个标量。为了执行矩阵乘法,
vn[i]
至少需要是一个一维数组(向量)。
仔细查看的代码,
vn
被定义为:
vn = np.zeros(len(t))
这会创建一个长度为
len(t)
的一维数组。然而,在每次循环迭代中,使用
vn[i]
,它访问
vn
中的单个元素,这将是一个标量值。
为了解决这个问题,需要确保
vn[i]
是一个向量,而不是一个标量。一种方法是将
vn[i]
重塑为一个二维数组,其中一列的长度为 1:
un[i] = alpha + beta @ vn[i].reshape(-1, 1)
这会将
vn[i]
从标量重塑为列向量,从而允许矩阵乘法。
请注意,这可能不是修复代码的唯一必要更改。可能需要查看代码的其他部分以确保数组维数一致。但是,此更改应该解决遇到的特定错误。
标签:python,controls,system From: 78786176