How to extract only the real roots of a cubic equation

1 view (last 30 days)
Plamen Bonev on 10 May 2021
I am resolving a cubic virial equation of state with a root method in 3 loops for (for Pressure, Temperature and type of Gas). So I have complexe and real solutions. I want, though, only the real ones. Here is the part of the code that doesn't work.
........
for j=1:numel(P)
coef1(i,j,k)=(Rg*T(i))/(P(j))
coef2(i,j,k)=(B2(i,k))*((Rg*T(i))/(P(j)));
coef3(i,j,k)=(B3(i,k))*((Rg*T(i))/(P(j)));
racines{i,j,k}=((roots([coef3(i,j,k), coef2(i,j,k), coef1(i,j,k), -1])));
imagi{i,j,k}=imag(racines{i,j,k})
vraiRacines{i,j,k}=racines{imag(racines{i,j,k})==0}
celldisp(vraiRacines)
end
end
end
This gives:
vraiRacines{2,1,1} =
-8.3654e+04
5.4637e+01
vraiRacines{3,1,1} =
-8.3654e+04
5.4637e+01
vraiRacines{1,2,1} =
-8.3654e+04
5.4637e+01
vraiRacines{2,2,1} =
-8.3654e+04
5.4637e+01
vraiRacines{3,2,1} =
-8.3654e+04
5.4637e+01
So it actually extracts the real solutions but it gives the same real value for all {i,j,k}.... 5.4637e+01.
So I think it enters the loop once and then does the same thing for all i,j and k...
Would you have a solution for me please?