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

Funktionsparameter übergeben

 

matlab_dummy

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2010, 17:04     Titel: Funktionsparameter übergeben
  Antworten mit Zitat      
Hi Leute,

mein Problem ist recht einfach, denke ich. Ich möchte eine DGL mit dem Runge-Kutta-Verfahren 4. Ordnung lösen. Dafür verwende ich die Funktion ode45. An ode45 übergebe ich mit @pendel die Funktion pendel. Diese hat aber die festen Eingabeparameter r,a und Omega.

Das Problem liegt darin diese Werte an die Funktion pendel zu übergeben. Der Code sieht wie folgt aus:

Code:
clear all

t0 = 0;      % Startwert f"ur die Zeit
y0 = [pi/2  0]; % Startwert f"ur y0
tfinal = 80;
tspan=[t0 tfinal];

r = 0.2;     % Stärke der Reibung
a = 0;       % Amplitude der treibenden Kraft
Omega = 0;   % Periode der treibenden Kraft

[t,y] = ode45(@pendel,tspan,y0);

plot(y(:,1),y(:,2));


und die Funktion pendel ist so definiert:

Code:
function yprime = pendel(t,y,r,a,Omega)

yprime = [y(2); -r*y(2)-sin(y(1))+a*cos(Omega*t)];

end


Hat irgendjemand ne Idee wie man das macht?

Vielen Dank im Vorraus...

Carlo


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 19.05.2010, 17:24     Titel:
  Antworten mit Zitat      
Hallo

steht sogar in de Hilfe, siehe dazu Doku Example3:
Code:

function test_ode
clear all

t0 = 0;      % Startwert f"ur die Zeit
y0 = [pi/2  0]; % Startwert f"ur y0
y  = rand(5,2);
tfinal = 80;
tspan=[t0 tfinal];

r = 0.2;     % Stärke der Reibung
a = 0;       % Amplitude der treibenden Kraft
Omega = 0;   % Periode der treibenden Kraft

[t,y] = ode45(@(t,y)pendel(t,y,r,a,Omega),tspan,y0);

plot(y(:,1),y(:,2));

function yprime = pendel(t,y,r,a,Omega)

yprime = [y(2); -r*y(2)-sin(y(1))+a*cos(Omega*t)];

 
Private Nachricht senden Benutzer-Profile anzeigen
 
matlab_dummy

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2010, 17:24     Titel:
  Antworten mit Zitat      
Hab es grad rausgefunden! Die Lösung sieht wie folgt aus:

Code:
clear all

t0 = 0;      % Startwert f"ur die Zeit
y0 = [pi/2  0]; % Startwert f"ur y0
tfinal = 80;
tspan=[t0 tfinal];

r = 0.2;     % Stärke der Reibung
a = 0;       % Amplitude der treibenden Kraft
Omega = 0;   % Periode der treibenden Kraft

[t,y] = ode45(@(t,y) pendel(t,y,r,a,Omega),tspan,y0);

plot(y(:,1),y(:,2));


Trotzdem besten Dank!

Carlo
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 19.05.2010, 17:26     Titel:
  Antworten mit Zitat      
Super, hast doch in die Doku geschaut Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
matlab_dummy

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2010, 17:26     Titel:
  Antworten mit Zitat      
Du warst einen Tick schneller Wink

Danke für deine Hilfe! Die Übereinstimmung des Codes ist doch auch schön zu sehen, oder?

Grüße

Carlo
 
Dennis_12345

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2012, 13:29     Titel: ähnliches Problem
  Antworten mit Zitat      
Hallo zusammen,

ich habe im Prinzip das gleiche Problem, nur dass diese Lösung bei mir nicht funktioniert.
Ich habe in Simulink einen Block MATLAB Function erstellt und programmiere in diesem.
Der Code (zumindest der relevante Teil davon) sieht wie folgt aus:

Code:

function [x1, x2, x3, fval]  = fcn(x01,x02,x03,e,f)

x0 = [x01;x02;x03];


% hier stehen Definitionen für A, b, Aeq, beq, lb, ub


coder.extrinsic('fmincon');

[x,fval] = fmincon('funnnn', x0, A, b, Aeq, beq, lb, ub);

x1 = x(1);
x2 = x(2);
x3 = x(3);

 


funnnn sieht sie folgt aus:


Code:

function K = funnnn(x, e, f)


K = (2-x(1))^2 + (x(2)*e)/5 + (x(3)*f - 30)^2;
 


Der Aufruf "coder.extrinsic('fmincon');" ist nötig um die Funktion "fmincon" überhaupt ausführen zu können.
Versuche ich mit auf die oben genannte Art und Weise die Parameter "e" und "f" zu übergeben, also

Code:

[x,fval] = fmincon(@(x)funnnn(x,e,f), x0, A, b, Aeq, beq, lb, ub, 'nonlconn');
 


so erhalte ich folgende Fehlermeldung: "Code generation does not support anonymous function".
Habt ihr eine Idee, wie ich die Parameter e und f trotzdem an die Funktion übergeben kann...?
Vielen Dank!
Dennis
 
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.