2016-07-23 19 views
0

Ich versuche ein dynamisches System in Zustandsraumform mit Odeint zu simulieren. Meine A-Matrix ist 12 * 12 und B-Matrix ist 12 * 4 (Zeilen * Spalten), also ist mein anfänglicher Zustandsvektor 12 * 1, wie es suggeriert.Python odeint- Anfangsbedingung y0 muss eindimensional sein

Mein Code ist wie folgt

import numpy as np 
from scipy.integrate import odeint 

tmp = np.loadtxt("system.txt", skiprows =2) 

A=np.matrix(tmp)[0:12,0:12] 
B=np.matrix(tmp)[0:12,12:] 

control = np.matrix([[0.0],[0.0],[-0.6310],[0.0]]) 

def aircraft(state, t): 
    return A*state + B*control 

state0 = np.array([[6.809827628],[0.439572153],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0]]) 
t = np.arange(0.0, 10.0, 0.1) 

state = odeint(aircraft, state0, t) 

Ich erhalte diesen Fehler

Traceback (most recent call last): 
    File "sim.py", line 17, in <module> 
    state = odeint(aircraft, state0, t) 
    File "/home/aluminium/anaconda2/lib/python2.7/site-packages/scipy/integrate/odepack.py", line 215, in odeint 
    ixpr, mxstep, mxhnil, mxordn, mxords) 
ValueError: Initial condition y0 must be one-dimensional. 

Nur so kann ich definieren Zustandsvektor als Spaltenvektor ist denken. Können Sie mir bitte mitteilen, wie man einen anfänglichen Zustandsvektor definiert, um dieses Problem zu lösen?

Vielen Dank im Voraus.

Antwort

0

Ich habe die Antwort und dachte daran, es hier zu teilen mit der Hoffnung, dass jemand mit dem gleichen Problem in der Zukunft profitieren wird.

Odein scheint zu erwarten, 1d-Array als eine Statusvariable, um die Funktion und 1d-Array-Rückkehr von der Funktion auch aufrufen.

Also habe ich die Variablen entsprechend umgeformt. Hier ist der Code.

def aircraft(state, t): 
    xdot= A*state.reshape(12,1) + B*control 
    return np.squeeze(np.asarray(xdot)) 

state0 = np.array([6.809827628,0.439572153,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]) 

Prost