Hola.
Puedes usar el comando
isreal. Pero nota lo siguiente,
matlab indica que los siguientes números son complejos (tienen parte imaginaria no nula):
isreal(i) isreal(1e-170*i)pero
isreal(1e-1700*i)sí sería un real puro

La razón:
matlab es un software numérico, por lo que todo lo trabaja de forma aproximada. Por ejemplo, para
matlab \( 10+1\times 10^{\color{red}-1700} \) o \( 10+2\times 10^{\color{red}-1700} \) es el mismo número (no recuerdo cual es la tolerancia exactamente, lo que puse en rojo, pero seguro se entiende la idea).
Por eso
dudo que matlab cuente cuántas raíces reales o imaginarias tiene un polinomio.Para obtener una estimación, la idea de Ilarrosa, la de decidir si las raíces son reales porque su parte imaginaria es cero, me parece lo más cercano a lo que buscas. Pero
ojo con lo siguiente:
clear all
Q=[1 -4 -10 26 -11 30];
R=roots(Q);
P=0;
for i = 1:length(R)
if real(R(i))==R(i)
P=P+1;
end
end
P
La idea suena bien, y claramente si
real(z)==z entonces \( z \) será un real, pero por lo que expliqué antes lo correcto sería usar algo así:
if abs(imag(z))<tolcon
tol=1e-16. Nota el
abs que puse.
Y otra cosa: matlab tiene sus comandos eficientemente preparados para trabajar con vectores, así que puedes usar
Q=[1 -4 -10 26 -11 30]; Z=roots(Q); Z(find(imag(Z)==0))y el resultado será de todos las raíces con parte real exactamente cero. Pero por lo que te dije antes, lo correcto sería escribir algo así
Q=[1 -4 -10 26 -11 30]; Z=roots(Q); Z(find(abs(imag(Z))<=1e-16))(Nota el valor absoluto que puse en la última línea)