Disciplinas relacionadas con la matemática => Temas de computación => Mensaje iniciado por: alexis-gauss en 11/09/2017, 02:35:18 am



Título: MATLAB: contar raices de un polinomio
Publicado por: alexis-gauss en 11/09/2017, 02:35:18 am
Hola, buenos días, necesito ayuda con el siguiente problema por favor
Necesito crear un script en Matlab que me permita saber cuantas raíces reales hay en el intervalo [texx][-4,6][/texx] del polinomio [texx]Q(x)=x^5-4x^4-10x^3+26x^2-11x+30[/texx].

El siguiente código nos entrega las raíces del polinomio:
Código:
clear all
Q=[1 -4 -10 26 -11 30];
roots(Q)

ans =

   5.0000 + 0.0000i
  -3.0000 + 0.0000i
   2.0000 + 0.0000i
   0.0000 + 1.0000i
   0.0000 - 1.0000i

Y aquí quedo, ¿alguna idea de como contar las raíces reales en ese intervalo?, que en este caso serían 3. ???
De antemano gracias, saludos.


Título: Re: MATLAB: contar raices de un polinomio
Publicado por: Ignacio Larrosa en 11/09/2017, 04:30:08 am
Hola, buenos días, necesito ayuda con el siguiente problema por favor
Necesito crear un script en Matlab que me permita saber cuantas raíces reales hay en el intervalo [texx][-4,6][/texx] del polinomio [texx]Q(x)=x^5-4x^4-10x^3+26x^2-11x+30[/texx].

El siguiente código nos entrega las raíces del polinomio:
Código:
clear all
Q=[1 -4 -10 26 -11 30];
roots(Q)

ans =

   5.0000 + 0.0000i
  -3.0000 + 0.0000i
   2.0000 + 0.0000i
   0.0000 + 1.0000i
   0.0000 - 1.0000i

Y aquí quedo, ¿alguna idea de como contar las raíces reales en ese intervalo?, que en este caso serían 3. ???
De antemano gracias, saludos.

No conozco MATLAB lo suficiente, pero casi con seguridad que puede contar solo las reales. En cualquier caso, no tienes más que contar las que tienen la parte imaginaria igual a [texx]0[/texx]. No se como trata exactamente las raíces múltiples.

Saludos,


Título: Re: MATLAB: contar raices de un polinomio
Publicado por: feriva en 11/09/2017, 06:10:29 am
Hola.

Primero lo que dice Ilarrosa mediante un condicional; y después otro condicional que diga [texx]if\,variable\,\geq-4[/texx]  y también  [texx]if\,variable\,\leq6[/texx] (como se escriba en ese código, que no sé).

Seguramente las raíces, como están en un array, se escribirán como Q[0], Q[1], Q[2]..., ¿no? Pues entonces, si fuera así, se haría creando una variable para lo que va dentro de los corchetes, Q [ x ], y recorriendo después el bucle para ir probando seguidamente con los “if” las que cumplan las condiciones.

Saludos.


Título: Re: MATLAB: contar raices de un polinomio
Publicado por: iambo en 11/09/2017, 06:49:48 am
Buenas,
No soy un experto en Matlal, sólo lo he usado en las prácticas de una asignatura, pero creo que esto te puede servir:

Código:
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

Seguro que hay alguna manera mucho más eficiente.....

Saludos.

Añado

La misma idea, pero no es necesario el if:
Código:
for i = 1:length(R)
  P=P+(real(R(i))==R(i));
end

(Un poco más eficiente)


Título: Re: MATLAB: contar raices de un polinomio
Publicado por: mathtruco en 11/09/2017, 11:41:54 am
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  :o

La razón: matlab es un software numérico, por lo que todo lo trabaja de forma aproximada. Por ejemplo, para matlab [texx]10+1\times 10^{\color{red}-1700}[/texx] o [texx]10+2\times 10^{\color{red}-1700}[/texx] 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:

Cita

Código:
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 [texx]z[/texx] será un real, pero por lo que expliqué antes lo correcto sería usar algo así:

    if abs(imag(z))<tol

con 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)


Título: Re: MATLAB: contar raices de un polinomio
Publicado por: Abdulai en 11/09/2017, 02:04:03 pm
Hola, buenos días, necesito ayuda con el siguiente problema por favor
Necesito crear un script en Matlab que me permita saber cuantas raíces reales hay en el intervalo [texx][-4,6][/texx] del polinomio [texx]Q(x)=x^5-4x^4-10x^3+26x^2-11x+30[/texx].

El siguiente código nos entrega las raíces del polinomio:
Código:
clear all
Q=[1 -4 -10 26 -11 30];
roots(Q)

ans =

   5.0000 + 0.0000i
  -3.0000 + 0.0000i
   2.0000 + 0.0000i
   0.0000 + 1.0000i
   0.0000 - 1.0000i

Y aquí quedo, ¿alguna idea de como contar las raíces reales en ese intervalo?, que en este caso serían 3. ???
De antemano gracias, saludos.

Podés hacer:
Código:
clear all
Q=[1 -4 -10 26 -11 30];
R = roots(Q);
sum(imag(R)==0)
Y te devuelve el número de raíces reales

Para que cuente solamente las que están en el intervalo agregamos al sum :
Código:
clear all
Q=[1 -4 -10 26 -11 30];
R = roots(Q);
sum( imag(R)==0 & R>=-4 & R<=6)
(R>=-4  y R<=6  solo comparan las partes reales)


Cuidado con las limitaciones de la función roots, porque una raíz doble puede ser real y devolver dos complejas conjugadas con una pequeña parte imaginaria.
O estar en los límites del intervalo o muy cerca y devolverla fuera.