Verfasst am: 22.07.2012, 11:57
Titel: Idee um while zu ersetzen?
Hi,
ich habe einen Code der wunderbar funktioniert, nur leider dank der while schleife 'langsam' ist
Zur Erklärung: Ich habe einen Vektor mit sehr vielen varalpha werten. Zu jedem dieser Werte möchte ich den passenden varbeta und vargamma Wert.
Meine Idee: Ich nehme fsolve und löse gamma und beta für jedes alpha und schreibe diese Winkel wieder in 2 Vektoren. Damit habe ich dann zu jedem alpha wert den passenden gamma und beta wert. Leider dauert es vergleichsweise lange jedes mal die while schleife durchzuarbeiten. Kennt ihr da eine bessere Lösung?
Code:
start0 = [0.6; pi/3];
a = 0;
i = 1;
angels = zeros(nframes,2);
while a ~= duration
trafo = fsolve(@(x) gammabeta(x,l1, l2, l3, l0, varalpha(i)),start0);
angels(i,:) = trafo.';
a = t(i);
i = i+1;
end
varbeta = angels(:,1);
vargamma =angels(:,2);
Verfasst am: 22.07.2012, 18:02
Titel: Re: Idee um while zu ersetzen?
Hallo AJM,
An der WHILE-Schleife liegt es auf jeden Fall nicht.
FSOLVE profitiert von einem guten Start-Wert. Eventuell könntest Du hier die Lösung vom vorhergehenden Wert einsetzen.
Verfasst am: 22.07.2012, 18:10
Titel: Re: Idee um while zu ersetzen?
Jan S hat Folgendes geschrieben:
Hallo AJM,
An der WHILE-Schleife liegt es auf jeden Fall nicht.
FSOLVE profitiert von einem guten Start-Wert. Eventuell könntest Du hier die Lösung vom vorhergehenden Wert einsetzen.
Gruß, Jan
Hi Jan,
Erstmal danke für deine Antwort.
Die Startbedingung ist nicht das Problem. Fsolve löst das Problem sofort. Das Problem ist eher dass ich Alpha durch Integration erhalte und Alpha deswegen ca 500Werte hat und somit Fsolve 500 mal durchlaufen wird.
Kann man Vlt alle Alpha Werte übergeben also den kompletten Vektor und gleich einen kompletten lösungsvektor erhalten? Denn was ich mache ist ja, dass ich jeden Alpha Wert einzeln einlese dafür mittels Fsolve Gamma und Beta berechne und diese wieder in einen Vektor ablege und dann den nächsten Alphawert nehme und das ganze nochmals durchführe. Verstehst du was ich meine?
es dauert nicht allzulange. Ich habe den Tip von Thomas noch aufgenommen:
Code:
while a ~= duration
trafo = fsolve(@(x) gammabeta(x,l1, l2, l3, l0, varalpha(i)),start0);
start0 = trafo;
angels(i,:) = trafo.';
a = t(i);
i = i+1;
end
Anbei habe ich auch mal das Programm angehängt, da ich leider ein absoluter Matlab Anfänger bin und deswegen noch nicht einschätzen kann ob es wirklich schnell oder langsam ist. Mir kommt nur der fsolve Prozess sehr langsam im vergleich zum ode45 Prozess vor, aber vlt ist das ja auch normal?
Wenn du start.m öffnest und ausführst läuft der Rest automatisch durch.
Wer ist Thomas?
"Nicht allzulange" ist nicht hilfreich. Etwas wie dies wäre sinnvoller: "17.3 Sekunden, aber ich benötige aus Grund XYZ weniger als 5 Sekunden".
Wird das Problem klarer, wenn wir das Programm auf unserem Rechner laufen lassen?
Wer ist Thomas?
"Nicht allzulange" ist nicht hilfreich. Etwas wie dies wäre sinnvoller: "17.3 Sekunden, aber ich benötige aus Grund XYZ weniger als 5 Sekunden".
Wird das Problem klarer, wenn wir das Programm auf unserem Rechner laufen lassen?
Gruß, Jan
Hi Jan,
tut mir Leid, ich wollte eigentlich deinen Namen schreiben und hatte an was anderes gedacht. Ich meinte natürlich Deinen Vorschlag!
Ich kann mir vorstellen, dass du genaue Angaben möchtest, geht mir ja auch so, wenn ich bei was gefragt werde. Leider habe ich jedoch erst vor 4/5 Wochen begonnen mich mit matlab zu beschäftigen und kann deswegen meine Behauptung nicht mit genauen Zahlen unterlegen. Denn wenn ich wüsste, dass ich bereits einen guten effizienten Weg gefunden habe würde ich nicht mehr fragen müssen.
Was mir komisch vorkommt und was mir Grund für die Vermutung gab, dass man das ganze noch verbessern kann ist folgendes:
Das Program braucht nach meiner Schätzung nur 10% der gesamten Zeit um die Winkel alpha mittels Integration zu bestimmen und 90% der Zeit um die dazu passenden Winkel gamma und beta zu berechnen. Das scheint mir einfach Unverhaeltnismaessig.
Wenn du einfach das Programm ablaufen lässt, siehst du, dass es kurz nach dem klick bereits alpha gelöst hat und dann eine Zeit lang fsolve durchlaufen muss.
Es kann natürlich auch sein, dass dies absolut normal ist.
warum schätzen? Nimm doch bitte tic/toc bzw. den Profiler für Laufzeitmessungen.
Um die Frage von Jan zu wiederholen? Wie lange braucht das Programm? Wie stark muss es beschleunigt werden?
Grüße,
Harald
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.