WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Not enough input arguments beim lösen mit ode function

 

Fabian0587
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 15.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2015, 00:41     Titel: Not enough input arguments beim lösen mit ode function
  Antworten mit Zitat      
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 dI = A I + B 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)


dI = zeros(7,1);

M_ST_ST = zeros(N1,N1);
dM_ST_ST = zeros(N1,N1);
M_LF_ST = zeros(1,N1);
dM_LF_ST = zeros(1,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);


switch a
    case 1
        U_Zweig_ST = [-Ua -Ub -Uc];
    case 2
        U_Zweig_ST = [-Ua -Ua -Ub -Ub -Uc -Uc];
    case 3
        U_Zweig_ST = [-Ua -Ua -Ua -Ub -Ub -Ub -Uc -Uc -Uc];
end


U_Zweig = [U_Zweig_ST';
           U_fd];
       
       
A = - (RZweig + dMZweig) / MZweig;
B = (ones(size(MZweig))/MZweig) * U_Zweig;

dI = A*I + B;


Code:
tspan = [0 10];
I0 = zeros(1,7);

[T,Y] = ode45(@DGL,tspan,I0);
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.01.2015, 09:08     Titel:
  Antworten mit Zitat      
Hallo,

ode45 erwartet eine Funktion, die zwei Eingabeparameter entgegennimmt. Bei dir sind es aber sehr viele.

Folgende Seite ist aus der Doku von ode45 verlinkt:
http://www.mathworks.com/help/matla.....-functions.html#bsgprpq-8

Der Aufruf müsste also wie folgt aussehen:

Code:
M00_ST = ...;
M11_ST = ...;
...
a = ...;
N1 = ...;
f = @(t, I) 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)
[T,Y] = ode45(f,tspan,I0);


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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Fabian0587
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 15.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2015, 13:21     Titel:
  Antworten mit Zitat      
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.

Gruß
Fabian
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.01.2015, 13:29     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Fabian0587
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 15.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2015, 13:58     Titel:
  Antworten mit Zitat      
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 Very Happy

Gruß
Fabian
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.