MATLAB Answers

0

From inline to anonymous function

Asked by Francesco Wanderlingh on 13 May 2015
Latest activity Edited by Alfonso Nieto-Castanon on 13 May 2015
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

Sign in to comment.

3 Answers

Answer by Star Strider
on 13 May 2015
Edited by 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

Sign in to comment.


Answer by Walter Roberson
on 13 May 2015

g = matlabFunction([dx1dt, dx2dt], [t,x]);

  0 Comments

Sign in to comment.


Answer by Alfonso Nieto-Castanon on 13 May 2015
Edited by 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

Sign in to comment.