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

Idee um while zu ersetzen?

 

AJM
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 01.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2012, 11:57     Titel: Idee um while zu ersetzen?
  Antworten mit Zitat      
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);
 


Code:

function angels = gammabeta(x,l1, l2, l3, l0, varalpha)
angels = zeros(2,1);
angels(1)=cos(varalpha)*l1+cos(x(1))*l2-cos(x(2))*l3-l0;
angels(2)=sin(varalpha)*l1+sin(x(1))*l2-sin(x(2))*l3;
 
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.07.2012, 18:02     Titel: Re: Idee um while zu ersetzen?
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
AJM
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 01.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2012, 18:10     Titel: Re: Idee um while zu ersetzen?
  Antworten mit Zitat      
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?

Lg
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.07.2012, 19:07     Titel:
  Antworten mit Zitat      
Hallo AJM,

ja, was denn nun? FSOLVE löst "sofort", aber 500 Mal dauert zu lange?

Dann fragen wir doch mal so: wie "langsam" ist "langsam" denn? Soll heißen: wie lange dauert die gesamte Simulation?

Der Vorschlag von Jan S. kann sehr helfen, wenn du ähnliche varalpha nacheinander hast, da FSOLVE dann viel schneller konvergiert.

Man könnte noch versuchen, alle 500 Gleichungen auf einmal zu lösen. Ich habe aber meine Zweifel, ob das schneller wäre.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 01.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2012, 19:46     Titel:
  Antworten mit Zitat      
Hi Harald,

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.

Lg und Danke

start.m
 Beschreibung:

Download
 Dateiname:  start.m
 Dateigröße:  825 Bytes
 Heruntergeladen:  257 mal
integrator.m
 Beschreibung:

Download
 Dateiname:  integrator.m
 Dateigröße:  418 Bytes
 Heruntergeladen:  279 mal
hurryup.m
 Beschreibung:

Download
 Dateiname:  hurryup.m
 Dateigröße:  2.09 KB
 Heruntergeladen:  279 mal
gammabeta.m
 Beschreibung:

Download
 Dateiname:  gammabeta.m
 Dateigröße:  250 Bytes
 Heruntergeladen:  274 mal
build_ode.m
 Beschreibung:

Download
 Dateiname:  build_ode.m
 Dateigröße:  1.49 KB
 Heruntergeladen:  271 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.07.2012, 22:02     Titel:
  Antworten mit Zitat      
Hallo AJM,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
AJM
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 01.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2012, 22:17     Titel:
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:
Hallo AJM,

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.07.2012, 22:47     Titel:
  Antworten mit Zitat      
Hallo,

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
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 - 2025 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.