Gibt es eine Möglichkeit, die Gleichungen alle zusammen aufzustellen und gleichzeitig zu lösen und nicht, wie in meinem Beispiel, jedes y nacheinander?
warum sollte das nicht gehen?
Wenn du derzeit allerdings die gewünschten Lösungen bekommst, könnte das einfacher und effizienter sein, da du ausnutzt, dass die Gleichungen entkoppelt sind.
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: 17.03.2021, 23:22
Titel:
Hallo,
da die Punkte voneinander abhängen würde ich gerne ausprobieren, welche Lösungen ich rausbekomme, wenn ich ein Gleichungssystem aufbaue und dies in einem löse.
Wie gehe ich da am besten vor, dass ich das System aufbauen und danach lösen kann?
wenn die Punkte voneinander abhängen, war es aus meiner Sicht nie sinnvoll, die Gleichungen getrennt voneinander zu lösen (siehe 11.03.2021, 23:59).
Wenn ich das richtig verstehe, möchtest du Gleichungen für die Elemente einer Matrix aufstellen und lösen. fsolve arbeitet aber mit Vektoren, d.h. du musst die Matrix in einen Vektor umwandeln und nach Bedarf zurück, z.B. mit
reshape
. Ansonsten ist das Prinzip das gleiche wie bisher.
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: 18.03.2021, 11:13
Titel:
Hallo,
ich habe leider noch nicht verstanden, wie ich das Gleichungssystem aufstellen muss, da ja aktuell eine Gleichung jeweils einen Vektor mit 3 Einträgen besitzt und diese an den Solver übergeben werden, um jeden Punkt nacheinander auzurechnen.
Da ich jetzt das komplette Gleichungssystem mit allen Punkten aufstellen möchte, um alle Punkte gleichzeitig zu lösen, muss ich das System doch anders aufbauen oder?
das Prinzip ist das gleiche, nur dass es jetzt n*3 Gleichungen mit n*3 variierbaren Unbekannten sind.
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: 18.03.2021, 12:29
Titel:
Hallo,
dh ich benutze meine Funktion wie vorher und berechne erstmal alle Gleichungen?
Danach löse ich mit fsolve alle Gleichungen gleichzeitig und gebe hierbei einen großen Vektor mit Anfangswerten vor?
Muss ich diese Gleichungen noch anders formulieren oder kann ich den G-Vektor dafür benutzen?
dh ich benutze meine Funktion wie vorher und berechne erstmal alle Gleichungen?
Ich würde es so formulieren: deine Funktion sollte einen Vektor der Länge n*3 annehmen. Intern kannst du das mit reshape zu einer Matrix machen. Am Ende muss die Funktion einen Vektor der Länge n*3 zurückgeben. Jedes Element entspricht einer Gleichung, die = 0 gesetzt wird.
Zitat:
Danach löse ich mit fsolve alle Gleichungen gleichzeitig und gebe hierbei einen großen Vektor mit Anfangswerten vor?
Ja.
Zitat:
Muss ich diese Gleichungen noch anders formulieren oder kann ich den G-Vektor dafür benutzen?
Du benötigst einen großen G-Vektor.
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: 18.03.2021, 17:36
Titel:
Hallo,
ich habe jetzt folgenden Code geschrieben.
Ist dies richtig?
G= @(currentX) fun(currentX, x,l,A,B,n);
x0=reshape(x,[13*(n+3)]);
for i = 1:6
o = length(x0);
x0(o) = [];
end
x = fsolve(G,x0);
x=reshape(x,[3 n+1]);
x(:,n+2)= [20;0;0]; % Endpunkt
x(:,n+3)= [0;-2.5;0]; % Punkt danach end
function G = fun(currentX, x,l,A,B,n) for i=3:(n+1)
y=currentX;
V(:,i)=y(:,i)-x(:,i-1); % Vektor von xi-1 zu xi
Abstand(i)= sqrt(V(1,i)^2+V(2,i)^2+V(3,i)^2); % Abstand zwischen xi-1 und xi
V(:,i+1)=x(:,i+1)-y(:,i); % Vektor von xi zu xi+1
Abstand(i+1)= sqrt(V(1,i+1)^2+V(2,i+1)^2+V(3,i+1)^2); % Abstand zwischen xi und xi+1
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 kannst du besser beurteilen als ich.
Läuft der Code ohne Fehlermeldung durch? Wenn nicht, dann ist etwas nicht richtig. Um zu sehen was, wäre es hilfreich, wenn du die Fehlermeldung angibst.
Liefert der Code sinnvolle Ergebnisse? Falls nicht, bitte genau die Abweichungen von den erwarteten Ergebnissen erläutern.
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: 18.03.2021, 18:40
Titel:
Hallo,
ich bekomme keine Fehlermeldung, bei der das Matlab abbricht, mir wird jedoch folgendes angezeigt:
No solution found.
fsolve stopped because the last step was ineffective. However, the vector of function
values is not near zero, as measured by the value of the function tolerance.
<stopping criteria details>
Außerdem möchte ich die ersten beiden und letzten beiden x-Vektoren nicht verändern und nur die dazwischen liegenden berechnen. Also x(1), x(2), x(n+2), x(n+3) konstant halten.
Für die letzten beiden werden keine Gleichungen erstellt, deswegen gebe ich auch keine Anfangswerte vor.
Die ersten beiden Werte werden jedoch in der Berechnung ebenfalls verändert. Hier weiß ich nicht, wie ich das verhindern kann. Da die Erstellung der Gleichungen bei i=3 anfängt habe ich somit ja zwei leere Gleichungen vorher, die auch mit in die Berechnung eingehen.
Die ersten beiden Werte werden jedoch in der Berechnung ebenfalls verändert. Hier weiß ich nicht, wie ich das verhindern kann.
Du musst die zu variierenden und die konstant zu haltenden Parameter getrennt übergeben. Ich nannte das in meinem Code-Vorschlag currentX (zu variierend) und x (konstant). Am klarsten dürfte es sein, wenn du currentX, leftBound und rightBound übergibst und dann x = [leftBound, currentX, rightBound] zusammensetzt und damit weiterarbeitest.
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: 18.03.2021, 23:41
Titel:
Hallo,
da innerhalb meiner Funktion die for Schleife erst bei 3 beginnt übergebe ich doch das currentX erst für x(3) oder liege ich da falsch?
Muss ich sonst die Schleifen vorher auch erstellen und hierbei das aktuelle x mit leftBound erstellen?
Außerdem habe ich noch das Problem, dass nur die erste Hälfte der x-Werte mittels fsolve verändert wird und die hinteren Werte auch nach mehreren Iterationen gleich bleiben. Woran kann dies liegen?
es ist für mich schwierig nachzuvollziehen, was du mit diesen Fragen meinst. Wenn man gemeinsam vor dem Rechner sitzen würde, würdest du wohl auf die entsprechenden Code-Zeilen zeigen, aber das geht hier ja schlecht bzw. begrenzt.
Zitat:
da innerhalb meiner Funktion die for Schleife erst bei 3 beginnt übergebe ich doch das currentX erst für x(3) ?
Vermutlich...
Zitat:
Muss ich sonst die Schleifen vorher auch erstellen und hierbei das aktuelle x mit leftBound erstellen?
Was meinst du mit "Schleifen vorher erstellen"?! leftBound sollte ja immer gleich bleiben, muss also außerhalb der an fsolve übergebenen Funktion erstellt und an diese übergeben werden.
Zitat:
Außerdem habe ich noch das Problem, dass nur die erste Hälfte der x-Werte mittels fsolve verändert wird und die hinteren Werte auch nach mehreren Iterationen gleich bleiben. Woran kann dies liegen?
Das kann z.B. daran liegen, dass eine Veränderung der hinteren Werte nicht zu besseren Zielfunktionswerten beitragen würde. Für eine genauere Analyse würde man deinen aktuellen Code benötigen.
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 ;)
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.