Converting Anonymous Function to a Symbolic Function

Hello,
I have an anonymous function that looks like this (v=velocity, t=time):
v = @(t) exp(1).^(sin(t)) - 1;
and I want to turn it into a symbolic function. How can I achieve this?

 Akzeptierte Antwort

Adam Danz
Adam Danz am 11 Mär. 2019
Bearbeitet: Adam Danz am 28 Mär. 2019
Is this what you're looking for?
v = @(t) exp(1).^(sin(t)) - 1;
sym(v)
%ans =
%(3060513257434037/1125899906842624)^sin(t) - 1
% where 3060513257434037/1125899906842624 is an approximation of exp(1)

3 Kommentare

+1
I love you
Or equivalently,
sym t
v(t)
Caution: not everything can be converted these ways, and not everything will convert the way you expect.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

v = @(t) exp(1).^(sin(t)) - 1;
str2sym(char(v)) %r2017b or later
ans = 

1 Kommentar

Ryan
Ryan am 19 Okt. 2021
Bearbeitet: Ryan am 19 Okt. 2021
doesnt work with nested functions ... :(
ie
www = @(t) t+1
yyy = @(t) www(t)+1

Melden Sie sich an, um zu kommentieren.

madhan ravi
madhan ravi am 29 Mär. 2019
Bearbeitet: madhan ravi am 29 Mär. 2019
This turns the function handle argument as symbolic variable as well as the function handle into a symbolic function:
V=func2str(v);
z=regexp(V,'[^()]*','match');
syms(regexp(z{2},'\,','split'))
str2sym(regexp(V,'(?<=[\)])\S*','match')) % requires 2017b or later
sym(regexp(V,'(?<=[\)])\S*','match','once')) % prior to 2017b (haven't tested)

7 Kommentare

just fine. On Matlab 2019b, MAcOsX Catalina. Thanks
This is the only one that works for me on 2021a, macOS
@Pho Hale hmmm... are you getting an error? I don't have a mac so I can't test it but I don't have problems with any of the solutions here in Windows 10 (matlab r2021a).
Adam's answer https://www.mathworks.com/matlabcentral/answers/449489-converting-anonymous-function-to-a-symbolic-function#answer_364896 works fine for me on Mac in R2021a -- recognizing that exp(1) is going to be treated numerically and give an approximation, and will not be automatically rewritten in terms of the exp() function.
%at = 1;
%bt = 1;
w = @(k,T) log(1 - exp(-k.^2 + 1/T)).*(at./k + bt*k)
w = function_handle with value:
@(k,T)log(1-exp(-k.^2+1/T)).*(at./k+bt*k)
a = @(T) exp(2);
b = @(T) exp(3);
W1 = @(T) integral(@(k) w(k,T), a(T), b(T) )
W1 = function_handle with value:
@(T)integral(@(k)w(k,T),a(T),b(T))
W = sym(W1)
Unrecognized function or variable 'at'.

Error in solution>@(k,T)log(1-exp(-k.^2+1/T)).*(at./k+bt*k) (line 3)
w = @(k,T) log(1 - exp(-k.^2 + 1/T)).*(at./k + bt*k)

Error in solution>@(k)w(k,T) (line 6)
W1 = @(T) integral(@(k) w(k,T), a(T), b(T) )

Error in integralCalc/iterateScalarValued (line 314)
fx = FUN(t);

Error in integralCalc/vadapt (line 132)
[q,errbnd] = iterateScalarValued(u,tinterval,pathlen);

Error in integralCalc (line 75)
[q,errbnd] = vadapt(@AtoBInvTransform,interval);

Error in integral (line 87)
Q = integralCalc(fun,a,b,opstruct);

Error in solution>@(T)integral(@(k)w(k,T),a(T),b(T)) (line 6)
W1 = @(T) integral(@(k) w(k,T), a(T), b(T) )

Error in sym>funchandle2ref (line 1594)
S = x(S{:});

Error in sym>tomupad (line 1507)
x = funchandle2ref(x);

Error in sym (line 273)
S.s = tomupad(x);
I am trying to conver W1 into a symbolic function tried str2sym as well. It is not working eitherways
You cannot convert calls to integral() into symbolic calls -- not unless you do text manipulation.
I recommend that you give up on this.
The problem occurs well before the sym call.
%at = 1;
%bt = 1;
w = @(k,T) log(1 - exp(-k.^2 + 1/T)).*(at./k + bt*k)
w = function_handle with value:
@(k,T)log(1-exp(-k.^2+1/T)).*(at./k+bt*k)
try % Using try/catch so I can evaluate other code later in this comment
w(1, 2)
catch ME
fprintf("MATLAB threw the following error:\n\n%s\n", ME.message)
end
MATLAB threw the following error: Unrecognized function or variable 'at'.
Neither at nor bt are defined before the anonymous function w is defined, and neither of those identifiers are specified in the list of input arguments. Therefore they are left undefined. When you try to evaluate the anonymous function, MATLAB checks to see if there are functions named at and bt that can be called with 0 input arguments; if there are, it can call them and use their output in the anonymous function.
Since there are no such functions, MATLAB complains that it cannot evaluate the anonymous function.
If all the operations you perform in your anonymous function were supported for symbolic variables, you could just evaluate the anonymous function.
f = @(x) sin(x)+cos(1/x)-exp(x^2);
syms t
ft = f(t) % sin, cos, exp, /, and ^ are all defined for sym objects
ft = 
But if you know you're going to want to integrate symbolically, don't call the numeric integration function integral and then convert the result to a symbolic expression. Call the symbolic integration function int instead.

Melden Sie sich an, um zu kommentieren.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by