From inline to anonymous function
3 views (last 30 days)
Show older comments
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 Comments
Answers (3)
Star Strider
on 13 May 2015
Edited: Star Strider
on 13 May 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 Comments
Alfonso Nieto-Castanon
on 13 May 2015
Edited: Alfonso Nieto-Castanon
on 13 May 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 Comments
See Also
Categories
Find more on Function Creation in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!