2017-03-03 3 views
-1

Ich bin ziemlich neu zu programmieren, also geduldig mit mir lol. Ich versuche, einen Beispielcode von Matlab in Python zu konvertieren, aber ich habe Probleme mit Arrays in for-Schleifen und bekomme immer Indexfehler. HierMatlab in Python konvertieren, Fehler mit Arrays und für Schleifen

ist die gebotene Matlab-Code:

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') 

Mein Code

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() 

Ich halte einen "Indexerror: zu viele Indizes für Array" immer für die X0 [:, i] = X0 Teil in meiner for-Schleife und kämpfe darum herauszufinden, warum.

Vielen Dank im Voraus für die Hilfe!

Antwort

1

Im Matlab-Code weist X(:,i)=X0; X0 der i-ten Spalte von X zu. Aber Ihre Python X0[:,i]=X0 #error ist X0 zu X0 ith Spalte zuweisen.

+0

Eigentlich 'X0' bis' X0' * row *. Kolumne Major, Reihe Dur. –

1

Das erste Mal läuft MATLAB die Linie

X(:,i)=X0; 

es schafft eine neue VariableX deren i -te Spalte X0 gleich ist. In Ihrem Code i ist 1, wenn dies passiert, aber wenn i> 1 waren, würde MATLAB Spalten 1 ... i-1 mit Nullen initialisieren. Nachdem die Schleife abgeschlossen ist, zeichnet der Code die Daten aus der Matrix X.

Sie haben fälschlicherweise dies als X0[:,i]=X0 in Ihrer Python-Code übersetzt, der einen Fehler gibt, weil Sie versuchen zu X0 zuweisen, als ob es sich um eine zweidimensionale Anordnung waren, wenn es nur eindimensional ist.

Python und numpy nicht automatisch erstellen und Arrays wachsen, wenn Sie zu einem Sub-Array in der Art und Weise zuweisen, dass MATLAB den Fall ist, so in Python Sie das Array X vor der Schleife erzeugen, müssen dann entweder resize das Array jedes Mal, bevor Sie Zuweisen zur nächsten Spalte, oder einfach mit der richtigen Größe initialisieren, wenn Sie es erstellen - da Sie wissen, wie groß es sein wird, dh len(t), tun Sie das letztere - Sie können np.zeros dafür verwenden.

Auch im Python-Code, wie Sie es die Zeile X0 = X0 + A*dt*X0+dt*Finput gebucht haben ist außerhalb der Schleife, da die vorherige Linie keine Einbuchtung hat - Python sollte ein IndentationError dafür allerdings erhöhen. Üblicherweise sollten Sie für jede Einrückungsstufe vier Leerzeichen verwenden.

Nach der Schleife im Python-Code möchten Sie den Inhalt von X, nicht X0 plotten.