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

2 次查看(过去 30 天)
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 :-)

采纳的回答

Star Strider
Star Strider 2017-1-4
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

更多回答(2 个)

Walter Roberson
Walter Roberson 2017-1-4
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 个评论
Chris Poffel
Chris Poffel 2017-1-5
In Versiion 2015b, I can't find this function. Was it implemented in a 2016-version?
Chris Poffel
Chris Poffel 2017-1-5
编辑:Walter Roberson 2017-1-9
damn. Time to upgrade then. As my argument will be a vector, this would probably the best choice. Thanks

请先登录,再进行评论。


Karan Gill
Karan Gill 2017-1-9
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)

标签

产品

Community Treasure Hunt

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

Start Hunting!

Translated by