首页 > 编程问答 >Python编程时输入操作数错误

Python编程时输入操作数错误

时间:2024-07-24 10:34:23浏览次数:14  
标签:python controls system

我正在用 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

相关文章

  • Python入门知识点 7--散列类型与字符编码
    1、初识散列类型(无序序列)数据类型分为3种:   前面已经学过了两种类型   1.数值类型:int/float/bool只能存储单个数据      2.序列类型:str/list/tuple,有序的存储多个数据--有序类型,有下标,可以进行索引切片步长操作          3.散列类型......
  • Python入门知识点 6--序列类型的方法
    1、初识序列类型方法序列类型的概念:数据的集合,在序列类型里面可以存放任意的数据也可以对数据进行更方便的操作这个操作就是叫增删改查(crud)(增加(Creat),读取查询(Retrieve),更新(Update),删除(Delete)几个单词的首字母简写)增删改查是操作数据最底层的操作(从本质......
  • Python项目流程图
    我有一个由多个文件夹组成的Python项目,每个文件夹包含多个脚本。我正在寻找一个Python库或软件/包,它们可以生成流程图,说明这些脚本如何互连并绘制出从开始到结束的整个过程。自动生成Python项目流程图确实是一个挑战,目前没有完美通用的解决方案。主要原因是:......
  • 使用 mypy 时Python中的继承和多态性不起作用
    我正在寻找用mypy做一些标准的多态性,我以前从未使用过它,而且到目前为止它并不直观。基类classContentPullOptions:passclassTool(Protocol):asyncdefpull_content(self,opts:ContentPullOptions)->str|Dict[str,Any]:...子类classGoogle......
  • Python函数获取匹配和错误记录
    我有一个以下格式的json文件:[{"type":"BEGIN","id":"XYZ123"},{"type":"END","id":"XYZ123",},{"type":&......
  • python,替换标点符号但保持特殊单词完整的最佳方法
    我正在制作一个调制函数,它将采用带有特殊字符(@&*%)的关键字,并保持它们完整,同时从句子中删除所有其他标点符号。我设计了一个解决方案,但它非常庞大,而且可能比需要的更复杂。有没有一种方法可以以更简单的方式做到这一点。简而言之,我的代码匹配特殊单词的所有实例以查找跨度。然......
  • Python 检测 USB 设备 - IDLE 和 CMD 解释器之间的不同结果
    我正在尝试解决VDI解决方案中智能卡设备的USB重定向问题。我正在使用pyscard模块作为智能卡。对于进一步的上下文,主要问题是当浏览器插件调用用于处理智能卡的python脚本时,未检测到读卡器。关于问题,当我从CMD解释器运行此代码片段时,我收到空列表,表示系统上未找......
  • Python查找字符串的CRC32
    我尝试获取字符串数据类型变量的CRC32,但出现以下错误:>>>message='helloworld!'>>>importbinascii>>>binascii.crc32(message)Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:aby......
  • 使用python,如何创建重复的工作时间表
    这是我们公司的小组工作安排表。为三班制,2组日夜工作,1组休息。重复白天工作4天休息2天,然后再次夜间工作4天休息2天的时间表。我想使用python(pandas)自动安排在8月9日之后。抱歉英语不好,提前感谢您的帮助以下是使用Python和Pandas创建重复工作时间表的代码......
  • venv 已激活,但 pip 安装仍然默认进行,并且 python 在源代码中看不到该库
    在终端shell中的vscode中输入“whichpython”显示默认路径:C:\Users\erjan\AppData\Local\Programs\Python\Python311\python.exe(my_venv)但是(my_venv)意味着我的venv处于活动状态,我做了pipinstalltransformers,但下面的代码仍然显示错误-无法看到......