How can I use the symbolic expression with a logical OR operator...(both being parts of the condition for a while loop)

I am trying to create a while loop as follows:
while (abs(C(X,U)-gamma)>=eps1)||(abs(Lbar_u(X,U)))
if abs(Lbar_u(X,U))>=eps2
k=k+1;
U=U-K*Lbar_u(X,U);
if abs(C(X,U)-gamma)>=eps1
X=X-inv(Cx(X,U))*(C(X,U)-gamma)
end
end
elseif abs(C(X,U)-gamma)>=eps1
X=X-inv(Cx(X,U))*(C(X,U)-gamma)
end
end
THE ERROR MESSAGE WHICH I GET IS AS FOLLOWS:
"Conversion to logical from sym is not possible"
what can I do??

11 Comments

Which of your variable was created by sym() or syms ?
Also, I recommend you recheck the second part of your "while" condition. At the moment it is testing whether abs(Lbar_u(X,U)) is non-zero.
eps1,eps2,X,U and C were declared syms and all other were declared global. Here is the corrected version of the while condition and thanks for pointing that typing error out. so here is the code again:
while (abs(C(X,U)-gamma)>=eps1)||(abs(Lbar_u(X,U))>=eps2)
if abs(Lbar_u(X,U))>=eps2
k=k+1;
U=U-K*Lbar_u(X,U);
if abs(C(X,U)-gamma)>=eps1
X=X-inv(Cx(X,U))*(C(X,U)-gamma)
end
end
elseif abs(C(X,U)-gamma)>=eps1
X=X-inv(Cx(X,U))*(C(X,U)-gamma)
end
end
That "while" looks exactly the same as the previous one, and still is checking whether Lbar_u(X,U) is non-zero.
If eps1, eps2, X, U, and C are all syms, then the first clause in your "while"
(abs(C(X,U)-gamma)>=eps1)
is trying to access a symbolic variable at a pair of symbolic indexes, and subtract a known value from the symbolic result, which is of course going to give a symbolic result since almost all of the expression was symbolic. Then you take the abs() of that symbolic result, giving a symbolic result. You then try to use >= to compare that symbolic result to the symbolic value eps1. And you are expecting a "true" or "false" answer ???
i just changed the while loop....please check....i had forgotten to put >=eps2 in the second part of the while condition. I am expecting the loop to just carry on until both the conditions turn false and hence the loop is terminated. I had assigned gamma=1.
Okay, I see the second part of the loop condition changed now. But the first part of it still has the same analysis: that you are ending up trying to use ">" to compare a symbolic expression to a symbolic variable that has no obvious algebraic relationship. How can you expect to get a true/false answer?
okey....lets consider first part...abs(C(X,U)-gamma)>=eps1 .....now actually when I write C(X,U)..i am expecting to call the earlier defined function as C(X,U)=X+U: now within the loop i am expecting to see the changes in the value of X and U so that when I write C(X,U)in the while condition, it is evaluated at the updated value of X and U and then the comparison happens. And I want to continue the loop until both the comparisons are dissatisifed and hence the loop is no longer executed. That is why I used OR operator.
You indicated, though, that X and U and eps1 are symbolic. With X and U symbolic, X+U would be symbolic, and abs(X+U-1) would be symbolic, so you would be comparing a symbolic expression to eps1 which you also indicated is symbolic.
yes....so is there anyhting wrong in doing so......as far as i believe we cudnt use this logical operator for these symbolic expressions....and i beleive that due to the error message I got when I ran the code. "Conversion to logical from sym is not possible"....but I a still new to matlab....so please correct me wheere I am wrong...
There are circumstances under which it makes sense to use logical operators with symbolic expressions, but a "while" condition is not suitable.
In some cases what would be suitable would be constructing a piecewise expression. I do not think your while loop is suitable for that, though.
If you had actual values to work with for X and U and eps1 and eps2, then you could use subs() to create symbolic numeric values that could be compared, something like
double(subs(abs(C(X,U)-gamma))) > double(eps1)
though usually there are more efficient ways to code, such as using matlabFunction()
I got the point you are trying to make here. My next biggest challenge is now to achieve the same goal(i.e execution of all the statements following the while condition, as long as those 2 inequalities in the condition part are hold true). Now, how can I achieve that without using the while loop.

Sign in to comment.

Answers (0)

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Asked:

on 26 Mar 2013

Community Treasure Hunt

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

Start Hunting!