Converts a string into a function to plot

So I have mathematic functions like sin(x), cos(x) etc. in a string format that I want to convert into a function so I would be able to plot it.
equ='sin(x)';
f= @(x) equ;
plot(x,f)
error message:
Error using plot
Invalid data argument.

2 Comments

"So I have mathematic functions like sin(x), cos(x) etc. in a string format that I want to convert into a function..."
Your example contains no strings or character arrays at all:
equ=sin(x);
f= @(x) equ;
This makes your question difficult to interpret. Do you actually have a character vector? E.g.:
str = 'sin';
Please show the actual definition of your input data.
Sorry, it seems like I missed out on '' when I changed my code to make it simple here.

Sign in to comment.

 Accepted Answer

Stephen23
Stephen23 on 4 Sep 2020
Edited: Stephen23 on 4 Sep 2020
>> equ = 'sin(x)';
>> fun = str2func(sprintf('@(x)%s',equ));
>> fun(pi/2)
ans =
1

6 Comments

Thank you so much. What does this part mean though out of curiosity --> @(x)%s?
So I tried out your code, it does work when you only use it like you did fun(pi/2) but it somehow doesn't let me plot it.
"What does this part mean though out of curiosity --> @(x)%s?"
If you had provided a string which was simply the name of a function, e,g.:
>> equ = 'sin';
then it would be possible to just call str2func on it directly, its output would be a handle to that function:
>> fun = str2func(equ);
>> fun(pi/2)
ans = 1
But what you gave us is a formula involving x (that formula can be arbitrarily complex, but it is clearly defined with the independent variable x). Therefore we have to create an anonymous function (which is your entire formula) defined in terms of your independent variable (x) and return a handle to that.
So the sprintf lets us define that anonymous function. If you print it clearly looks just like an anonymous function definition (except that it is actually a character vector):
>> equ = 'sin(x)';
>> sprintf('@(x)%s',equ)
ans = @(x)sin(x)
Then str2func converts that character vector into a handle to an actual anonymous function.
Thanks I get that part now, but still cannot plot the graph. I still get the same error when try to plot it.
"it does work when you only use it like you did fun(pi/2) but it somehow doesn't let me plot it."
I have no problems plotting it. As you did not show your code I have no way to debug what you tried.
"...but still cannot plot the graph. I still get the same error when try to plot it."
Not only is your code a secret, so is the error message that you get. No information -> no debugging help.
Well, it works for me. Lets try it together using two different plotting commands:
>> equ = 'sin(x)';
>> fun = str2func(sprintf('@(x)%s',equ));
>> X = linspace(-2*pi,2*pi,101);
>> Y = fun(X);
>> plot(X,Y)
>> ezplot(fun)
I found out I can't directly plot fun, but gotta go through fun(x). Thanks a lot! You really helped me a lot there :)

Sign in to comment.

More Answers (1)

equ=sin(x);
f= @(x) equ;
x = linspace(0,2*pi) ;
plot(x,f(x))

Asked:

on 4 Sep 2020

Commented:

on 4 Sep 2020

Community Treasure Hunt

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

Start Hunting!