Foros de matemática
22/09/2017, 03:18:04 am *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias: LISTADO ACTUALIZADO DE CURSOS
 
 
Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: MATLAB: contar raices de un polinomio  (Leído 130 veces)
0 Usuarios y 1 Visitante están viendo este tema.
alexis-gauss
Nuevo
*

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Perú Perú

Mensajes: 4


Ver Perfil
« : 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.
En línea
Ignacio Larrosa
Moderador Global
Pleno*
*

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 1.260


Ver Perfil WWW
« Respuesta #1 : 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,
En línea

Daría todo lo que se por la mitad de lo que ignoro (R. Descartes)
O incluso por mucho menos ...
feriva
Pleno*
*****

Karma: +1/-0
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 6.578



Ver Perfil
« Respuesta #2 : 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.
En línea

iambo
Junior
**

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 36


Ver Perfil
« Respuesta #3 : 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)
En línea
mathtruco
Moderador Global
Pleno*
*

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Chile Chile

Mensajes: 4.527

El gran profesor inspira


Ver Perfil
« Respuesta #4 : 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  :sorprendido:

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)
En línea

Quien pregunta es ignorante durante un minuto; quien no pregunta, es ignorante durante toda su vida.
Abdulai
Moderador Global
Pleno*
*

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 1.777


Ver Perfil
« Respuesta #5 : 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.
En línea
Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.1 | SMF © 2006, Simple Machines LLC XHTML 1.0 válido! CSS válido!