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

Code Generation / Extrinsic Functions und ein ratloser User

 

geieraffe
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 97
Anmeldedatum: 19.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.01.2014, 14:13     Titel: Code Generation / Extrinsic Functions und ein ratloser User
  Antworten mit Zitat      
Vorab schon mal sorry, falls ich es besser in den Bereich Simulink posten hätte sollen. Dann bitte ich einen Mod es einfach zu verschieben.

So, Hallo,

ich habe ein Problem bei dem ich mich einfach im Kreis drehe bzw. von einer Sackgasse in die nächste rutsche.
Es geht dabei um Code Generation, Extrinsic Functions, Anonymous Functions und Neasted Functions.

Ich fang am besten von vorne an:
Mein erster Versuch meiner Matlabfunction in Simulink sah so aus:

Code:
function [param] = getParam(a, b, c)

tau0 = 0;

fsolve(@(tau)myFunc(tau, a, b, c), tau0)

...

param = tau;

end

function f = myFunc(tau, a, b, c)

f = exp(a / tau) + exp((a + b) / tau) - 2 * exp(a / tau);

end


Die eigentliche Gleichung ist etwas komplexer, spielt ja aber keine Rolle.
Die Antwort von Matlab war:
"... code generation does not support anonymous functions ..."

Blöd dachte ich. Bissl nach gedacht -> neasted functions.
Kurz ausprobiert, aber wie schon gedacht: Code Generations unterstützt das natürlich auch nicht.

Also hab ich die Variablen halt global gesetzt. Ging auch nicht, weil Code Generation 'fsolve()' nicht unterstützt.
Nächster Versuch dann also mit
Code:
coder.extrinsic('fsolve');[/quote].

Sah dann so aus:
[quote]function [param] = getParam(a, b, c)

coder.extrinsic('fsolve');
gobal a b c

tau0 = 0;

fsolve(@myFunc(tau), tau0)

...

param = tau;

end

function f = myFunc(tau)

global a b c

f = exp(a / tau) + exp((a + b) / tau) - 2 * exp(a / tau);

end


Ging aber auch nicht, weil coder.extrinsic keine anonymen functions unterstützt.

So jetzt bin ich am Ende und auf eure Hilfe angewiesen ... wie kann ich meine Gleichung trotzdem lösen?
Private Nachricht senden Benutzer-Profile anzeigen


Rev
Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 02.05.11
Wohnort: ---
Version: MATLAB R2010b
     Beitrag Verfasst am: 13.09.2014, 09:23     Titel:
  Antworten mit Zitat      
Hallo Geieraffe,

konntest du das Problem eigentlich schon lösen? Ich stehe nämlich gerade vor der selben Sache.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.09.2014, 13:24     Titel:
  Antworten mit Zitat      
Hallo,

folgendes funktioniert:

Code:
function param  = getParam(a, b, c)
coder.extrinsic('fsolve');
tau0 = 1;
param = 0;
param = fsolve('myFunc', tau0, [], a, b, c);
% statt [] ggf. Optionen, um z.B. die Textausgabe zu unterdrücken
% zudem würde ich exitflag abfragen
end

und als separate Funktion:
Code:
function f = myFunc(tau,a, b, c)
% Gleichung


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Rev
Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 02.05.11
Wohnort: ---
Version: MATLAB R2010b
     Beitrag Verfasst am: 25.09.2014, 15:25     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Antwort.
Allerdings kann fsolve doch soweit ich weiß nur die Initialwerte für ein Problem übernehmen. Die Parameter (bei dir 'a,b,c') können leider nicht in der Form übergeben werden. Zumindest gibt mir Simulink einen Fehler aus, wenn ich das so versuche.


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

Forum-Meister


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

kannst du mal deinen Versuch sowie die dabei erhaltene Fehlermeldung zur Verfügung stellen?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Rev
Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 02.05.11
Wohnort: ---
Version: MATLAB R2010b
     Beitrag Verfasst am: 26.09.2014, 14:14     Titel:
  Antworten mit Zitat      
Klar,

Habe deinen Vorschlag genau übernommen:
Nur habe ich halt die sich bei jedem Zeitschritt ändernden Matrizen L,R und die konstanten Matrizen A,B

Code:
function X  = fcn(L,A,B,R)
coder.extrinsic('fsolve');
x0    = ones(6,1)

X = fsolve('FK', x0, [], L,A,B,R);
end


Die Funktion FK sieht dann folgendermaßen aus:

Code:
function X  = FK(x,A,B,R,L)

X           = norm((A(1,:)-[x(1) x(2) x(3)]-(R*B(1,:)')'))-norm(L(1,:))+...
                norm((A(2,:)-[x(1) x(2) x(3)]-(R*B(2,:)')'))-norm(L(2,:))+...
                norm((A(3,:)-[x(1) x(2) x(3)]-(R*B(3,:)')'))-norm(L(3,:))+...
                norm((A(4,:)-[x(1) x(2) x(3)]-(R*B(4,:)')'))-norm(L(4,:))+...
                norm((A(5,:)-[x(1) x(2) x(3)]-(R*B(5,:)')'))-norm(L(5,:))+...
                norm((A(6,:)-[x(1) x(2) x(3)]-(R*B(6,:)')'))-norm(L(6,:))+...
                norm((A(7,:)-[x(1) x(2) x(3)]-(R*B(7,:)')'))-norm(L(7,:))+...
                norm((A(8,:)-[x(1) x(2) x(3)]-(R*B(8,:)')'))-norm(L(8,:));
end


Capture.PNG
 Beschreibung:

Download
 Dateiname:  Capture.PNG
 Dateigröße:  33.02 KB
 Heruntergeladen:  410 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

bitte nach Möglichkeit das Modell zur Verfügung stellen, damit man nicht erst alles nachbilden muss.

Ich hatte in meinem Beispiel param vorbelegt, und die Fehlermeldungen legen nahe, dass man das auch in deinem Beispiel mit X machen sollte.

Code:


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Rev
Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 02.05.11
Wohnort: ---
Version: MATLAB R2010b
     Beitrag Verfasst am: 16.10.2014, 16:52     Titel:
  Antworten mit Zitat      
Hallo Harald,

entschuldige bitte, dass ich nicht mehr geantwortet habe. Nur ist das mir vor lauter Euphorie völlig entfallen Wink. Du hattest Recht mit dem Vordefinieren. Jetzt funktioniert alles. Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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