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

5 次查看(过去 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)

类别

Help CenterFile Exchange 中查找有关 Assumptions 的更多信息

标签

产品

Community Treasure Hunt

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

Start Hunting!

Translated by