Verfasst am: 15.01.2015, 00:41
Titel: Not enough input arguments beim lösen mit ode function
Hallo zusammen. Ich bin neu hier und möchte mich gleich mal mit einer Frage, die mich zur Verzweiflung treibt, an euch richten. Ich muss eine DGL der Form numerisch integrieren. Dabei erhalte ich aber immer den Fehler "not enough input arguments". Da ich mich noch nicht all zu lange mit Matlab und numerischen Integrationen beschäftige bin ich da etwas überfragt woran das liegt. Nachfolgend habe ich mal die function und den Aufruf angehängt.
Code:
function dI = DGL(t, I, M00_ST, M11_ST, M22_ST, M00_LF, M11_LF, M22_LF, M33_LF, M44_LF, MKonst_LF, M_LF_res, R1WSpule, R_LF_K, U_fd, UN, C, f_nue, max_mue, max_mue_Erre, p, a, N1)
% Gegeninduktivitäten zwischen zwei Ständerspulen for k1 = 1:N1
for l1 = 1:N1
for index4 = 1:size(f_nue) for mue = 1:max_mue
M_ST_ST(l1,k1) = M_ST_ST(l1,k1) + M00_ST(l1,k1,index4,mue) * (M11_ST(l1,k1,index4,mue)*cos(2*pi*f_nue(index4)*t) + M22_ST(l1,k1,index4,mue)*sin(2*pi*f_nue(index4)*t));
dM_ST_ST(l1,k1) = dM_ST_ST(l1,k1) + M00_ST(l1,k1,index4,mue) * 2*pi*f_nue(index4) * (M22_ST(l1,k1,index4,mue)*cos(2*pi*f_nue(index4)*t) - M11_ST(l1,k1,index4,mue)*sin(2*pi*f_nue(index4)*t));
end end end end
index4 = 0;
% Gegeninduktivitäten zwischen Ständerspulen und Läuferspulen for l1 = 1:N1
for index4 = 1:size(f_nue) for mue_Erre = p:2*p:p*max_mue_Erre;
M_LF_ST(1,l1) = M_LF_ST(1,l1) + M00_LF(l1,index4,mue_Erre) * (M11_LF(l1,index4,mue_Erre)*cos((mue_Erre-nue(index4))*2*pi*f_nue(index4)*t) + M22_LF(l1,index4,mue_Erre)*sin((mue_Erre-nue(index4))*2*pi*f_nue(index4)*t) + M33_LF(l1,index4,mue_Erre)*cos((mue_Erre+nue(index4))*2*pi*f_nue(index4)*t) + M44_LF(l1,index4,mue_Erre)*sin((mue_Erre+nue(index4))*2*pi*f_nue(index4)*t) + MKonst_LF(l1,index4,mue_Erre));
dM_LF_ST(1,l1) = dM_LF_ST(1,l1) + M00_LF(l1,index4,mue_Erre) * ((mue_Erre-nue(index4))*2*pi*f_nue(index4) * (M22_LF(l1,index4,mue_Erre)*cos((mue_Erre-nue(index4))*2*pi*f_nue(index4)*t) - M11_LF(l1,index4,mue_Erre)*sin((mue_Erre-nue(index4))*2*pi*f_nue(index4)*t)) + (mue_Erre+nue(index4))*2*pi*f_nue(index4) * (M44_LF(l1,index4,mue_Erre)*cos((mue_Erre+nue(index4))*2*pi*f_nue(index4)*t) - M33_LF(l1,index4,mue_Erre)*sin((mue_Erre+nue(index4))*2*pi*f_nue(index4)*t)) + MKonst_LF(l1,index4,mue_Erre));
end end end
% Addition der Gegeninduktivitäten zu Zweiggrößen mittels der % Transformationsmatrix C
MZweig_ST = C * M_ST_ST * C';
dMZweig_ST = C * dM_ST_ST * C';
MZweig_LF = C * M_LF_ST';
dMZweig_LF = C * dM_LF_ST';
% Zusammenfügen der Gegeninduktivitätsmatrizen für Ständer und Läufer
MZweig = [MZweig_ST MZweig_LF;
MZweig_LF' M_LF_res];
dMZweig = [dMZweig_ST dMZweig_LF;
dMZweig_LF' 0];
% Addition der Gegeninduktivitäten zu Zweiggrößen mittels der % Transformationsmatrix C
RZweig_ST = C * R1WSpule * C';
% Zusammenfügen der Gegeninduktivitätsmatrizen für Ständer und Läufer
RZweig = [RZweig_ST zeros(size(MZweig_LF));
zeros(size(MZweig_LF))' R_LF_K];
RZweig = sparse(RZweig);
% Berechnung der Grundspannungen
Ua = UN/sqrt(3)*cos(2*pi*fn*t);
Ub = UN/sqrt(3)*cos(2*pi*fn*t - 2*pi/3);
Uc = UN/sqrt(3)*cos(2*pi*fn*t - 4*pi/3);
Der Übersichtlichkeit halber wäre es zu überlegen, diese ganzen Parameter in einer oder wenigen Parametern zusammenzufassen, z.B. in Strukturen.
Zudem ist MATLAB eine Sprache, die besonders effizient mit Vektoren und Matrizen arbeitet. Geschachtelte for-Schleifen sollte man also möglichst vermeiden.
Hallo,
erstmal vielen dank für die rasche Antwort. Ich habe mir schon sowas gedacht allerdings wusste ich es nicht richtig zu lösen.
Das mit den for-Schleifen ist mir auch ein Dorn im Auge. Aber da die Werte in der fertigen Matrix nur Werte für einen Zeitaugenblick sind, sind die for-Schleifefn wohl unumgänglich, da ich aus der Grundgleichung die Terme, die von t abhängig sind auslagern muss um die numerische integration durchzuführen.
du kannst ja mal schauen, wie lange das läuft.
Wenn es "zu lange" läuft, dann mal mit Profiler schauen, wo die Zeit verbraucht wird.
Wenn die Zeit in den for-Schleifen verbraucht wird, daran arbeiten. Auf den ersten Blick würde ich sagen, dass die Schleifen über mue bzw. mue_Erre und vielleicht auch noch die über index4 eliminiert werden können.
Das hatte ich schonmal gemacht. Die Schleife über mue_Erre ist nicht so das Problem das läuft recht fix mit 0,4sek . Problematischer ist die Verschachtelung von mue und nue. Meine Grundmatrix ist eine nxn Matrix mit n=72 Elementen und jedes dieser Elemente muss über alle nue und alle mue summiert werden. Von daher bilde ich eine 4D Matrix die Übergeben wird und die 3. und 4. Dimension summiert werden. Ich habe festgestellt, dass die Reduktion um nur eine Dimension schon einen beträchtlichen Vorteil bzgl. der Zeit bringen würde. Zur Zeit braucht das Programm 10sek um den Schleifenkomplex einmal abzuarbeiten. Mit einer Dimension weniger wären es nur noch 2sek. Da muss ich mich auf jeden Fall noch drum kümmern.
Die ode Funktion rechnet jetzt auf jeden Fall mit deinem Ansatz, vielen Dank nochmal dafür. Allerdings tut sie das jetzt schon seit gut 10min für 10 Zeitpunkte von daher wird die Zeitoptimierung jetzt wohl zum wichtigsten Punkt meiner Arbeit
Gruß
Fabian
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.