Turning imaginary numbers into real numbers

29 views (last 30 days)
Hello there!
I am attempting to find the points where n = S with the following equations. Whenever S goes into the imaginary plane though, I want it to convert to S = 1. Even though I have a check for that in this code, for some reason MATLAB seems to be ignoring that bit and converting S into 0 instead. How can I fix this?
for k = 1:1:100
n = (100 / k);
s = sqrt((((.25*(n-(.5*(100-n))))/(n))-.25)/(-((n - .5*(100-n)))/(n)));
if (0<=s) && (s<=1)
s = s;
elseif s > 1
s = 1;
elseif (isnan(s)==1)
s = 1;
elseif (isreal(s)==0)
s = 1;
else
s = 1;
end
RTDlineark{k} = [k];
RTDlinearkn{k} = [n];
RTDlinearks{k} = [s];
end

Accepted Answer

Birdman
Birdman on 12 Feb 2018
To get rid of that, your code can be improved as follows:
for k = 1:1:100
n = (100 / k);
s = sqrt((((.25*(n-(.5*(100-n))))/(n))-.25)/(-((n - .5*(100-n)))/(n)));
if (0<s) && (s<=1)
s = s;
elseif s > 1
s = 1;
elseif (real(s)>=0) && imag(s)~=0
s = 1;
end
RTDlineark{k} = [k];
RTDlinearkn{k} = [n];
RTDlinearks{k} = [s];
end
  1 Comment
Walter Roberson
Walter Roberson on 12 Feb 2018
This happens to work with the data, but still suffers from the problem of using < and <= operators on complex quantities, as those operators are defined to ignore the complex component.

Sign in to comment.

More Answers (2)

Andrei Bobrov
Andrei Bobrov on 12 Feb 2018
k = 1:100;
n = 100 ./ k;
s = sqrt( (.25*(n-.5*(100-n))./n-.25)./-(n - .5*(100-n))./n );
t = abs(imag(s)) > 0;
s(t) = t(t) + 0;

Walter Roberson
Walter Roberson on 12 Feb 2018
The relative comparison operations ignore the imaginary component. You need to do the test for imaginary first.

Categories

Find more on Data Type Conversion in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!