Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
Profesor Adolfo Di Mare
CI-1201
II Semestre 2010
[<=] [home] [<>] [\/] [=>]
CI-1201 Programación II

Tarea #2 [solución]

Busqueda de una raíz de un polinomio

      Use el método de Newton Raphson para encontrar un cero de un polinomio, esto es, un valor "x" que tiene la propiedad de que "P(x)==0". Por ejemplo, al evaluar el polinomio "P(x)==x^2-2x+1" en el valor "x==1" el resultado obtenido es "1^2-2*1+1==0" por lo que "1" es una raíz del polinomio.

polinomio          grado
x^3 + 2x^2           3

   0     1     2     3     4     5                Max_Degree
+-----+-----+-----+-----+-----+-----+ ... +-----+-----+-----+
| 0.0 | 0.0 | 2.0 | 1.0 | @$? | !~/ | ... | @*? | ^\* | ??? |
+-----+-----+-----+-----+-----+-----+ ... +-----+-----+-----+
m_coef[]             ^
                     |
m_degree == 3 -------+

      Para implementar su programa, construya su clase polinomio usando un vector de hasta "MaxGrado==1001" valores de punto flotante que representen un polinomio de grado n<=MaxGrado (este diagrama es el modelo de la clase). Recuerde incluir en las a las especificaciones de cada método los datos de prueba BUnit.

Consulta:
Profe: ¿Cómo agrego los ejemplos BUnit?
Respuesta:
En el artículo BUnit está explicado cómo hacerlo usando los siguientes comandos Doxygen:

/** "P+Q".
    Calcula y retorna la suma \c "P+Q".

    \dontinclude test_polinomio.cpp
    \skipline    test::suma()
    \until       }}
    \see         test_polinomio::test_suma()
*/
polinomio operator+( const polinomio& P, const polinomio& Q) {
    polinomio res = P;
    res += Q;
    return res;
}
void test_Poly::test_suma() {
{{  // test::suma()
    polinomio P,Q,R;
    //     coef x^n    //     coef x^n
    P.set( 1.0 , 2 );  Q.set( 1.0 , 2 ); // x^2
    P.set( 2.0 , 1 );                    // 2x
    P.set( 1.0 , 0 );  Q.set( 1.0 , 0 ); // 1

    assertTrue( "P == [ x^2 + 2x + 1 ] && Q == [ x^2 + 1 ]" );
    assertTrue( "(P+Q) == [ 2x^2 + 2x + 2 ]" );
    assertTrue( "(P-Q) == [ 2x ]" );

    assertTrue( (P+Q).coef(2)  == 2.0 ); // [ 2x^2 + 2x + 2 ]
    assertTrue( (P-Q).coef(2)  == 2.0 ); // [ 2x ]
    assertTrue( (P+Q).degree() == 2  );  // [ 2x^2 + 2x + 2 ]
    assertTrue( (P-Q).degree() == 1  );  // [ 2x ]
    assertTrue( ( R ).degree() == 0  );  // [ 0 ]

    P.clear(); assertTrue( P == R );     // [ 0 == 0 ]
}}
    {   // resto de las pruebas
    }
}

Di Mare, Adolfo
BUnit.h: Un módulo simple para aprender prueba unitaria de programas en C++, X Simposio Internacional de Informática Educativa (SIIE'08) realizado del 1 al 3 de octubre 2008, Salamanca, España, I.S.B.N.: 978-84-7800-312-9, pp425-430, octubre 2008.
      http://www.di-mare.com/adolfo/p/BUnit.htm
Consulta:
Profe: ¿Cuántos programas tengo que implementar?
Respuesta:
Tenés que implementar 1 solo programa que está compuesto de varios módulos. Para implementar la clase polinomio hay que usar 2 archivos: en "polinomio.h" están las declaraciones de la clase y en "polinomio.cpp" se ponen las implementaciones de los métodos. El tercer archivo es el programa principal "ceropoly.cpp", en donde está la función "main(argc,argv)" que es la que el inicio del programa. Finalmente, el cuarto archivo que hay que implementar es "test_polinomio.cpp", que es el módulo en donde están los datos de prueba BUnit que sirven para complementar con ejemplos de uso las especificaciones de los métodos y funciones de la clase "polinomio".
Consulta:
Profe: ¿Por qué en "test_polinomio.cpp" también está el método "main(argc,argv)"?
Respuesta:
Es cierto: tanto "ceropoly.cpp" como "test_polinomio.cpp" contiene la función "main(argc,argv)" (que no es un método, contrario a lo que ocurre en Java). Es cierto que tenés que implementar 2 programas y por eso también necesitarás crear 2 proyectos Code::Blocks:
Consulta:
Profe: ¿Tengo que implementar toda la clase polinomio o puede implementar solo los métodos que necesito?
Respuesta:
Lo mejor es reutilizar una implementación que ya existe, pero también podés implementar (de nuevo) solo aquellos métodos de la calse polinomio que necesités.
Consulta:
Profe: ¿Qué es f'(x[n]) en la fórmula x[n+1] = x[n] - ( f(x[n]) / f'(x[n]) )?
Respuesta:
f'(x) es la derivada matemática de la función f(x). Podés incluir un método en la clase polinomio que calcule el polinomio derivado:
/// Calcula y retorna en \c drv la derivada del polinomio \c *this.
void polinomio::derivar( polinomio& drv ) const;

      Entregue su tarea por correo electrónico, como lo hizo anteriormente.

[mailto:] Entrega de Tareas

Tiempo de entrega: 1 semana
Modalidad: En parejas

Soluciones

[mailto:] Adolfo Di Mare <adolfo@di-mare.com>.
Copyright © 2010
Derechos de autor reservados © 2010
[home] <> [/\]