【问题标题】:Converting Matlab to Python, errors with arrays and for loops将 Matlab 转换为 Python,数组和 for 循环出错
【发布时间】:2017-03-03 05:53:08
【问题描述】:

我对编程很陌生,所以请耐心等待,哈哈。我正在尝试将 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 部分,我不断收到“IndexError:数组索引过多”,并且正在努力找出原因。

非常感谢您的帮助!

【问题讨论】:

    标签: python matlab indices


    【解决方案1】:

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

    【讨论】:

    • 其实X0X0row。列专业,行专业。
    【解决方案2】:

    MATLAB 第一次运行该行

        X(:,i)=X0;
    

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

    您在 Python 代码中错误地将其翻译为 X0[:,i]=X0,这会导致错误,因为您尝试将其分配给 X0,就好像它只是一维的二维数组一样。

    当您以 MATLAB 的方式分配给子数组时,Python 和 numpy 不会自动创建和增长数组,因此在 Python 中,您需要在循环之前创建数组 X 然后 resize 每个数组分配给它的下一列之前的时间,或者在创建它时用正确的大小初始化它 - 因为你知道它会有多大,即len(t),所以做后者 - 你可以使用np.zeros这个。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 1970-01-01
      • 2016-09-03
      • 2014-08-02
      • 2018-03-15
      相关资源
      最近更新 更多