Verfasst am: 10.03.2021, 14:10
Titel: Keine Lösung bei Anfangsschätzung mit vpasolve
Hallo,
ich habe ein Gleichungssystem aufgebaut, das mittels vpasolve in einer Schleife gelöst wird. Da dies sehr lange dauert, dachte ich mir es mittels einer Schätzung zu beschleunigen.
Jedoch wird daurch die Lösungsmenge leer.
Wie kann das sein?
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 11.03.2021, 10:21
Titel:
Oder ist es möglich, den vpasolve in einen anderen solver umzuschreiben?
bitte stelle deine Frage so konkret wie möglich. Bei drei Gleichungen und drei Unbekannten sollte der Code überschaubar sein, dann kopiere ihn doch bitte hier rein.
Generell gibt es die Alternative einer rein numerischen Lösung mit
fsolve
.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 11.03.2021, 14:53
Titel:
Hallo,
hier ist mein Code.
Das auskommentierte vpasolve ist meine Idee, wie ich einen Startwert vorgebe, damit die Rechnung schneller durchgeführt wird.
d(:,i)=V(:,i)/Abstand(i); % Einheitsvektor von Punkt i-1 zu Punkt i
d(:,i+1)=V(:,i+1)/Abstand(i+1); % Einheitsvektor von Punkt i zu Punkt i+1
F_1(:,i)=c_1(i)*(Abstand(i)-l)*d(:,i); % Kraft 1
% Winkel e
Kreuz(:,i)=cross(V(:,i+1),V(:,i)); % Kreuzprodukt für Zähler
e_1(i)=sqrt(Kreuz(1,i)^2+Kreuz(2,i)^2+Kreuz(3,i)^2); % Zähler des Bruchs
e_2(i)=dot(transpose(V(i+1)),V(i)); % Nenner des Bruchs
e(i)=atan(e_1(i)/e_2(i));
das sind die am unübersichtlichsten aufgebauten drei Gleichungen, die ich je gesehen habe.
Variablen vorbelegen erhöht nicht nur die Geschwindigkeit, sondern macht den Code deutlich übersichtlicher.
In einer Iteration verschiedene Spalten zu beschreiben sollte vermieden werden.
Warum werden Berechnungen für i=2 und i=n+1 durchgeführt, wenn da keine Gleichungen gelöst werden?
Vorschlag wäre wie gesagt, die Gleichungen direkt mit fsolve zu lösen. Dazu muss man allerdings den Code umstrukturieren und eine Funktion schreiben, die die Gleichungen numerisch aufbaut.
Der Fehler rührt im übrigen daher, dass dein Anfangswert in der Iteration, in der der Fehler erzeugt wird, zu einer Division durch 0 führt:
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 11.03.2021, 18:02
Titel:
Hallo,
vielen Dank für die Antwort.
Was meinst du mit Variablen vorbelegen?
Berechnungen für i=2 und i=n+2 hatte ich aus versehen noch drin, da ich das abgeändert hatte.
Ist es sinnvoller fsolve zu nutzen? Wenn ja, wie schreibt man den Code am besten um, damit die Gleichungen numerisch aufgebaut sind und ich fsolve nutzen kann?
Bei x definierst du die Dimensionen der Variablen vorab mit x=zeros(3, n+3); . Das solltest du auch bei allen anderen Variablen machen, die dynamisch wachsen.
Zitat:
Ist es sinnvoller fsolve zu nutzen?
Wenn es dir um Performance geht, ja, weil numerische Berechnungen generell schneller sind als symbolische. Ich kann dir auch versichern: wenn ich es nicht für sinnvoller halten würde, hätte ich es nicht vorgeschlagen.
Zitat:
Wenn ja, wie schreibt man den Code am besten um, damit die Gleichungen numerisch aufgebaut sind und ich fsolve nutzen kann?
Du brauchst eine Funktion y = f(x), und fsolve versucht x so zu variieren, dass für y ein Vektor von Nullen herauskommt.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 11.03.2021, 18:29
Titel:
Hallo Harald,
Harald hat Folgendes geschrieben:
Du brauchst eine Funktion y = f(x), und fsolve versucht x so zu variieren, dass für y ein Vektor von Nullen herauskommt.
Aber wenn ich diese aufstelle brauche ich doch eine symbolische Variable, da Matlab doch sonst in den Iterationen mein gesuchtes x als unbekannt annimmt und die Iteration abbricht oder verstehe ich das falsch?
Oder ist dies auch mit einer symbolischen Variable möglich?
Aber wenn ich diese aufstelle brauche ich doch eine symbolische Variable, da Matlab doch sonst in den Iterationen mein gesuchtes x als unbekannt annimmt und die Iteration abbricht oder verstehe ich das falsch?
Das verstehst du falsch. Schau dir bitte die Beispiele in der Doku an.
Wie gesagt: fsolve variiert x (womit es bekannt ist).
Zitat:
Oder ist dies auch mit einer symbolischen Variable möglich?
Nein, das funktioniert eben ohne symbolische Variablen. Das ist genau der Punkt daran.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 11.03.2021, 23:32
Titel:
Hallo,
sorry, dass ich jetzt nochmal fragen muss, aber ich verstehe nicht so ganz wie ich jetzt vorgehen muss, damit ich es mit fsolve lösen kann.
Schreibe ich die Berechnung bis zur Aufstellung von G{i} in eine Funktion und führe fsolve dann für alle i aus?
Oder wie strukturiere ich den Code um, damit es gelöst werden kann?
das klingt insofern sinnvoll, als es dem bisherigen Code entsprechen würde.
Allerdings verwundert mich ohnehin, dass man diese Gleichungssysteme löst und dann darüber nochmal iteriert. Ich habe den Eindruck, dass es ein "übergeordnetes Gleichungssystem" gibt. Wenn dem so ist, dann sollte man m.E. auch das lösen.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
d(:,i)=V(:,i)/Abstand(i); % Einheitsvektor von Punkt i-1 zu Punkt i
d(:,i+1)=V(:,i+1)/Abstand(i+1); % Einheitsvektor von Punkt i zu Punkt i+1
F_1(:,i)=c_1(i)*(Abstand(i)-l)*d(:,i); % Kraft 1
% Winkel e
Kreuz(:,i)=cross(V(:,i+1),V(:,i)); % Kreuzprodukt für Zähler
e_1(i)=sqrt(Kreuz(1,i)^2+Kreuz(2,i)^2+Kreuz(3,i)^2); % Zähler des Bruchs
e_2(i)=dot(transpose(V(i+1)),V(i)); % Nenner des Bruchs
e(i)=atan(e_1(i)/e_2(i));
Leider wird mir die die ganze Zeit ein Fehler angezeigt: "FUN must be a function handle."
Ich verstehe es nicht so ganz, wie ich den Fehler beheben kann.
Habe ich sonst alles richtig gemacht oder gibt es noch weitere Fehler, die ich beachten muss?
d(:,i)=V(:,i)/Abstand(i); % Einheitsvektor von Punkt i-1 zu Punkt i
d(:,i+1)=V(:,i+1)/Abstand(i+1); % Einheitsvektor von Punkt i zu Punkt i+1
F_1(:,i)=c_1(i)*(Abstand(i)-l)*d(:,i); % Kraft 1
% Winkel e
Kreuz(:,i)=cross(V(:,i+1),V(:,i)); % Kreuzprodukt für Zähler
e_1(i)=sqrt(Kreuz(1,i)^2+Kreuz(2,i)^2+Kreuz(3,i)^2); % Zähler des Bruchs
e_2(i)=dot(transpose(V(i+1)),V(i)); % Nenner des Bruchs
e(i)=atan(e_1(i)/e_2(i));
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Anmerkung noch: die Mehrzahl der Indizierungen in der Funktion sind überflüssig und nicht sinnvoll, Ausnahme: x.
Bei V und d würde ich verschiedene Variablennamen verwenden.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 14.03.2021, 17:17
Titel:
Hallo,
ich bin es durchgegangen und bei mir funktioniert es auch.
Vielen Dank für die Hilfe.
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.