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

Gleichungssystem Lösen

 

gangsterbob
Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 17.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.12.2020, 13:47     Titel: Gleichungssystem Lösen
  Antworten mit Zitat      
Hallo,

ich habe ein Beispiel aus einem Buch welches ich nachvollziehen möchte.

Es ist ein Gleichungsystem mit 12 unbekannten vorhanden. Dieses kann laut Aussage im Buch analystisch gelöst werden. Allerdings gibt es wohl viele Lösungen und Numerische Probleme.
Pi = initilale Position
Vi = intiale Geschwindigkeit
Ai = initiale Beschleunigung


Daher wird eine Fehlerfunktion aufgesetzt mit aPeak1 als Parameter. (Siehe Foto Anhang)
Ist damit gemeint die Gleichung 4.32 Null zu setzen? Dann wird der Testwert aPeak1 eingesetzt...

Im Buch wird die Fehlerfunktion angeben (Siehe Foto Anhang). Wie wird diese wohl erstellt?

Wenn diese Fehlerfunktion erstellt ist, kann die Nullstelle mit einen Näherungsverfahren sauber ermittelt werden.

Ich verwende die Symbolic Toolbox. Komme aber irgendwie nicht dahinter wie es gelingen kann. Vielleicht kann mir ja jemand weiterhelfen.

Achtung Pi ist nicht pi().

Damit ihr es nicht abtippen müssst...

Code:

syms  ti Ti aPeak1 aPeak2 Ai Vi Pi ti2 ti3 ti4 tmin vi2 vi3 vi4
syms aTarget vTarget pTarget
syms  jMax
syms  pi2 pi3 pi4
syms x




%jMax    = 500;  %Testwert
%Pi      = 100;  %Testwert
%Vi      = 100;  %Testwert
%Ai      = 50;  %Testwert
%vTarget = 0;  %Testwert
%pTarget = 200;  %Testwert



Ti=0;

ti2           = (aPeak1-Ai)/jMax+Ti;
   
ti3           = aPeak1/jMax+ti2;

ti4           = aPeak2/jMax+ ti3;

tmin          = aPeak2/jMax+ ti4;

vi2           = (1/2)*(ti2 - Ti)*(Ai+aPeak1) + Vi ;

vi3           = (1/2)*(ti3-ti2)*aPeak1 + vi2 ;

vi4           = (1/2)*(ti4-ti3)*aPeak2+ vi3;

vTarget       = (1/2)*(tmin-ti4)*aPeak2;

pi2           = Vi *  (ti2-Ti)   + (1/2) * Ai     * (ti2-Ti)^2   + (1/6) * jMax * (ti2-Ti)^3+ Pi;

pi3           = vi2 * (ti3-ti2)  + (1/2) * aPeak1 * (ti3-ti2)^2  - (1/6) * jMax * (ti3-ti2)^3+ pi2;

pi4           = vi3 * (ti4-ti3)  - (1/6) * jMax   * (ti4-ti3)^3+ pi3;

pTarget       = vi4 * (tmin-ti4) + (1/2) * aPeak2 * (tmin-ti4)^2 + (1/6) * jMax * (tmin-ti4)^3+ pi4


Vielen Dank schon einmal

Fehlerfunktion Position.JPG
 Beschreibung:

Download
 Dateiname:  Fehlerfunktion Position.JPG
 Dateigröße:  70.48 KB
 Heruntergeladen:  259 mal
Gleichungssystem.JPG
 Beschreibung:

Download
 Dateiname:  Gleichungssystem.JPG
 Dateigröße:  62.25 KB
 Heruntergeladen:  269 mal
Private Nachricht senden Benutzer-Profile anzeigen


gangsterbob
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 17.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.12.2020, 18:03     Titel:
  Antworten mit Zitat      
Hallo,

es gab noch Fehler in den Gleichungen.
Ich bin nun weiter gekommen. Die Gleichung kann nun ausgelöst werden, sodass nur aPeak1 und aPeak2 übrig bleiben. Ich suche die Nullstellen der Gleichung "f0Zero";

Für die Numerische Lösung verwende ich vpaSolve. Allerdings frage ich mich wie vpaSolve auf die Lösungen kommt.

Es gibt teilweise mehrere Lösungen. Welches Verfahren wendet vpaSolve an? Es wird mir nur eine Lösung ausgegeben, ist es möglich mehrere auszugeben?

Zu meinen Ergebnissen:

Für Gleichung F1 wirdkeine Nullstelle ausgeben, stimmt mit Plot dem Plot überein.

Für Gleichung F2 wird eine Nullstelle ausgegeben bei 406.301, passt auch laut Plot. Allerdings gibt es noch eine zweite im Plot bei etwa 200.

Für Gleichung F3 wird eine Nullstelle ausgegeben auch bei 406.301. Passt nicht mit dem Plot überein. Dort ist eine bei etwa 200.


Wie sind die Ergebnisse zu erklären? Hat es evtl. etwas mit den komplexen Lösungen zu tun von denen ich nur den Realteil verwende?

Danke im Voraus


Code:
clc
clear

syms  ti Ti aPeak1 aPeak2 Ai Vi Pi ti2 ti3 ti4 tmin vi2 vi3 vi4
syms aTarget vTarget pTarget
syms  jMax
syms  pi2 pi3 pi4
syms x



Ti=0;

ti2           = (aPeak1-Ai)/jMax+Ti;
   
ti3           = aPeak1/jMax+ti2;

ti4           = -aPeak2/jMax+ ti3;

tmin          = -aPeak2/jMax+ ti4;

vi2           = (1/2)*(ti2 - Ti)*(Ai+aPeak1) + Vi ;

vi3           = (1/2)*(ti3-ti2)*aPeak1 + vi2 ;

vi4           = (1/2)*(ti4-ti3)*aPeak2+ vi3;

vTarget       = (1/2)*(tmin-ti4)*aPeak2+vi4;

pi2           = Vi *  (ti2-Ti)   + (1/2) * Ai     * (ti2-Ti)^2   + (1/6) * jMax * (ti2-Ti)^3+ Pi;

pi3           = vi2 * (ti3-ti2)  + (1/2) * aPeak1 * (ti3-ti2)^2  - (1/6) * jMax * (ti3-ti2)^3+ pi2;

pi4           = vi3 * (ti4-ti3)  - (1/6) * jMax   * (ti4-ti3)^3+ pi3;

f0            = vi4 * (tmin-ti4) + (1/2) * aPeak2 * (tmin-ti4)^2 + (1/6) * jMax * (tmin-ti4)^3+ pi4-pTarget

f0Zero = f0==0;


%f0Zero nach aPeak1 auflösen
solYeah = solve(f0Zero,aPeak1,'Maxdegree',3);


%Testwerte
jMaxSub    = 500;
PiSub      = 100;
ViSub      = 100;
AiSub      = 50;
vTargetSub = 0;
pTargetSub = 200;

%Werte einsetzung um Numerisch zu lösen
solYeahSubs = subs(solYeah, {jMax,Pi,Vi,Ai,vTarget,pTarget}, {jMaxSub,PiSub,ViSub,AiSub,vTargetSub,pTargetSub});
solYeahSubs

%Gleichungen umkopieren
f1(aPeak2) = solYeahSubs(1)
f2(aPeak2) = solYeahSubs(2)
f3(aPeak2) = solYeahSubs(3)


%aPeak2 für minimalen Fehler berechnen
vpaResF1 = vpasolve(f1(aPeak2),aPeak2,[-500 500])
vpaResF2 = vpasolve(f2(aPeak2),aPeak2,[-500 500])
vpaResF3 = vpasolve(f3(aPeak2),aPeak2,[-500 500])


%Gegenprobe mit einsetzen
test1 = f1(vpaResF1)
test2 = f2(vpaResF2)
test3 = f3(vpaResF3)

%Dezimalwert ausgeben
double(real(test1))
double(real(test2))
double(real(test3))


%F1 bis F3 Plotten um manuell zu prüfen
xArray = -500 : 1 : 500;
yArray1 = f1(xArray);
figure(1)
plot(xArray,yArray1);

yArray2 = f2(xArray);
figure(2)
plot(xArray,yArray2);

yArray3 = f3(xArray);
figure(3)
plot(xArray,yArray3);

 
Private Nachricht senden Benutzer-Profile anzeigen
 
gangsterbob
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 17.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.12.2020, 11:36     Titel:
  Antworten mit Zitat      
Was mir nun noch aufgefallen ist. Meine Fehlerfunktion ist anders als im Buch. (Siehe Anhang erster Post).
Private Nachricht senden Benutzer-Profile anzeigen
 
gangsterbob
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 17.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2021, 14:35     Titel:
  Antworten mit Zitat      
So Leute, ich habe nochmal einen anderen Ansatz gewählt und konnte das Gleichungssystem lösen.

Die Ergebnisse stimmen.

Allerdings sind die Ausdrücke so dermaßen lang, dass Matlab kein Ende beim kompilieren findet. (Ich habe den Ausdruck ins Diary schreiben lassen und dann kopiert)

Das ganze soll auf einem Echtzeitsystem laufen. Daher suche ich eine Möglichkeit die lösung zu optimieren.

Wie schon oben beschrieben mit einem Näherungsverfahren. Allerdings weiss ich nicht wie ich hier am besten eine Variable aus dem Gleichungssystem "auskopple" um eine Lösung mit geringerer Komplexität zu erhalten.

Ich bin für jeden Ansatz dankbar.

Code:

clc
clear

syms aAct vAct sAct
syms jMax1 aAct1 vAct1 sAct1;
syms jMax2 aAct2 vAct2 sAct2;
syms jMax3 aAct3 vAct3 sAct3;
syms jMax4 aAct4 vAct4 sAct4;
syms jMax5 aAct5 vAct5 sAct5;
syms jMax6 aAct6 vAct6 sAct6;
syms jMax7 aAct7 vAct7 sAct7;
syms vMax aMax jMax
syms t1 t2 t3 t4 t5 t6 t7
syms sTarget vTarget aTarget  


   

jMaxSub    = 500;
PiSub      = 100;
ViSub      = 50;
AiSub      = 10;
vTargetSub = 0;
pTargetSub = 300;
z=0;
    dir = 1; %direction
 
    jAct1      = dir * jMax;
    aAct1      = int(jAct1,t1) + aAct;
    vAct1      = int(aAct1,t1) + vAct;
    sAct1      = int(vAct1,t1) + sAct;
   
    jAct3      = -jAct1;
    aAct3      = int(jAct3,t3) + aAct1;
    vAct3      = int(aAct3,t3) + vAct1;
    sAct3      = int(vAct3,t3) + sAct1;

    jAct5      = jAct3;
    aAct5      = int(jAct5,t5) + aAct3;
    vAct5      = int(aAct5,t5) + vAct3;
    sAct5      = int(vAct5,t5) + sAct3;
   
    jAct7      = -jAct5;
    aAct7      = int(jAct7,t7) + aAct5;
    vAct7      = int(aAct7,t7) + vAct5;
    sAct7      = int(vAct7,t7) + sAct5;

    f1 = aAct7==0;
    f2 = vAct7==0;
    f3 = sAct7==sTarget;
    f4 = aAct3==0;

    eq          = [f1,f2,f3,f4];
    searched    = [t1,t3,t5,t7];
    s = solve(eq,searched,'maxdegree',4)
   
    SolT1 = s.t1(2); % Die zweite Lösung ist in diesem Fall korrekt (Allerings seeeehr lang)
    SolT3 = s.t3(2); % Die zweite Lösung ist in diesem Fall korrekt (Allerings seeeehr lang)
    SolT5 = s.t5(2); % Die zweite Lösung ist in diesem Fall korrekt (Allerings seeeehr lang)
    SolT7 = s.t7(2); % Die zweite Lösung ist in diesem Fall korrekt (Allerings seeeehr lang)
   
    aSubsT1 = subs(SolT1, {jMax,aAct,vAct,sAct,sTarget}, {jMaxSub,AiSub,ViSub,PiSub,pTargetSub});
    real(double(aSubsT1))


    aSubsT3 = subs(SolT3, {jMax,aAct,vAct,sAct,sTarget}, {jMaxSub,AiSub,ViSub,PiSub,pTargetSub});
    real(double(aSubsT3))
   
   
    aSubsT5 = subs(SolT5,{jMax,aAct,vAct,sAct,sTarget}, {jMaxSub,AiSub,ViSub,PiSub,pTargetSub});
    real(double(aSubsT5))
   
   
    aSubsT7 = subs(SolT7, {jMax,aAct,vAct,sAct,sTarget}, {jMaxSub,AiSub,ViSub,PiSub,pTargetSub});
    real(double(aSubsT7))
   
 


Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

eine Möglichkeit ist, das numerisch mit fsolve zu lösen:

Code:
%% Einmalige Vorbereitung
syms aAct vAct sAct
syms jMax1 aAct1 vAct1 sAct1;
syms jMax2 aAct2 vAct2 sAct2;
syms jMax3 aAct3 vAct3 sAct3;
syms jMax4 aAct4 vAct4 sAct4;
syms jMax5 aAct5 vAct5 sAct5;
syms jMax6 aAct6 vAct6 sAct6;
syms jMax7 aAct7 vAct7 sAct7;
syms vMax aMax jMax
syms t1 t2 t3 t4 t5 t6 t7
syms sTarget vTarget aTarget

jAct1      = dir * jMax;
aAct1      = int(jAct1,t1) + aAct;
vAct1      = int(aAct1,t1) + vAct;
sAct1      = int(vAct1,t1) + sAct;

jAct3      = -jAct1;
aAct3      = int(jAct3,t3) + aAct1;
vAct3      = int(aAct3,t3) + vAct1;
sAct3      = int(vAct3,t3) + sAct1;

jAct5      = jAct3;
aAct5      = int(jAct5,t5) + aAct3;
vAct5      = int(aAct5,t5) + vAct3;
sAct5      = int(vAct5,t5) + sAct3;

jAct7      = -jAct5;
aAct7      = int(jAct7,t7) + aAct5;
vAct7      = int(aAct7,t7) + vAct5;
sAct7      = int(vAct7,t7) + sAct5;

% Modifiziert in Form f = 0
f1 = aAct7;
f2 = vAct7;
f3 = sAct7-sTarget;
f4 = aAct3;

eq          = [f1,f2,f3,f4];
searched    = [t1,t3,t5,t7];
objMulti = matlabFunction(eq, 'Vars', [searched, jMax,aAct,vAct,sAct,sTarget])

%% Eigentlicher Teil
tic
jMaxSub    = 500;
PiSub      = 100;
ViSub      = 50;
AiSub      = 10;
vTargetSub = 0;
pTargetSub = 300;
z=0;
dir = 1; %direction


objSingle = @(t) objMulti(t(1), t(2), t(3), t(4), jMaxSub,AiSub,ViSub,PiSub,pTargetSub);
fsolve(objSingle, zeros(4,1))    % Wahl eines sinnvollen Startwerts ist wichtig.
toc


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
 
gangsterbob
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 17.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2021, 18:36     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Antwort.

Leider habe ich keine Optimization Toolbox.

Geht das auch mit vpaSolve?

Kann man numerische Solver auch mit Code-Generierung verwenden, oder muss man sich da selbst was bauen?


Gruß Daniel
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

du kannst es natürlich auch mit vpasolve versuchen. Ich würde da allerdings weniger gute Performance erwarten. Zudem unterstützt vpasolve keine Code-Generierung.

fsolve unterstützt Code-Generierung, siehe den Abschnitt "Extended Capabilities" in der Doku.

Eine Alternative wäre fminsearch, auch das unterstützt Code-Generierung. Angepasster Aufruf dann:
Code:
objSingle2 = @(t) norm(objMulti(t(1), t(2), t(3), t(4), jMaxSub,AiSub,ViSub,PiSub,pTargetSub));
fminsearch(objSingle2, zeros(4,1)) % Wahl eines sinnvollen Startwerts ist wichtig.


Ich würde aber generell von fsolve eine bessere Performance und zuverlässigere Konvergenz erwarten.

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
 
gangsterbob
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 17.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2021, 22:25     Titel:
  Antworten mit Zitat      
Hallo

Ok danke, erstmal klingt gut. Allerdings wäre es am gut die Methode zu wählen die der Autor des Buches verwendet. Vor allem aus Performance gründen. Weiterhin komme ich nicht ohne weiteres an die Optimization Toolbox ran...

Die Methode des Autors habe ich nicht ganz verstanden (Siehe Anhang).

Ich vermute das er eine unbekannte des Gleichungssystems in der analytischen Lösung nicht lösen lässt, somit soll die Komplexität sinken..?!

Ist diese Analytische Lösung vorhande, löst er die Letzte numerisch.

Oder kann mir jemand mehr zu seiner Methode sagen?

Falls dies so ist wie angenommen, wie könnte ich es am besten umsetzen?

Gruß Daniel

Bild1.JPG
 Beschreibung:

Download
 Dateiname:  Bild1.JPG
 Dateigröße:  106.39 KB
 Heruntergeladen:  263 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Weiterhin komme ich nicht ohne weiteres an die Optimization Toolbox ran...

Bei MathWorks melden, die sollten das hin bekommen. ;)
Ernsthaft: ich hatte es nicht explizit dazu geschrieben, aber den Vorschlag mit fminsearch habe ich gemacht, weil es keine Toolboxen benötigt.

Zitat:
Die Methode des Autors habe ich nicht ganz verstanden (Siehe Anhang).

Dann verstehst du mehr als ich, ich verstehe sie nämlich gar nicht.

Allerdings schreibt der Autor ja, dass das verbleibende System numerisch gelöst werden soll. Ich kann mir nicht vorstellen, dass 3 statt 4 Gleichungen einen extremen Unterschied macht.

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
 
gangsterbob
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 17.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2021, 11:12     Titel:
  Antworten mit Zitat      
Hallo,

Harald, vielen Dank. Fminsearch funktioniert, aber auf meinem i7 dauert es in der simulation schon 0,086 sek. Wird die Berechnung durch den Coder enorm beschleunigt um auf dem (deutlich schwächeren) Echtzeitsystem brauchbar zu funktionieren? Einen Test werde ich nächste Woche machen. Hoffnung habe ich wenig.

Daher wir nur die Lösung funktionieren die der Autor verwendet. Zuerst Analytisch die Komplexität verringern und dann Numerisch.

Aber welche Ansatz wäre sinnvoll. Ich bin aktuell ein wenig ratlos
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.01.2021, 16:04     Titel:
  Antworten mit Zitat      
Hallo,

ich habe mir die Gleichungen nochmal genauer angesehen. Die 1. und die 4. Gleichung sind ja sehr einfach.

Man könnte also die 4. Gleichung nach t1 auflösen und das in die anderen einsetzen.
Code:
t1Sol = solve(eq(4), t1);
eq = subs(eq(1:3), t1, t1Sol)

Dann nochmal die 1. Gleichung nach t5 auflösen und das in die anderen einsetzen.
Code:
t5Sol = solve(eq(1), t5);
eq = subs(eq(2:3), t5, t5Sol)


Hier kann die 1. Gleichung wieder leicht nach t7 aufgelöst werden (welche Lösung die richtige ist, wirst du wissen) und in die andere eingesetzt werden, so dass nur noch eine Gleichung in t3 verbleibt, die du z.B. mit fminsearch lösen kannst.

Dann musst du die Lösung wieder in die anderen Gleichungen einsetzen. Das ist zwar einiges an Arbeit, kann aber schneller sein.

Ansonsten kann man wohl nur an der weiteren Verwendung ansetzen: was wird denn hier wie kompiliert? Wird z.B. der MATLAB-Code direkt in C-Code umgewandelt oder verwendest du das in Simulink in einem MATLAB Function-Block, oder vielleicht noch was ganz anderes?

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
 
gangsterbob
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 17.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2021, 16:54     Titel:
  Antworten mit Zitat      
Hallo,

der Ansatz klingt sehr gut, danke! Die richtiges Ergebnisse bei den vorgegebenen Testwerten sind...

t1= 0.4634
t3= 0.4834
t5= 0.5775
t7=t5

Ich hab versucht den Ansatz umzusetzen, allerdings bekomme ich eine Fehlermeldung bei fminsearch. Kannst du mir da weiterhelfen?

Wenn ich die Funktion Plotte liegt der Minimalwert bei 0,3159. Dies entspricht nicht meiner Erwartung... Sad

Wo kann der Fehler sein?


Code:

syms aAct vAct sAct
syms jMax1 aAct1 vAct1 sAct1;
syms jMax2 aAct2 vAct2 sAct2;
syms jMax3 aAct3 vAct3 sAct3;
syms jMax4 aAct4 vAct4 sAct4;
syms jMax5 aAct5 vAct5 sAct5;
syms jMax6 aAct6 vAct6 sAct6;
syms jMax7 aAct7 vAct7 sAct7;
syms vMax aMax jMax
syms t1 t2 t3 t4 t5 t6 t7
syms sTarget vTarget aTarget  


   

jMaxSub    = 500;
PiSub      = 100;
ViSub      = 50;
AiSub      = 10;
vTargetSub = 0;
pTargetSub = 300;
z=0;
    dir = 1; %direction
 
    jAct1      = dir * jMax;
    aAct1      = int(jAct1,t1) + aAct;
    vAct1      = int(aAct1,t1) + vAct;
    sAct1      = int(vAct1,t1) + sAct;
   
    jAct3      = -jAct1;
    aAct3      = int(jAct3,t3) + aAct1;
    vAct3      = int(aAct3,t3) + vAct1;
    sAct3      = int(vAct3,t3) + sAct1;

    jAct5      = jAct3;
    aAct5      = int(jAct5,t5) + aAct3;
    vAct5      = int(aAct5,t5) + vAct3;
    sAct5      = int(vAct5,t5) + sAct3;
   
    jAct7      = -jAct5;
    aAct7      = int(jAct7,t7) + aAct5;
    vAct7      = int(aAct7,t7) + vAct5;
    sAct7      = int(vAct7,t7) + sAct5;

    f1 = aAct7==0;
    f2 = vAct7==0;
    f3 = sAct7-sTarget;  
    f4 = aAct3==0;

    eq          = [f1,f2,f3,f4];
    searched    = [t1,t3,t5,t7];
   
    %Man könnte also die 4. Gleichung nach t1 auflösen und das in die anderen einsetzen.
    t1Sol = solve(eq(4), t1)
    eq = subs(eq(1:3), t1, t1Sol);
   
    %Dann nochmal die 1. Gleichung nach t5 auflösen und das in die anderen einsetzen.
    t5Sol = solve(eq(1), t5);
    eq = subs(eq(2:3), t5, t5Sol);

    %Hier die 1. Gleichung wieder leicht nach t7 aufgelöst werden
    t7Sol = solve(eq(1), t7);
   
    %Testwerte einsetzen
    t7SolSubs = subs(t7Sol(1), {jMax,aAct,vAct,sAct,sTarget}, {jMaxSub,AiSub,ViSub,PiSub,pTargetSub});

    %Fehlermeldung?!?
    fminsearch(t7SolSubs,t3)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Code:
%Testwerte einsetzen
    t7SolSubs = subs(t7Sol(1), {jMax,aAct,vAct,sAct,sTarget}, {jMaxSub,AiSub,ViSub,PiSub,pTargetSub});

%Fehlermeldung?!?
    fminsearch(t7SolSubs,t3)

Das ist so nicht sinnvoll. Du musst t7SolSubs in die andere Gleichung eq(2) einsetzen und diese dann nach t3 auflösen.

Zudem fehlt der Teil, den symbolischen Ausdruck in ein Function Handle umzuwandeln, siehe z.B. Gestern 16:29 und Gestern 18:14.

Da es sich jetzt um eine Gleichung und nicht "nur" um einen Ausdruck handelt, wirst du noch lhs und rhs brauchen.

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
 
gangsterbob
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 17.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2021, 20:53     Titel:
  Antworten mit Zitat      
Hallo Harald,

wow mit VpaSolve hab ich nun das korrekte Ergebnis Smile.

Ich glaub bei Fminsearch usw. muss ich mich mal einlesen. Ich denke da ist ein Fehler drin...

Vielen Dank schon einmal.

Gruß Daniel

Code:


syms aAct vAct sAct
syms jMax1 aAct1 vAct1 sAct1;
syms jMax2 aAct2 vAct2 sAct2;
syms jMax3 aAct3 vAct3 sAct3;
syms jMax4 aAct4 vAct4 sAct4;
syms jMax5 aAct5 vAct5 sAct5;
syms jMax6 aAct6 vAct6 sAct6;
syms jMax7 aAct7 vAct7 sAct7;
syms vMax aMax jMax
syms t1 t2 t3 t4 t5 t6 t7
syms sTarget vTarget aTarget  


   

jMaxSub    = 500;
PiSub      = 100;
ViSub      = 50;
AiSub      = 10;
vTargetSub = 0;
pTargetSub = 300;
z=0;
    dir = 1; %direction
 
    jAct1      = dir * jMax;
    aAct1      = int(jAct1,t1) + aAct;
    vAct1      = int(aAct1,t1) + vAct;
    sAct1      = int(vAct1,t1) + sAct;
   
    jAct3      = -jAct1;
    aAct3      = int(jAct3,t3) + aAct1;
    vAct3      = int(aAct3,t3) + vAct1;
    sAct3      = int(vAct3,t3) + sAct1;

    jAct5      = jAct3;
    aAct5      = int(jAct5,t5) + aAct3;
    vAct5      = int(aAct5,t5) + vAct3;
    sAct5      = int(vAct5,t5) + sAct3;
   
    jAct7      = -jAct5;
    aAct7      = int(jAct7,t7) + aAct5;
    vAct7      = int(aAct7,t7) + vAct5;
    sAct7      = int(vAct7,t7) + sAct5;

    f1 = aAct7==0;
    f2 = vAct7==0;
    f3 = sAct7-sTarget;  
    f4 = aAct3==0;

    eq          = [f1,f2,f3,f4];
    searched    = [t1,t3,t5,t7];
   

   
    %Man könnte also die 4. Gleichung nach t1 auflösen und das in die anderen einsetzen.
    t1Sol = solve(eq(4), t1);
    eq = subs(eq(1:3), t1, t1Sol);

    %Dann nochmal die 1. Gleichung nach t5 auflösen und das in die anderen einsetzen.
    t5Sol = solve(eq(1), t5);
    eq = subs(eq(2:3), t5, t5Sol);

    %Dann nochmal die 1. Gleichung nach t7 auflösen und das in die 2. anderen einsetzen.  
    t7Sol = solve(eq(1), t7);
    Sol = subs(eq(2), t7, t7Sol);
   

    %Hier richtiges Ergebnis Yeah!
    %SolSubs(t3) = subs(Sol(2), {jMax,aAct,vAct,sAct,sTarget}, {jMaxSub,AiSub,ViSub,PiSub,pTargetSub});
    %vpaResult = vpasolve(SolSubs,t3)
   

    %Hier nicht nicht :-(
    objMulti = matlabFunction(Sol, 'Vars', [searched, jMax,aAct,vAct,sAct,sTarget]);
    objSingle2 = @(t) norm(objMulti(t(1), t(2), t(3), t(4), jMaxSub,AiSub,ViSub,PiSub,pTargetSub));    
    fminsearch(objSingle2, zeros(4,1)) % Wahl eines sinnvollen Startwerts ist wichtig.    
   
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.01.2021, 21:41     Titel:
  Antworten mit Zitat      
Hallo,

der entscheidende Punkt ist doch, dass du nur noch eine Gleichung hast. Die veränderbaren Variablen sind also nicht mehr searched, sondern nur t3. Das musst du beim matlabFunction-Aufruf und bei der Erstellung des Function Handles sowie beim Startwert für fminsearch anpassen.

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