Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

MATLAB und Simulink in der Ingenieurpraxis

Studierende:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Gleichungssystem Lösen

 

gangsterbob
Themenstarter

Forum-Anfänger

Forum-Anfänger


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

ja du hast recht! Es funktioniert Very Happy ! Vielen Dank!

Ein bisschen unübersichtlich mit dem functionHandle...

Ich werde es Montag mal im Coder testen. Die aktuelle Ausführungszeit liegt bei 0.011s.
Also etwa Faktor 8 schneller, als bei einer reinen Numerischen Lösung. Mal schauen wieviel Rechnenzeit es so benötigt. Der Autor selbst verwendet ein spezielles Näherungsverfahren nach "anderson björck king".

Übrigens verwende ich eine Matlab Function in Simulink. Der Coder für die spezielle HW kann leider nicht ohne Simulink....
Bei bisherigen Projekten habe ich allerdings gute Erfahrungen damit gemacht. Scheint recht effizient zu sein.

Evtl. bist du ja mal so nett und vergleichst die Ausführungszeit zwischen fminSearch und fsolve. Sollte dieser entscheident sein, könnte ich mal die Toolbox zum testen anfordern...

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

    %Ergebis
    objMulti = matlabFunction(Sol(2), 'Vars', [t3, jMax,aAct,vAct,sAct,sTarget]);
    objSingle2 = @(t) norm(objMulti(t, jMaxSub,AiSub,ViSub,PiSub,pTargetSub));
    tic
    fminsearch(objSingle2, zeros(4,1)) % Wahl eines sinnvollen Startwerts ist wichtig.
    toc
 


Gruß Daniel
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

wie gesagt: du musst bei fminsearch den Startwert anpassen! Ich müsste mir zugegebenermaßen überlegen, was bei dem Vektor genau passiert, aber es ist hier wirklich nicht sinnvoll und kostet viel Zeit!

Code:
objSingle = @(t) objMulti(t, jMaxSub,AiSub,ViSub,PiSub,pTargetSub);

objSingle2 = @(t) norm(objMulti(t, jMaxSub,AiSub,ViSub,PiSub,pTargetSub));
tic
fminsearch(objSingle2, 0) % Wahl eines sinnvollen SKALAREN!! Startwerts ist wichtig.
toc % ca. 0.0015s
tic
fsolve(objSingle, 0)
toc % ca. 0.003 - 0.004s


Mit Standardoptionen ist fsolve eher langsamer. Ob das beim generierten Code genauso ist und ob man z.B. auch mit Optionen etwas rausholen kann, kommt auf den Versuch an. Zum Testen kann man sich bei MathWorks ja eine Trial-Lizenz holen.

So oder so: ich vermute, dass sich jMaxSub,AiSub,ViSub,PiSub,pTargetSub für jeden Iterationsschritt ändern. Ich vermute aber auch, dass sie sich nicht extrem stark ändern. Das bedeutet, dass das gefundene t3 für einen Simulationsschritt ein (sehr) guter Startwert für den nächsten Schritt sein dürfte.

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: 20
Anmeldedatum: 17.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2021, 23:10     Titel:
  Antworten mit Zitat      
Hallo,

vielen dank für den Test!

Zitat:

So oder so: ich vermute, dass sich jMaxSub,AiSub,ViSub,PiSub,pTargetSub für jeden Iterationsschritt ändern.


Diese Werte sind Konstant für die jeweilige Berechnung.


Ich habe es jetzt versucht in einer MatlabFunction in Simulink zu verweden.
Allerdings werden einige Fehlermeldungen ausgegeben.

Ist die Funktion dort anwendbar? Sonst muss ein eigenes Näherungsverfahren implementiert werden...

Danke und Gruß Daniel

Code:


jMaxSub    = 500;
PiSub      = 100;
ViSub      = 50;
AiSub      = 10;
vTargetSub = 0;
pTargetSub = 300;

    t7Solxxx =  sAct - sTarget - (aAct - jMax*t3)^3/(6*jMax^2) + (jMax*t3^3)/3 + t3*(vAct + (aAct - jMax*t3)^2/(2*jMax) - (aAct*(aAct - jMax*t3))/jMax) - (vAct*(aAct - jMax*t3))/jMax - (2^(1/2)*(- aAct^2 + 2*jMax^2*t3^2 + 2*vAct*jMax)^(3/2))/(8*jMax^2) + (aAct*(aAct - jMax*t3)^2)/(2*jMax^2) + (2^(1/2)*(- aAct^2 + 2*jMax^2*t3^2 + 2*vAct*jMax)^(1/2)*(vAct + (aAct - jMax*t3)^2/(2*jMax) + (jMax*t3^2)/2 - (- aAct^2 + 2*jMax^2*t3^2 + 2*vAct*jMax)/(4*jMax) - (aAct*(aAct - jMax*t3))/jMax))/(2*jMax) + (2^(1/2)*(- aAct^2 + 2*jMax^2*t3^2 + 2*vAct*jMax)^(1/2)*(vAct + (aAct - jMax*t3)^2/(2*jMax) + (jMax*t3^2)/2 - (aAct*(aAct - jMax*t3))/jMax))/(2*jMax);
 
    %Ergebis
    objMulti = matlabFunction(t7Solxxx, 'Vars', [t3, jMax,aAct,vAct,sAct,sTarget]);
    objSingle2 = @(t) norm(objMulti(t, jMaxSub,AiSub,ViSub,PiSub,pTargetSub));
    %tic
    t3Result = fminsearch(objSingle2, zeros(4,1)) % Wahl eines sinnvollen Startwerts ist wichtig.
    %toc


 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Diese Werte sind Konstant für die jeweilige Berechnung.

Dann berechne sie doch vorab, z.B. in der InitFcn, statt in jedem Iterationsschritt?

Zitat:
Allerdings werden einige Fehlermeldungen ausgegeben.

Bitte die Fehlermeldungen angeben und/oder ein Beispielmodell angeben, damit man sieht, wo und wie du das eingebaut hast.

... und ändere bitte den Startwert in 0, oder einen sinnvollen Skalar!!

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: 20
Anmeldedatum: 17.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2021, 23:38     Titel:
  Antworten mit Zitat      
Hallo,

ich denke ich habe mich falsch ausgedrückt. In der realen Anwendung auf dem Echtzeitsystem sind diese natürlich variabel.

Im Anhang befindet sich ein Testmodell.

Fehler gibt es folgende:


Simulink does not have enough information to determine output sizes for this block. If you think the errors below are inaccurate, try specifying types for the block inputs and/or sizes for the block outputs.
Component:MATLAB Function | Category:Coder error
Undefined function or variable 'matlabFunction'.

Function 'MATLAB Function' (#71.764.831), line 12, column 12:
"matlabFunction(t7Solxxx, 'Vars', [t3, jMax,aAct,vAct,sAct,sTarget])"
Launch diagnostic report.
Component:MATLAB Function | Category:Coder error
Undefined function or variable 'objMulti'. The first assignment to a local variable determines its class.

Function 'MATLAB Function' (#71.846.906), line 13, column 14:
"@(t) norm(objMulti(t, jMaxSub,AiSub,ViSub,PiSub,pTargetSub))"
Launch diagnostic report.
Component:MATLAB Function | Category:Coder error
Undefined function or variable 'objSingle2'. The first assignment to a local variable determines its class.

Function 'MATLAB Function' (#71.928.938), line 15, column 16:
"objSingle2"
Launch diagnostic report.
Component:MATLAB Function | Category:Coder error
Errors occurred during parsing of MATLAB function 'MATLAB Function'
Component:MATLAB Function | Category:Coder error
Simulink cannot determine sizes and/or types of the outputs for block 'MATLAB Function' due to errors in the block body, or limitations of the underlying analysis. The errors might be inaccurate. Fix the indicated errors, or explicitly specify sizes and/or types for all block outputs.
Component:MATLAB Function | Category:Coder error
Simulink cannot determine sizes and/or types of the outputs for block 'MATLAB Function' due to errors in the block body, or limitations of the underlying analysis. The errors might be inaccurate. Fix the indicated errors, or explicitly specify sizes and/or types for all block outputs.
Component:Simulink | Category:Model error
Error occurred in 'FminTest1a/MATLAB Function'.
Component:Simulink | Category:Model error


Danke und Gruß Daniel

FminTest1a.slx
 Beschreibung:

Download
 Dateiname:  FminTest1a.slx
 Dateigröße:  21.44 KB
 Heruntergeladen:  16 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
gangsterbob
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 17.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2021, 13:59     Titel:
  Antworten mit Zitat      
So,ich habe den Fehler gefunden...er saß vorm Rechner. Denke es war zu spät gestern.

Natürlich brauche ich die Funktion nicht von Symbolisch auf "normal" zu convertieren...

Matlab Function:

Code:

function y = fcn(sTarget,sAct,vAct,aAct,jMax)


objSingle2 = @(t) norm(t7Solution(t, jMax,aAct,vAct,sAct,sTarget));

y = fminsearch(objSingle2, 0) % Startwert 0
 


t7Solution:

Code:

function y = t7Solution(t3, jMax,aAct,vAct,sAct,sTarget)


y = sAct - sTarget - (aAct - jMax*t3)^3/(6*jMax^2) + (jMax*t3^3)/3 + t3*(vAct + (aAct - jMax*t3)^2/(2*jMax) - (aAct*(aAct - jMax*t3))/jMax) - (vAct*(aAct - jMax*t3))/jMax - (2^(1/2)*(- aAct^2 + 2*jMax^2*t3^2 + 2*vAct*jMax)^(3/2))/(8*jMax^2) + (aAct*(aAct - jMax*t3)^2)/(2*jMax^2) + (2^(1/2)*(- aAct^2 + 2*jMax^2*t3^2 + 2*vAct*jMax)^(1/2)*(vAct + (aAct - jMax*t3)^2/(2*jMax) + (jMax*t3^2)/2 - (- aAct^2 + 2*jMax^2*t3^2 + 2*vAct*jMax)/(4*jMax) - (aAct*(aAct - jMax*t3))/jMax))/(2*jMax) + (2^(1/2)*(- aAct^2 + 2*jMax^2*t3^2 + 2*vAct*jMax)^(1/2)*(vAct + (aAct - jMax*t3)^2/(2*jMax) + (jMax*t3^2)/2 - (aAct*(aAct - jMax*t3))/jMax))/(2*jMax);

end
 



Vielen Dank nochmal für die Hilfe an Harald!

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

Forum-Meister


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

wenn ich das richtig sehe, bekommst du da allerdings keine Lösung für t7, sondern für t3. Insofern finde ich den Funktionsnamen t7Solution etwas irritierend.

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: 20
Anmeldedatum: 17.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2021, 21:28     Titel:
  Antworten mit Zitat      
Hallo,
da hast du vollkommen recht 🙈, werde ich anpassen. Naja es funktioniert jedenfalls. Morgen mal die Performance testen.

Gruß Daniel
Private Nachricht senden Benutzer-Profile anzeigen
 
gangsterbob
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 17.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2021, 10:56     Titel:
  Antworten mit Zitat      
Hallo

Ich habe es auf dem Echtzeitsystem gestet. Es läuft. Very Happy

Die Ausführungsdauer beträgt etwa 1-2us, das echt super!

Weiterhin musste ich den Startwert (auch in der Simulation) von 0 auf 1 setzen...

Beispielsweise:

jMaxSub = 500;
PiSub = 100;
ViSub = -50;
AiSub = -300;
pTargetSub = 300;

Mit bestimmten Eingangsparametern funktioniert es sonst nicht. Was kann die Ursache sein.


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

Forum-Meister


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

Zitat:
Mit bestimmten Eingangsparametern funktioniert es sonst nicht.

Wie äußert sich das?
Was genau machst du eigentlich gerade?
Mir ist die Zuordnung von den fünf hier genannten Variablen zu den letzten fünf Variablen in t7Solution nicht klar.

Zitat:
Was kann die Ursache sein.

Dazu müsste man erst mal wissen, was das genaue Problem ist.
Generell kann es aber bei nichtlinearer Optimierung sein, dass ein lokales Minimum statt dem globalen Minimum (hier bei y = 0) gefunden wird. Ein lokales Minimum ist dann aber keine Lösung der Gleichung. Hier könnte fsolve besser funktionieren.
Zudem kann es sein, dass es mehrere Lösungen gibt. Je nach Startwert werden fminsearch oder fsolve dann eine unterschiedliche Lösung finden. Deswegen hatte ich auch die Wichtigkeit eines vernünftigen Startwerts betont.

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: 20
Anmeldedatum: 17.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2021, 12:24     Titel:
  Antworten mit Zitat      
Hallo,

ok ich hatte bei t7Solution ja noch den Tippfehler. Die Funktion heisst nun "t3Solution". Evtl. ist die Namensgebung nicht Sinnvoll. T3 muss in dieser Funktion ja erst mit FminSearch ermittelt werden...

Code:

function y = t3Solution(t3, jMax,aAct,vAct,sAct,sTarget,dir)

y= sAct - sTarget + t3*(vAct + (aAct - dir*jMax*t3)^2/(2*dir*jMax) - (aAct*(aAct - dir*jMax*t3))/(dir*jMax)) + (dir*jMax*t3^3)/3 - (aAct - dir*jMax*t3)^3/(6*dir^2*jMax^2) + (aAct*(aAct - dir*jMax*t3)^2)/(2*dir^2*jMax^2) - (2^(1/2)*(- aAct^2 + 2*dir^2*jMax^2*t3^2 + 2*vAct*dir*jMax)^(3/2))/(8*dir^2*jMax^2) - (vAct*(aAct - dir*jMax*t3))/(dir*jMax) + (2^(1/2)*(- aAct^2 + 2*dir^2*jMax^2*t3^2 + 2*vAct*dir*jMax)^(1/2)*(vAct + (dir*jMax*t3^2)/2 + (aAct - dir*jMax*t3)^2/(2*dir*jMax) - (- aAct^2 + 2*dir^2*jMax^2*t3^2 + 2*vAct*dir*jMax)/(4*dir*jMax) - (aAct*(aAct - dir*jMax*t3))/(dir*jMax)))/(2*dir*jMax) + (2^(1/2)*(- aAct^2 + 2*dir^2*jMax^2*t3^2 + 2*vAct*dir*jMax)^(1/2)*(vAct + (dir*jMax*t3^2)/2 + (aAct - dir*jMax*t3)^2/(2*dir*jMax) - (aAct*(aAct - dir*jMax*t3))/(dir*jMax)))/(2*dir*jMax)
 
end

 


Kommt die Anforderung für die Berechnung der Zeiten t1,t3,t5 und t7 wird die Berechnung einmal durchlaufen.

Jede Berechnung hat in der Regel andere Startparameter.

jMax = 500;
aAct = -300;
vAct = -50;
sAct = 100;
sTarget = 130;
dir = 1
Die Berechnung von t3 erfolgt (wie schon ermittelt) folgendermaßen


Code:

    objSingle2 = @(t) norm(t3Solution(t, jMax,aAct,vAct,sAct,sTarget,dir));
    t3 = abs(fminsearch(objSingle2, 1))
 



Bei diesem Parameter funktioniert es mit Startwert 1. Ändere ich den Startwert auf 0, kommt folgende Fehlermeldung. Und t3Solution öffnet sich im Editor.

Call to MATLAB function aborted: Domain error. To compute complex results, make at least one input complex, e.g. 'power(complex(a),b)'.

Zitat:
Je nach Startwert werden fminsearch oder fsolve dann eine unterschiedliche Lösung finden. Deswegen hatte ich auch die Wichtigkeit eines vernünftigen Startwerts betont.


Ja da hast du recht. Ich kenne mich mit den Solvern noch nicht so gut aus...
Daher ist die Frage welcher Startwert optimal ist. Evtl. muss ich mir dann doch noch die optimization toolbox zu testen besorgen.

Gruß Daniel
Private Nachricht senden Benutzer-Profile anzeigen
 
gangsterbob
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 17.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2021, 14:32     Titel:
  Antworten mit Zitat      
Ok, ich denke ich habe das Problem gelöst. Wer lesen kann ist klar im Vorteil... Very Happy
Ich habe die Variable t3 zu einer Komplexen gemacht.

Code:

function y = t3Solution(t3, jMax,aAct,vAct,sAct,sTarget,dir)

t3Complex =complex(t3);
y= sAct - sTarget + t3Complex*(vAct + (aAct - dir*jMax*t3Complex)^2/(2*dir*jMax) - (aAct*(aAct - dir*jMax*t3Complex))/(dir*jMax)) + (dir*jMax*t3Complex^3)/3 - (aAct - dir*jMax*t3Complex)^3/(6*dir^2*jMax^2) + (aAct*(aAct - dir*jMax*t3Complex)^2)/(2*dir^2*jMax^2) - (2^(1/2)*(- aAct^2 + 2*dir^2*jMax^2*t3Complex^2 + 2*vAct*dir*jMax)^(3/2))/(8*dir^2*jMax^2) - (vAct*(aAct - dir*jMax*t3Complex))/(dir*jMax) + (2^(1/2)*(- aAct^2 + 2*dir^2*jMax^2*t3Complex^2 + 2*vAct*dir*jMax)^(1/2)*(vAct + (dir*jMax*t3Complex^2)/2 + (aAct - dir*jMax*t3Complex)^2/(2*dir*jMax) - (- aAct^2 + 2*dir^2*jMax^2*t3Complex^2 + 2*vAct*dir*jMax)/(4*dir*jMax) - (aAct*(aAct - dir*jMax*t3Complex))/(dir*jMax)))/(2*dir*jMax) + (2^(1/2)*(- aAct^2 + 2*dir^2*jMax^2*t3Complex^2 + 2*vAct*dir*jMax)^(1/2)*(vAct + (dir*jMax*t3Complex^2)/2 + (aAct - dir*jMax*t3Complex)^2/(2*dir*jMax) - (aAct*(aAct - dir*jMax*t3Complex))/(dir*jMax)))/(2*dir*jMax)

end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich bin mir offen gesagt nicht sicher, ob dies das Problem (und alle Probleme) löst. Ich hatte mal nebenbei probiert, bin aber nicht zum Schreiben der Antwort gekommen.

Ich würde mir auf jeden Fall auch das zweite Rückgabeargument von fminsearch zurückholen:

Code:
[t3, f] = fminsearch(objSingle2, 0)
t3 =
   -0.4764
f =
   17.7530
[t3, f] = fminsearch(objSingle2, 1)
t3 =
    0.7666
f =
   1.0397e-04

Mit anderen Worten: das erste ist eigentlich keine Lösung.

Mit fsolve zum Vergleich:
Code:

objSingle = @(t) t3Solution(t, jMax,aAct,vAct,sAct,sTarget,dir);
[t3, f] = fsolve(objSingle, 0)
Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.

<stopping criteria details>
t3 =
  -1.1884 - 0.0000i
f =
   1.7496e-10 + 9.5619e-11i

Equation solved.

[t3, f] = fsolve(objSingle, 1)
fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.

<stopping criteria details>
t3 =
    0.7666
f =
   1.8474e-13
 

Man findet so also unterschiedliche Lösungen.

Weitere Alternative: fminbnd (benötigt keine Toolboxen, unterstützt Codegenerierung)
Code:
[t3, f] = fminbnd(objSingle2, 0, 10)
t3 =
    0.7666
f =
    0.0077


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: 20
Anmeldedatum: 17.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2021, 16:53     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine ausführliche Antwort.

Ich habe nun einige Tests mit Startwert 1 gemacht. War bisher immer korrekt. Allerdings muss ich noch weitere Tests mit anderen Anfangsparamtern (aAct,vAct usw.) machen.

Ich werde mir die Tage eine Testversion mit Optimization toolbox installieren. Dann mal weitere Tests machen.

Eine Info nebenbei:
Es werden übrigens beide Gleichungen von t7Sol und somit auch t3Sol benötigt, da eine Fallunterscheidung gemacht werden muss.
Interessant wäre für mich was bei einer reinen numerischen Lösung mit fSolve heraus kommen würde. Auch die Ausführungszeit auf dem Echtzeitsystem... Werde ich irgendwann mal ausprobieren Smile

Ich mache dann morgen erst weiter.

Danke und Gruß Daniel
Private Nachricht senden Benutzer-Profile anzeigen
 
gangsterbob
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 17.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2021, 16:41     Titel:
  Antworten mit Zitat      
Hallo,

ich habe weiterhin korrekte Ergebnisse mit fminSearch gehabt.
Heute habe ich keine Tests auf dem Echtzeitsystem gemacht.

Ich werde die Tage eine Rückmeldung geben ob fminbnd evtl. eine bessere Performance hat.

Gruß Daniel
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2021 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.