Práctica 6. Resolución de ecuaciones.

En esta práctica estudiaremos como resolver ecuaciones y sistemas de ecuaciones. Maxima cuenta
con comandos específicos para resolver distintos tipos de ecuaciones. Usaremos los comandos
solve, allroots, realroots, linsolve y algsys.

También veremos el método de bisección y el método de Newton-Raphson para resolver ecuaciones;
no programaremos los métodos usando bucles o condicionales, pero si se mostrará la idea que
subyace en cada método y se verán los comandos find_root y mnewton que permiten aplicar
métodos similares a los descritos.

Las ecuaciones se escriben en Maxima como dos expresiones algebráicas separadas por un símbolo
igual. Una solución es un valor de la variable que cuando se sustituye en los dos términos de
la igualdad se obtiene el mismo valor.

Cuando una ecuación se escribe de la forma f(x)=0, las soluciones de la ecuación se llaman
también raíces de f.

Por ejemplo, la ecuación x^2=x+1 puede expresarse como x^2-x-1=0, y así las soluciones de la
ecuación x^2=x+1 son las raíces de la función f(x)=x^2-x-1. A continuación definimos x0 y
comprobamos que es raíz de f y que cumple la ecuación x^2=x+1.

(%i1) f(x):=x^2-x-1;

Result

(%i2) x0:(sqrt(5)+1)/2;

Result

(%i3) radcan( f(x0) );

Result

(%i4) radcan(x0^2);

Result

(%i5) radcan(x0+1);

Result

Ej. Considere la ecuación sqrt(x+2)=2*x+3. Compruebe si alguno de los siguientes números
son solución de la ecuación.
a) 1 .
b) -1 .
c) 0 .
(Indicación: Exprese la ecuación en la forma f(x)=0 y evalúe la función obtenida.)
(Sol. a) no, b) si, c) no .)

1 El comando solve.

El comando solve proporciona solución exacta (simbólica) para un gran conjunto de ecuaciones.
Si además queremos una aproximación numérica de las soluciones simbólicas, podemos aplicar el
comando float a las soluciones que proporciona el comando solve.

La sintaxis del comando es solve(ecuaciones, variables). Vemos a continuación dos ejemplos.

(%i6) solve(x^2+x-6=0,x);

Result

(%i7) soluciones:solve(x^2-3*x-7=0,x);

Result

(%i8) float(soluciones);

Result

Hemos visto que es posible guardar el resultado en una variable para manipularla
posteriormente. En el siguiente ejemplo vemos que es posible definir una ecuación antes de
resolverla y aplicamos rectform a las soluciones para obtener las soluciones en un formato
adecuado.

(%i9) ecuacion: (x-1)/(x+1)+2/(x^2-1)-1/x=0;

Result

(%i10) soluciones: solve(ecuacion,x);

Result

(%i11) float(soluciones);

Result

(%i12) float(rectform(soluciones));

Result

Ej. Halle la solución o soluciones de
a) (x+2)/(x+3) + 2*(x-5)/(x-6)=3 .
b) ln(3x)=5 .
(Sol. a) -12, b) %e^5/3=49.4710530341922 ).

También podemos usar el comando solve para resolver simbólicamente ecuaciones con parámetros,
y obtendremos las soluciones en función de ese parámetro. En el siguiente ejemplo vemos como
la x es considerada como variable, y m (que no se incluye con las variables) se considera
parámetro.

(%i13) solve(x^2 - 3*x + m = 0, x );

Result

En el siguiente ejemplo solve nos da x como una función que depende de x, y no nos proporciona
las soluciones de la ecuación. Veremos en las siguientes secciones otras maneras de resolver
ecuaciones.

(%i14) solve(sqrt(x+2)=2*x+3 , x );

Result

Es posible que solve sólo halle algunas soluciones, pero no todas. La siguiente ecuación tiene
infinitas soluciones, aunque Maxima nos da sólo una y nos avisa de que algunas de las
soluciones no las mostrará.

(%i15) solve(sin(x)=0,x );

Result

Ej. Considere la ecuación trigonométrica 2*sin(2*x)^2=1 .
a) Resuelva la ecuación con solve.
b) Exprese la ecuación en la forma f(x)=0 y represente la función para x en el intevalo
[-pi, pi]. ¿Cuantos cortes con el eje OX pueden apreciarse en la gráfica?
(Sol. a) x=-%pi/8, x=%pi/8, b) Ocho raíces.)

2 Raíces de polinomios.

Hay polinomios (de quinto grado o superior) cuya solución no se puede expresar mediante
operaciones elementales y raíces. Además en algunas aplicaciones la solución exacta puede
obtenerse, pero es tan compleja que es preferible trabajar con una solución aproximada.

En el siguiente ejercicio vemos un ejemplo de cada caso.

Ej. Aplique el comando solve a las siguientes ecuaciones.
a) x^5-x+1=0
b) x^4-x^3+1=0

Por eso son de utilidad los comandos de Maxima que hallan soluciones aproximadas de polinomios.

El comando allroots halla de forma aproximada todas las raíces de un polinomio. Su
sintaxis es allroots(ecuación_polinómica). Observe que no se indica cuál es la variable.

(%i16) allroots(x^2+x-6=0);

Result

Ejercicio. Aplique el comando allroots a las siguientes ecuaciones.
a) x^5-x+1=0 .
b) x^4-x^3+1=0 .
(Sol. a) x=0.35247154603173*%i+0.76488443360058, ...
b) x=0.6025654199986*%i+1.018912794385156, ... )

El comando realroots es similar a allroots, pero nos devuelve solamente aproximaciones a las
raíces reales del polinomio.

Vemos dos ejemplos. El primero es un polinomio de grado tres con sólo una raíz real y el
segundo un polinomio de grado 4 que no tiene raíces reales.

(%i17) realroots(x^3-7*x^2+x-7=0);

Result

(%i18) realroots(x^4-x^3+1=0);

Result

En el siguiente ejemplo realroots nos devuelve una fracción, pero no es solución exacta de la
ecuación, sino una aproximación. Al sustituir el valor de la fracción en el polinomio
obtenemos un valor muy próximo a cero, pero no cero.

(%i19) realroots(x^5-x+1=0);

Result

(%i20) xa:-39168221/33554432;

Result

(%i21) float(xa^5-xa+1);

Result

Ej. Se sabe que el polinomio x^6-4*x^4-x^2+4 tiene dos raíces complejas y cuatro raíces reales.
Halle las raíces reales del polinomio.
(Sol. -2, -1, 1, 2 )

3 Sistemas de ecuaciones.

En esta sección incluimos dos comandos de Maxima cuya finalidad es resolver sistemas lineales
(linsolve) o polinómicos (algsys). En ambas daremos las ecuaciones en una lista y las
incógnitas en otra lista.

Así, para resolver sistemas lineales, la sintaxis del comando es
linsolve(lista_de_ecuaciones, lista_de_incógnitas) .

(%i22) linsolve( [x+2*y=3,2*x-y=4],[x,y]);

Result

En el siguiente ejemplo definimos las ecuaciones antes de ser resueltas.

(%i23) ec1: x+y+z=3;
ec2: 2*x+3*y-z=1;
ec3: (1/2)*x+y-z=-1;

Result

(%i26) linsolve([ec1,ec2,ec3],[x,y,z]);

Result

El sistema que acabamos de resolver es compatible indeterminado (una ecuación es combinación
lineal de las otras dos, y por tanto redundante). El sistema tiene infinitas soluciones en
función de un parámetro que Maxima llama r1 .

Ej. Halle las soluciones del sistema
2*x + y = 2,
  x -2*y = 3,
 -x -3*y = 1.
(Sol. x=7/5, y=-4/5 )

Ej. Halle las soluciones del sistema
 x+y+ z=1,
   y- z=1,
2x+y+3z=2.
(Sol. No tiene soluciones, es incompatible)

Si en lugar de ecuaciones lineales tenemos un sistema de ecuaciones polinómicas usamos el
comando algsys cuya sintaxis es algsys(lista_de_ecuaciones, lista_de_incógnitas) .

En el siguiente ejercicio vamos a hallar la intersección de una elipse con una hipérbola.
Comenzamos planteando las ecuaciones del problema.

(%i27) elipse:(x-2)^2/3+(y-1)^2/4=5;
hiperbola: x^2-y^2=1;

Result

Las instrucciones de la siguiente celdilla (que no es necesario que comprenda ahora) muestran
gráficamente las dos ecuaciones y los cuatros puntos que son las soluciones del sistema.

(%i29) load(draw);
wxdraw2d( implicit(elipse,x,-3,7,y,-5,6),implicit(hiperbola,x,-3,7,y,-5,6) );

Result

Con el comando algsys obtenemos los cuatro puntos de corte.

(%i31) algsys([elipse,hiperbola],[x,y]);

Result

Ej. Halle la intersección de estas dos circunferencias
x^2+y^2=2,
(x-2)^2+y^2=4.
(Sol. (x,y)=(1/2, -sqrt(7)/2), (x,y)=(1/2, sqrt(7)/2) .)

Ej. Halle la intersección de estas dos circunferencias
x^2+y^2=2,
(x-2)^2+y^2=R^2.
donde R no se considera incógnita, sino un parámetro.
(Sol. (x,y)=(-(R^2-6)/4, -sqrt(-R^4+12*R^2-4)/4 ),
(x,y)=( -(R^2-6)/4, sqrt(-R^4+12*R^2-4)/4 ) .
)

4 Método de bisección. El comando find_root.

En el método de bisección se halla una sucesión de intervalos cada vez más pequeños que
contienen la raíz que buscamos. Cuando el intervalo sea lo suficientemente pequeño tendremos
una buena aproximación de la raíz.

Para explicar el método consideramos la ecuación e^x-x-2=0. En primer lugar planteamos la
ecuación en la forma f(x)=0 y definimos la función f.

(%i32) f(x):=%e^x-x-2;

Result

Vemos que el comando solve no muestra ninguna solución de la ecuación.

(%i33) solve(f(x)=0,x);

Result

Sin embargo, la función f tiene una raíz, como se observa en la gráfica.

(%i34) wxplot2d(f(x),[x,0,2]);

Result

Para justificar la existencia de raíz, no necesitamos la gráfica. Basta evaluar la función en
los extremos del intervalo.

(%i35) f(0);

Result

(%i36) f(2.0);

Result

Como la función f es una exponencial menos un polinomio, es continua, y además hemos visto que
en el intervalo [0,2] cambia de signo. Por el Teorema de Bolzano sabemos que dentro del
intervalo [0,2] hay una raíz de f.

Vamos a considerar el punto medio del intervalo [0,2], esto es x=1, y evaluamos en ese punto
la función f.

Según sea la función positiva o negativa en ese punto, sabremos si la función f presenta en el
intervalo [0,1] o en el [1,2] un cambio de signo.

(%i37) f(1.0);

Result

En este caso el valor de f en el punto medio es negativo, con lo que se puede asegurar, de
nuevo por el teorema de Bolzano, que en el intervalo [1, 2] hay una raíz.

Volvemos a hallar el punto medio del intervalo y evaluamos f en el punto medio.

(%i38) f(1.5);

Result

Como f(1) es negativo y f(1.5) es positivo, sabemos que hay una raíz en el intervalo [1, 1.5].

Tras cada iteración, el intervalo que contiene la raíz se divide por la mitad. Este método
puede requerir muchas iteraciones para obtener una buena aproximación a una raíz, pero es
sencillo de implementar, y garantiza que en cada iteración estaremos más cerca de la raíz.

Ej. Considere la función f(x)=cos(x)-x.
a) Evalúe la función en 0 y en 1.0 .
b) Aplique el método de bisección para encontrar un intervalo de longitud 0.125 que contenga
una raíz de f .
(Sol. Intervalos [0,1], [0.5, 1], [0.5, 0.75] y [0.625, 0.75] ).

Si una función tiene varias raíces, debemos encontrar para cada raíz un intervalo que la
contenga, y aplicar el método de bisección a cada uno de los intervalos. En estos casos
la gráfica de la función nos ayudará a determinar estos intervalos.

El comando find_root de Maxima usa una variante del método que hemos descrito.
La sintaxis del comando es find_root(función,variable,extremo_intervalo,extremo_intervalo).

La siguiente instrucción halla una raíz de la ecuación f(x)=%e^x-x-2=0 en el intevalo [0,2] .

(%i39) find_root(%e^x-x-2,x,0,2);

Result

Ej. Halle aproximaciones a las dos raíces de la ecuación sin(x)-e^(x^2)+9/10=0 usando dos
veces el comando find_root.
(Indicación: Represente la función de forma que puedan verse sus raíces, por ejemplo en
-4<=x<=4 y en -4<=y<=4. A continuación modifique estos intervalos para 'acercarse' a la raíz.
Luego determine dos intervalos en los que puedan hallarse las raíces)
(Sol. 0.11311928149888 y 0.6318087380143 )

5 Método de Newton-Raphson. El comando mnewton.

En esta sección veremos el método iterativo de Newton-Raphson, en el que a partir de una
función y una aproximación inicial x0 se van obteniendo sucesivas aproximaciones x1, x2, ...
que, bajo ciertas condiciones, estarán cada vez mas cerca de la raíz de la función.

Para ilustrar el proceso deduciremos la fórmula que permite hallar a partir de una de estas
aproximaciones la siguiente iteración.

Como ejemplo, buscamos una raíz de la función f(x)=e^x-x-2.

(%i40) f(x):=%e^x-x-2;

Result

Como vimos en la sección anterior, el comando solve no nos permite obtener una solución de
f(x)=0, aunque al representar la gráfica vimos que hay una raíz.

(%i41) wxplot2d(f(x),[x,0,3],[y,-3,16]);

Result

Como aproximación inicial a la raíz de f, consideramos x0=2 .

(%i42) x0:2.0;

Result

(%i43) f(x0);

Result

Ahora consideramos la recta tangente a la gráfica de y=f(x) en el punto x0=2 .

(%i44) define( fprima(x) , diff(f(x),x) );

Result

(%i45) r(x):=f(x0)+fprima(x0)*(x-x0);

Result

(%i46) wxplot2d([f(x),r(x)],[x,0,3],[y,-3,16]);

Result

La siguiente iteración, x1, será la intersección de la recta r(x) con el eje OX.

Hallamos la intersección despejando x de r(x)=0.
r(x)=0 ,
f(x0)+fprima(x0)*(x-x0)=0 ,
fprima(x0)*(x-x0)= -f(x0) ,
(x-x0)= -f(x0)/fprima(x0) ,
x=x0-f(x0)/fprima(x0) .

Llamamos x1 al punto de corte obtenido.

(%i47) x1:x0-f(x0)/fprima(x0);

Result

Ahora mostramos la función f(x), la recta tangente en el punto x0 y la recta tangente en el
punto x1 que acabamos de hallar.

(%i48) wxplot2d([ f(x), r(x), f(x1)+fprima(x1)*(x-x1) ], [x,0,3], [y,-3,16]);

Result

Siguiendo la misma fórmula que hemos deducido, podemos hallar la siguiente iteracion x2.

(%i49) x2:x1-f(x1)/fprima(x1);

Result

Si vamos a calcular varias iteraciones, es conveniente definir una g que nos permita, a partir
de una iteración, hallar la siguiente.

(%i50) g(x):=x-f(x)/fprima(x);

Result

De esta manera x3 es g(x2).

(%i51) x3:g(x2);

Result

Y así podemos hallar las siguientes iteraciones.

(%i52) x4:g(x3);

Result

(%i53) x5:g(x4);

Result

Vemos que en estas dos últimas aproximaciones las seis primeros cifras significativas
coinciden, esto puede ser un indicio de que estamos cerca de una raíz. Comprobemos si x5 es
una raíz de f.

(%i54) f(x5);

Result

Vemos que f(x5) no es exactamente 0 pero si un valor muy próximo a cero, así que podemos
considerar que x5 es una aproximación a una raíz de f.

Ej. Considere la ecuación f(x)=sqrt(1-x^2)-x^2=0.
a) Aplique el método descrito de Newton-Raphson para obtener 4 iteraciones partiendo de la
aproximación inicial x0:0.5 .
b) Evalúe la función f en x4.
(Sol. a) x1=0.89054445662277, x2=0.80009421056141, x3=0.78636654994093, x4=0.7861514285185,
b) -1.4438087203583194*10^-7 ).

Normalmente el método de Newton-Raphson necesita menos iteraciones que el método de bisección
para proporcionar una 'buena' aproximación . A cambio, el método de Newton-Raphson requiere
determinar la derivada de una función y en algunos casos puede que no obtengamos convergencia
a la raíz que buscamos.

Maxima incluye un comando llamado mnewton que implementa el método de Newton. Su sintaxis es
mnewton(función, variable, aproximación_inicial) . El comando mnewton también puede aplicarse
a una lista de funciones con varias variables, pero no lo estudiaremos en esta práctica.

Antes de ejecutar el comando mnewton debemos cargar con load el paquete que lo contiene
mediante la instrucción load(mnewton).

Vemos en el siguiente ejemplo como cargar el paquete y como aplicar el método de
Newton-Raphson al ejemplo anterior para hallar una solución numérica de f(x)=e^x-x-2=0
partiendo de una aproximación inicial x0=2.0.

(%i55) load(mnewton);

Result

(%i56) mnewton(%e^x-x-2, x, 2.0 );

Result

Ej. Usando el comando mnewton, y partiendo de la aproximación inicial 0.5, obtenga una raíz de
la ecuación f(x)=sqrt(1-x^2)-x^2=0.
(Sol. 0.78615137775742)

6 Ejercicios.

Ej. Halle de forma simbólica y también aproximada las soluciones de la ecuación
x^2-x-1=0 .
(Sol. x1=-(sqrt(5)-1)/2 = -0.61803398874989 , x2=(sqrt(5)+1)/2=1.618033988749895 ).

Ej. Obtenga una solución de la ecuación sqrt(x+2)=2*x+3 .
(Indicación: Exprésela en la forma f(x)=0 y represente la función en el intervalo [-2,0]. )
(Sol. -1 ).

Ej. Usando mnewton, obtenga soluciones numéricas de la ecuación f(x)=x^3+94*x^2-389*x+294=0
tomando como aproximación inicial a) x0=1.9, b) x0=2.1, c) x0=2.
(En este caso se observa como la aproximación inicial influye en la solución que se obtiene)
(Sol. a) 1.0, b) 3.000000000000001, c) -98.0 )

Matemáticas II. Grado en Edificación. (A. Palomares.)


Created with wxMaxima.