From inline to anonymous function
2 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Hello, I've been struggling in trying to migrate the following inline function (which serves as an input to ode45), to an anonymous function. The function is the following:
g = inline(sprintf('[%s; %s]', dx1dt, dx2dt), 't', 'x');
which I merelely converted to:
g = @(t,x) sprintf('[%s; %s]', dx1dt, dx2dt);
I tried a couple of combinations but it seems like, after the @(t,x), the sprintf part does not get evaluated. I think I'm missing something, how I should I solve this?
Edit: Some clarification about the context.
The dx1dt and dx2dt are symbolic functions, and using the inline function the output is the following:
>> g
%Inline function:
% g(t,x) = [x(2); -(2943*cos(x(1)))/200]
0 Kommentare
Antworten (3)
Star Strider
am 13 Mai 2015
Bearbeitet: Star Strider
am 13 Mai 2015
Completely guessing here (because the ‘dx1dt’ and ‘dx2dt’ aren’t shown).
See if this works:
g = @(t,x) [dx1dt(t,x), dx2dt(t,x)];
You may need to experiment with that, perhaps:
g = @(t,x) [dx1dt(t,x); dx2dt(t,x)];
instead, depending on what your functions are and what size vectors they return.
EDIT —
Your ODE function then becomes:
g = @(t,x) [x(2); -(2943*cos(x(1)))/200];
That should work in ode45 (or whatever solver you are using) without further modification.
0 Kommentare
Alfonso Nieto-Castanon
am 13 Mai 2015
Bearbeitet: Alfonso Nieto-Castanon
am 13 Mai 2015
if you have the symbolic toolbox:
g = matlabFunction(sprintf('[%s; %s]', dx1dt, dx2dt));
otherwise your best bet is probably something like:
g = eval(sprintf('@(%s)[%s;%s]',strjoin(symvar(dx1dt),','),dx1dt,dx2dt));
or perhaps simply:
g = eval(sprintf('@(t,x)[%s;%s]',dx1dt,dx2dt));
0 Kommentare
Siehe auch
Kategorien
Mehr zu Function Creation finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!