我的代码基于相似变换X=VZ。我Z通过替换状态空间模型AX+BU和RX+SU变换方程来模拟变换方程的模型,其中 X 被替换为VZ和WZresp 然后我再次应用变换以获得 X 回来。我想使用solve_ivp 执行下面的欧拉代码。虽然我能够构建基本方程,但不能像在欧拉中那样在每个时间步访问解数组以X从Z.
X并且Z只是 order 的状态变量矩阵4*1。我的欧拉代码是:
for i in range(0,500000):
if (w== 0 and X[1]> vdon) or (w==1 and X[0]> 0):
zdot=inv(V)*A*V*Z+inv(V)*B*U
Z(i+1)=Z(i)+ h*zdot
w=1
X(i+1)=V*Z(i+1)
else:
zdot=inv(W)*R*W*Z+inv(W)*S*U
Z(i+1)=Z(i)+ h*zdot
w=0
X(i+1)=W*Z(i+1)
其中V和是和W的特征向量矩阵分别使用AR
e1,V=LA.eig(A)
e2,W=LA.eig(R)
在 scipy 的 solve_ivp 中,我将函数定义为
def conv(t,Z):
if (w==0 and X[1]>vdon) or (w==1 and X[0]>0):
zdot=inv(V)*A*V*Z+inv(V)*B*U
w=1
else:
zdot=inv(W)*R*W*Z+inv(W)*S*U
w=0
return zdot
此处显示的if条件未按预期工作,仅用于代码理解。我将求解器方程定义为: w=0 #initially sol= solve_ivp(conv, tspan1,X0) aa1=sol.t bb1=sol.y 但我无法在运行时定义X=W*Z或X=V*Z在每个求解器时间步长。