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