将Matlab转换为Python,数组错误和for循环错误

将Matlab转换为Python,数组错误和for循环错误,python,matlab,indices,Python,Matlab,Indices,我对编程非常陌生,所以请耐心听我说。我正在尝试将matlab的一个示例代码转换为python,但我在for循环中的数组方面遇到了问题,并且不断出现索引错误 以下是给定的MatLab代码: clear all close all clc m=100; %kg k=1000; %N/m c=25; v0=0; x0=0; dt=0.0005; F=1000; % N the mag of input force f0=F/m; w=2.5; %rad/sec input frequency t=

我对编程非常陌生,所以请耐心听我说。我正在尝试将matlab的一个示例代码转换为python,但我在for循环中的数组方面遇到了问题,并且不断出现索引错误

以下是给定的MatLab代码:

clear all
close all
clc
m=100; %kg 
k=1000; %N/m
c=25;
v0=0;
x0=0;
dt=0.0005;
F=1000; % N the mag of input force
f0=F/m;
w=2.5; %rad/sec input frequency 
t=0:dt:10;
wn=(k/m)^0.5;% rad/sec natural frequency 
ze=c/(2*(k*m)^0.5);
A=[0 1; -wn^2 -2*ze*wn];
X0=[x0;v0]; %intial conditions 
for i=1:length(t)
    X(:,i)=X0;
    Finput=[0;f0*cos(w*t(i))];
    X0=X0+A*X0*dt+dt*Finput;
end
figure,plot(t,X(1,:));
title('Displacement vs tiem')
xlabel('time (second)')
ylabel('Displacement')
grid on
figure,plot(t,X(2,:),'r');
xlabel('time (second)')
ylabel('Velocity')
我的代码

import numpy as np
import matplotlib.pyplot as plt
#constants
k=1000
m=100
v0=0.0
x0=0.0
f=1000
c=25

f0 = f/m
wn = np.sqrt(k/m)
w = wn*2
ze =c/(2*(k*m)**0.5)

A = np.array([[0.0,1.0],[-wn**2,-2*ze*wn]])
X0= np.array([x0,v0])
dt = 0.01
t = np.arange(0, 2.5, dt) #get values between -10 and 10 with 0.01 step and set to y

for i in range (len(t)):
             print(X0)
             X0[:,i]=X0 #error
             print(X0)
             Finput = np.array([0.0,(f0*np.cos(w*dt*i))])

             X0 = X0 + A*dt*X0+dt*Finput

plt.plot(t, X0[0,:])
plt.plot(t, X0[1,:])
plt.show()
对于for循环中的X0[:,I]=X0部分,我一直得到一个“索引器:数组的索引太多了”,我正在努力找出原因


非常感谢您的帮助

在Matlab代码中,
X(:,i)=X0将X0分配给X的第i列。但是您的python
X0[:,i]=X0#error
正在将X0分配到第i列。

第一次MATLAB运行该行时

    X(:,i)=X0;
它创建一个新变量
X
,其
i
第列等于
X0
。在您的代码中,发生这种情况时,
i
为1,但如果
i
were>1,MATLAB将用零初始化列1…i-1。循环完成后,代码从矩阵
X
绘制数据

在Python代码中,您错误地将其翻译为
X0[:,i]=X0
,这会产生错误,因为您试图将
X0
赋值为二维数组,而它只是一维数组

Python和numpy不会像MATLAB那样在指定子数组时自动创建和增长数组,因此在Python中,您需要在循环之前创建数组
X
,然后在每次指定数组的下一列之前调整数组的大小,或者在创建它时用正确的大小初始化它-因为你知道它将有多大,即
len(t)
,执行后者-你可以使用
np.zero

另外,在您发布的Python代码中,
X0=X0+A*dt*X0+dt*Finput
行在循环之外,因为前一行没有缩进-Python应该为此引发
IndentationError
。按照惯例,每个缩进级别应该使用四个空格


在Python代码中循环之后,您希望绘制
X
的内容,而不是
X0

实际上,
X0
X0
行。主列,主行。