首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >矩阵乘法与solve_ivp

矩阵乘法与solve_ivp
EN

Stack Overflow用户
提问于 2021-12-02 12:38:27
回答 1查看 104关注 0票数 0

我尝试使用Python来模拟LTI系统。结构为xDot = Ax。我将系统动力学定义为一个函数,然后使用solve_ivp调用它。调用函数本身可以工作,但是模拟系统会导致以下错误

代码语言:javascript
运行
复制
ValueError: matmul: Input operand 1 does not have enough dimensions (has 0, gufunc core with signature (n?,k),(k,m?)->(n?,m?) requires 1)

对于直线与矩阵乘法在系统动力学中的定义。下面是密码。

代码语言:javascript
运行
复制
import numpy as np
from scipy import integrate
import matplotlib.pyplot as plt

# System Parameters
l = 1 # Pendulum length
g = 9.81 # gravity

# Initial Conditions
x0 = np.array([np.pi/2, 0])

# Simulation parameters
tStart = 0
tEnd = 4
t_span = [tStart, tEnd]
t = np.linspace(tStart,tEnd,10) # Simulation time

# System matrices
A = np.array([[0, 1],[-g/l, 0]])

def dynamics(x, t):
    xdot = -A@x
    return xdot

y = integrate.solve_ivp(dynamics, t_span, x0)

我需要如何调整系统定义才能使其工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-02 14:16:49

根据文档,动力学的签名应该是dynamics(t, x),标量t作为第一个参数。这就是scipy.integrate.solve_ivp如何调用给定的动态。

在您的示例中,错误是由矩阵A与标量t相乘造成的,而错误消息Input operand 1 does not have enough dimensions表示矩阵乘法出错。

因此,解决方案是将参数切换到dynamics(t, x)。在dynamics中,只要矩阵A不依赖于时间,就可以忽略参数t

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70199622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档