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

Keine Lösung bei Anfangsschätzung mit vpasolve

 

Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.03.2021, 14:10     Titel: Keine Lösung bei Anfangsschätzung mit vpasolve
  Antworten mit Zitat      
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: ---
     Beitrag Verfasst am: 11.03.2021, 10:21     Titel:
  Antworten mit Zitat      
Oder ist es möglich, den vpasolve in einen anderen solver umzuschreiben?

Ich habe 3 Gleichungen und 3 Unbekannte.
 
Harald
Forum-Meister

Forum-Meister


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

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.03.2021, 14:53     Titel:
  Antworten mit Zitat      
Hallo,

hier ist mein Code.
Das auskommentierte vpasolve ist meine Idee, wie ich einen Startwert vorgebe, damit die Rechnung schneller durchgeführt wird.

Code:
clear all; close all; clc;

 n=10; % Verbindungen
 L=25; % Länge
 l=L/n; % Länge jeder Verbindung
 A= 2000000; %Steifigkeit 1
 B= 3000000; % Steifigkeit 2
 x=zeros(3, n+3);
 x(:,2)= [0;10;0]; % Startpunkt
 x(:,1)= [0;12.5;0]; % Punkt davor
 x(:,n+2)= [20;0;0]; % Endpunkt
 x(:,n+3)= [0;-2.5;0]; % Punkt danach

 a=((x(1, n+2)-x(1,2)))/(n);
 b=((x(2,n+2)-x(2,2)))/(n);
 
 % Startwerte
 for j=3:(n+2)
x(1,j)=x(1,j-1)+a;
x(2,j)=x(2,j-1)+b;
 end
 
 y= sym('y',[3 1]);
 
for k=1:2 % Anzahl der Iterationen

 for i=2:(n+2) %Berechnung

 V(:,i)=y-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; % 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
 
 % Koeffizienten
 c_1(i)=(A)/Abstand(i);
 c_2(i)=(B)/Abstand(i);

 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));

% Kraft 2
 F_2(:,i)=(c_2(i)*e(i))*(cross(d(:,i),cross(d(:,i),d(:,i+1))))/(Abstand(i)*sin(e(i)));
 F_2(isnan(F_2))=0;
 
 if (i>=3 && i<=(n+1))
G{i} = F_1(:,i)+F_2(:,i);
z(:,i)=vpasolve([G{i}(1,1), G{i}(2,1), G{i}(3,1)],y);
%z(:,i)=vpasolve([G{i}(1,1), G{i}(2,1), G{i}(3,1)],y, x(:,i));

 x(:,i)=[z(i).y1;z(i).y2;z(i).y3];
 x(:,i)=double(x(:,i));  
 
end
end
end
 
Harald
Forum-Meister

Forum-Meister


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

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:
Code:
subs(G{i}, {y(1), y(2), y(3)}, {x(1,i), x(2,i), x(3,i)})


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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.03.2021, 18:02     Titel:
  Antworten mit Zitat      
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?

Viele Grüße
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Was meinst du mit Variablen vorbelegen?

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.03.2021, 18:29     Titel:
  Antworten mit Zitat      
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?

Viele Grüße
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.03.2021, 23:32     Titel:
  Antworten mit Zitat      
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?


Vielen Dank
Viele Grüße
 
Harald
Forum-Meister

Forum-Meister


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

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2021, 11:01     Titel:
  Antworten mit Zitat      
Hallo,

ich habe jetzt folgenden Code geschrieben.



Code:
clear all; close all; clc;

 n=10; % Verbindungen
 L=25; % Länge
 l=L/n; % Länge jeder Verbindung
 A= 2000000; %Steifigkeit 1
 B= 3000000; % Steifigkeit 2
 x=zeros(3, n+3);
 x(:,2)= [0;10;0]; % Startpunkt
 x(:,1)= [0;12.5;0]; % Punkt davor
 x(:,n+2)= [20;0;0]; % Endpunkt
 x(:,n+3)= [0;-2.5;0]; % Punkt danach
 
 
 a=((x(1, n+2)-x(1,2)))/(n);
 b=((x(2,n+2)-x(2,2)))/(n);
 
 % Startwerte
 for j=3:(n+2)
x(1,j)=x(1,j-1)+a;
x(2,j)=x(2,j-1)+b;
 end

for  i=3:(n+1)
 f=@solver;
    G{i}= fun(x,i,l,A,B);
x0=x(i,:);
x(i,:) = fsolve(G{i},x0);
   
end  
function G = fun(x,i,l,A,B)

y=x(:,i);

V(:,i)=y-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; % 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
 
 % Koeffizienten
 c_1(i)=(A)/Abstand(i);
 c_2(i)=(B)/Abstand(i);

 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));

% Kraft 2
 F_2(:,i)=(c_2(i)*e(i))*(cross(d(:,i),cross(d(:,i),d(:,i+1))))/(Abstand(i)*sin(e(i)));
 F_2(isnan(F_2))=0;
 
G{i} = F_1(:,i)+F_2(:,i);
end



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?

Viele Grüße
 
Harald
Forum-Meister

Forum-Meister


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

ich habe ein paar Änderungen (die du im Detail durchgehen solltest) gemacht, und der Code läuft jetzt.

Grüße,
Harald

Code:
clear; close all; clc;

 n=10; % Verbindungen
 L=25; % Länge
 l=L/n; % Länge jeder Verbindung
 A= 2000000; %Steifigkeit 1
 B= 3000000; % Steifigkeit 2
 x=zeros(3, n+3);
 x(:,2)= [0;10;0]; % Startpunkt
 x(:,1)= [0;12.5;0]; % Punkt davor
 x(:,n+2)= [20;0;0]; % Endpunkt
 x(:,n+3)= [0;-2.5;0]; % Punkt danach
 
 
 a=((x(1, n+2)-x(1,2)))/(n);
 b=((x(2,n+2)-x(2,2)))/(n);
 
 % Startwerte
 for j=3:(n+2)
x(1,j)=x(1,j-1)+a;
x(2,j)=x(2,j-1)+b;
 end

for  i=3:(n+1)
 f=@solver; % nicht sinnvoll
    G{i}= @(currentX) fun(currentX, x,i,l,A,B);
x0=x(:,i);
x(:,i) = fsolve(G{i},x0);
   
end  
function G = fun(currentX, x,i,l,A,B)

y=currentX;

V(:,i)=y-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; % 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
 
 % Koeffizienten
 c_1(i)=(A)/Abstand(i);
 c_2(i)=(B)/Abstand(i);

 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));

% Kraft 2
 F_2(:,i)=(c_2(i)*e(i))*(cross(d(:,i),cross(d(:,i),d(:,i+1))))/(Abstand(i)*sin(e(i)));
 F_2(isnan(F_2))=0;
 
G= F_1(:,i)+F_2(:,i);
end
 

_________________

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 ;)
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: 12.03.2021, 17:35     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.03.2021, 17:17     Titel:
  Antworten mit Zitat      
Hallo,

ich bin es durchgegangen und bei mir funktioniert es auch.
Vielen Dank für die Hilfe.

Viele Grüße
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2, 3  Weiter

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.