Práctica 7
Resolución de ecuaciones

Resolución de ecuaciones polinómicas

La sentencia

                                                      Roots[polinomio==0,x]

obtiene todas las raíces reales y complejas de la ecuación polinómica correspondiente gene-
rando una lista con las mismas tal y como se observa  en el siguiente ejemplo:

Clear["Global`*"]

Roots[(x^2+9)(x-2.5)==0,x]

Como los métodos de cálculo de raíces no permiten obtener las soluciones exactas sino 
aproximaciones con la precisión que se desee, puede ser interesante efectuar un redondeo 
de forma que, si las soluciones son enteras, nos muestre la solución exacta. Para ello puede 
utilizarse la orden Chop.

Chop[%]

Análogamente, la orden

                                                Solve[polinomio==0,x]

resuelve la ecuación polinómica correspondiente.

Solve[x^4-2x^2+1==0,x]

Si no se  especifica de alguna forma  que se visualice una aproximación decimal, puede 
ocurrir que, como Mathematica trabaja en simbólico, aparezcan soluciones como las de
los siguientes ejemplos:

Solve[x^4-3x^3+x==0,x]

Solve[x^19+9x^13+4x^6+2x-25==0,x]

Es conveniente, en este caso, pedir a Mathematica que efectúe una aproximación decimal, 
con la orden

Chop[%]//N

o bien expresando alguno de sus coeficientes en forma decimal:

Solve[x^4-3.0x^3+x==0,x]

Solve[x^19+9x^13+4x^6+2x-25.0==0,x]

Observe la salida de las dos órdenes siguientes:

N[Chop[Roots[x^5+x-1==0,x]]]

N[Chop[Solve[x^5+x-1==0,x]]]

¿Qué diferencias encuentra entre Solve y Roots?.
    Otra forma más directa de calcular aproximaciones de las soluciones de una ecuación polinómica es mediante las órdenes
                      NSolve[ecuación,variable]
o bien
                           NRoots[ecuación,variable]

que, por utilizar métodos de aproximación numéricos, no aseguran el cálculo de soluciones exactas en el caso de que existan métodos formales para su cálculo.
    Ejecute las siguientes órdenes para observar la diferencia entre NSolve y NRoots.

NSolve[x^3-3x^2+1==0,x]

NRoots[x^3-3x^2+1==0,x]

Resolución de ecuaciones no polinómicas

Para resolver una ecuación no polinómica  se puede utilizar igualmente la orden
                                            Solve[ecuación,variable]
     Para resolver ecuaciones no polinómicas no es posible utilizar la orden Roots, pero existe una análoga en este caso:
                                            Reduce[ecuación,variable]
con la conveniencia de que ésta efectúa simultáneamente una discusión de casos, si interviene algún parámetro en la ecuación, 
según los valores que pueda tomar el mismo. 
     Veamos algunos ejemplos:

Solve[Sin[x] Cos[x]==0,x]

Observará que aparece un mensaje indicando que, debido al método de resolución
empleado, puede que no se encuentren todas las posibles soluciones.

Reduce[Sin[x] Cos[x]==0,x]

Solve[1/a E^(x+1)-3 a^2==0,x]

Reduce[1/a E^(x+1)-3a^2==0,x]

En el caso en que los comandos anteriores no resuelvan la ecuación, hay que utilizar algún 
método de resolución numérica. Mathematica tiene incorporado el método de Newton-
Raphson. Se trata de la orden

                    FindRoot[ecuación,{variable,valor inicial,valormin,valormax}]

que aplica este método iterativo, comenzando en el punto valor inicial, dentro del intervalo
[valormin, valormax]  para encontrar una aproximación de una solución posible del mismo.

FindRoot[1/2+x+x^2+Sin[x]==0,{x,0}]

Plot[Cos[x]-x^2,{x,-3,3}];

FindRoot[Cos[x]-x^2,{x,1}]

FindRoot[Cos[x]-x^2,{x,-1}]

Como para ecuaciones polinómicas, es posible utilizar la orden de resolución aproxima-
da de ecuaciones NSolve.

Resolución numérica de ecuaciones

Método de Bisección

Suponemos que los extremos del intervalo en el que hay un cero de la ecuación f(x)=0 
son a y b. Vamos a detener el proceso cuando, tras sucesivas divisiones del intervalo de 
partida en dos partes iguales, el intervalo resultante mida menos de una cantidad tol (tolerancia
o error máximo), o bien cuando se realicen 100 iteraciones. 
     Recuerde que cuando use este programa para aproximar raices de otras ecuaciones dife-
rentes de la que hay a continuación, debe elegir un intervalo de partida adecuado en cada caso.

f[x_]:=E^x-3;
a=0.;b=2.;
tol=10^(-5);
n=100;

For[i=1,i<=n,i++,
    c=(a+b)/2;
    If[f[c]==0,Break[]];
    If[f[c]*f[a]<0,b=c,a=c];
    If[b-a<tol,Break[]]];

If[f[c]==0,Print["Solución exacta: ",c],
   Print["Solución aproximada: ",c];
   Print["Número de iteraciones: ",i];
   Print["Error máximo cometido: ",tol] ]

Método de Newton-Raphson

f[x_]:=E^x-3;
tol=10^(-5);
n=100;
x0=2.;

For[i=1,i<=n,i++,
    x1=x0-f[x0]/f'[x0];
    If[f[x1]==0,Break[]];
    If[Abs[x1-x0]<tol,Break[]];
    x0=x1 ];

If[f[x0]==0,Print["Solución exacta: ",x0],
   Print["Solución aproximada: ",x0];
   Print["Número de iteraciones: ",i];
   Print["Error máximo cometido: ",tol] ]

Ejercicios

1.-  Demuestre que la ecuación (x^3)+4(x^2)-10=0 tiene una única raíz en el intervalo [1,2]. 
     Aproxime dicha raíz con el método de bisección con un error absoluto menor que 
     (10^(-3)). 
     ¿Cuántas iteraciones serán necesarias para conseguir 5 cifras decimales exactas? 
     Aproxime la raíz con el método de Newton-Raphson partiendo del extremo adecuado 
     hasta que la diferencia, en valor absoluto, entre dos aproximaciones consecutivas sea 
     inferior a (10^(-3)).

2.- Encuentre una aproximación de la raíz cúbica de 25 con dos decimales exactos, usando 
     el algoritmo de bisección (Sugerencia: considérese la ecuación (x^3)-25=0).

3.- Use el método de Newton-Raphson para aproximar las soluciones de las siguientes ecua- 
     ciones con precisión (10^(-5)), partiendo de un valor muy próximo a cada una de ellas en 
     cada caso.
         i) (x^3)-x-1=0  en [1,2].
        ii) 3x=2+(x^2)-(e^x).
        iii) (x^2)+10 cos x+ (x/ds) =0.

4.- Para la función f(x)=3(x^2)+(e^x)-dm-1, 
     
         i) encuentre, mediante el método de Bisección una aproximación de la raíz en [0,dm+1] 
            con precisión 1/(100*ds). Determinar el número de iteraciones realizadas;
        ii) encuentre, mediante el método de Newton-Raphson, una aproximación de la raíz en 
            [0,dm+1] con tolerancia 1/(100*ds), partiendo de x0=dm, y determine el número de
            iteraciones realizadas.

5.- Utilice las órdenes de Mathematica para aproximar todos los puntos donde se anulan las 
      funciones siguientes (si es necesario, represéntelas gráficamente):
         i) f(x)=(x^7)-(x^4)+dm,
        ii) f(x)=(x^7)-(x^4)+cos x +dm.

6.- Calcule, utilizando una orden directa de Mathematica, las soluciones reales del sistema de
      ecuaciones no lineales
                                              (x^3) + 3y  = 1.1,
                                        -1.1 x    + (y^4)=  0.