Problem with "Conversion to logical from sym is not possible."

11 views (last 30 days)
Hello, i am using a really simple example for this problem, which I just can't get to work. I tried most of the examples which where suggested in similiar topics. I defined this function:
function [FDInt] = mg(x)
if x<0.8686
FDInt = 1/(0.27+exp(-x));
else
FDInt = (4/(3*sqrt(pi)))*(x^2 + pi^2/6)^(3/4);
end
end
and I call it here:
syms EF
solve(mg(EF)==10^20, EF)
I get this error message: "Error in mg (line 3) if x<0.8686 " I tried using vpa(x) or double(x) without working. I think the solution should be really easy - however, I just can't get it to work. If someone could give me a hint, that would be nice :-)

Accepted Answer

Star Strider
Star Strider on 4 Jan 2017
There seems to be only one value that meets that criterion. Just use an anonymous function and fzero:
mg = @(x) (x<0.8686).*(1./(0.27+exp(-x))) + (x>=0.8686).*((4./(3*sqrt(pi)))*(x.^2 + pi^2/6).^(3/4));
EF = fzero(@(x) mg(x)-1E+20, 1)
EF =
26.0470e+012

More Answers (2)

Walter Roberson
Walter Roberson on 4 Jan 2017
You are passing a symbolic variable into a function that tests the value with < in the context of an if statement. That is not permitted, because if requires a definite decision and you cannot make a definite decision about whether a symbolic variable has a particular relationship or not.
You can use piecewise() if you have a new enough MATLAB, or you can code with the form that Star Strider shows (but that form can fail if the unselected expression turns out to be infinite)
  2 Comments
Chris Poffel
Chris Poffel on 5 Jan 2017
In Versiion 2015b, I can't find this function. Was it implemented in a 2016-version?
Chris Poffel
Chris Poffel on 5 Jan 2017
Edited: Walter Roberson on 9 Jan 2017
damn. Time to upgrade then. As my argument will be a vector, this would probably the best choice. Thanks

Sign in to comment.


Karan Gill
Karan Gill on 9 Jan 2017
Since you MATLAB isn't new enough to have piecewise, you can use heaviside as a substitute for piecewise.
FDInt = 1/(0.27+exp(-x))*heaviside(x-0.8686) + (4/(3*sqrt(pi)))*(x^2 + pi^2/6)^(3/4)*heaviside(0.8686-x)
But yes, using piecewise is simplest if you can upgrade :)
Karan (Symbolic doc)

Products

Community Treasure Hunt

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

Start Hunting!