Sei sulla pagina 1di 44

UNIVERSIDAD POLITCNICA DE MADRID

ESCUELA TCNICA SUPERIOR DE INGENIEROS DE MINAS


DEPARTAMENTO DE MATEMTICA APLICADA Y MTODOS INFORMTICOS TITULACIN: INGENIERA DE MINAS

ASIGNATURA:

PROGRAMACIN Y MTODOS NUMRICOS

PRCTICA N 12: MTODOS RESOLUCIN DE UNA ECUACIN NO LINEAL (I): Mtodos de biseccin y aproximaciones sucesivas CURSO 2006-07
PRCTICA ELABORADA POR: Prof. Carlos Conde Lzaro Prof. Arturo Hidalgo Lpez Prof. Alfredo Lpez Benito Prof. Carlos Paredes Bartolom Prof. Ramn Rodrguez Pons-Esparver Depto. de Matemtica Aplicada y Mtodos Informticos Escuela Tcnica Superior de Ingenieros de Minas Universidad Politcnica de Madrid Mayo 2007

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

OBJETIVOS DE LA PRCTICA
1. Conocer los comandos bsicos de MAPLE para la resolucin numrica de una ecuacin no lineal. 2. Realizar algoritmos simples que utilicen estructuras iterativas para resolver una ecuacin no lineal que sigan los esquemas numricos de biparticin y de aproximaciones sucesivas. 3. Para el mtodo de biparticin: analizar, sobre ejemplos tratados con MAPLE la influencia de los intervalos iniciales seleccionados sobre el nmero de iteraciones y la convergencia hacia la solucin. 4. Para el mtodo de aproximaciones sucesivas: analizar sobre ejemplos tratados con MAPLE la influencia de las diferentes transformaciones del problema no lineal a uno de punto fijo sobre la convergencia del mtodo, a travs del comportamiento de las condiciones de convergencia.

FORMA DE DESARROLLAR ESTA PRCTICA.


El desarrollo de la prctica consistir en la realizacin de ejemplos resueltos (epgrafe de EJEMPLOS) y tras ello se propone al alumno el desarrollo de algunos ejercicios (epgrafe de EJERCICIOS PROPUESTOS) que deber desarrollar individualmente.

DURACIN ESTIMADA DE ESTA PRCTICA


El tiempo estimado para la realizacin de esta prctica es de 2 horas.

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

BIBLIOGRAFA
[1] C. Conde Lzaro y E. Schiavi (2007) Resolucin de ecuaciones no lineales. Apuntes disponibles en el Open Course Ware de la Universidad Politcnica de Madrid. [2]. C. Conde y G. Winter (1990). Mtodos y algoritmos bsicos del lgebra numrica. Ed. Revert. Los algoritmos que se siguen en la prctica se pueden consultar en: [3]. C. Conde, A. Hidalgo y A. Lpez. Resolucin de ecuaciones lineales: Mtodos de tipo gradiente. Presentaciones disponibles en el Open Course Ware de la Universidad Politcnica de Madrid.

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

EJEMPLOS
Ejemplo primero: comandos bsicos de para la resolucin ecuaciones no lineales. MAPLE

MAPLE permite resolver una ecuacin o un sistema de ecuaciones no lineales usndose para ello diferentes comandos: solve() fsolve() realroot()

Comando solve() Su uso general es la resolucin de ecuaciones. Por ejemplo: > solve(cos(x)+y,x);
arccos ( y )

Si el problema es un conjunto de ecuaciones, tantas como incgnitas, el sistema se especifica como un conjunto de ecuaciones (recuerda que se escriben entre llaves {eq1,eq2,...}) y se resuelve para un conjunto de incgnitas (recuerda que tambin van entre llaves {var1,var2,...}): > solve({x+y=1,2*x+y=3},{x,y}); { x = 2, y = -1 } Cuando el comando solve no es capaz de encontrar una solucin a la ecuacin o al sistema de ecuaciones, no presenta ninguna salida. > solve({x+y=1,2*x+2*y=3},{x,y}); Este comando, no slo permite resolver ecuaciones lineales, sino tambin no lineales, trabajando tanto con aritmtica exacta: > solve(x^3-6*x^2+11*x-6,x);
1, 2, 3

> solve(6*x^2-11*x-6,x); 11 + 12

265 11 , 12 12

265 12

como aproximada en coma flotante: 3

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

> evalf(solve(6*x^2-11*x-6,x)); solve(6.*x^2-11.*x-6.,x); 2.273235050 , -0.4399017163


2.273235050 , -0.4399017163

> fin;
fin

Comando fsolve() Se trata de un comando que permite la obtencin de las races de una ecuacin o de un sistema, lineal o no lineal, en coma flotante, ya sean estas reales o complejas. La bsqueda de la solucin se realiza aplicando un algoritmo que encuentra las raices reales del problema, a no ser que se especifique lo contrario. La forma de utilizar este comando es totalmente analoga a la del uso de solve(): > fsolve(tan(sin(x))=1,x); 0.9033391108 > p:=3*x^4-16*x^3-3*x^2+13*x+16; fsolve(p=0,x); p := 3 x 4 16 x 3 3 x 2 + 13 x + 16
1.324717957 , 5.333333333

En el caso de que no sea capaz de encontrar alguna solucin, puede aportarse informacin adicional para que esta se localice. En el ejemplo anterior se han encontrado dos soluciones reales, pudiendo buscar una en concreto: > fsolve(p=0,x=1..2);
1.324717957

Esto resulta bastante til cuando se buscan las races de funciones que pertenezcan a intervalos concretos. Nota: a la hora de especificar el intervalo de bsqueda de la solucin hay que tener en cuenta que se trata de un intervalo abierto, con lo que los puntos extremos no se encuentran dentro del rango de la bsqueda. Es posible tambin localizar las races complejas, indicndolo dentro de los parmetros del comando. Como el polinomio anterior es de cuarto grado, faltan dos soluciones que sern complejas:

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

> fsolve(p=0,x,complex); -0.6623589786 0.5622795121 I, -0.6623589786 + 0.5622795121 I, 1.324717957 , 5.333333333 > fin;
fin

Comando realroots() Cuando se trabaja con poliomios de una variable y se desea conocer los intervalos de cierto tamao en cuyo interior hay una raz del mismo es posible utilizar el comando realroot(). Este comando proporciona una lista de intervalos en cuyo interior se encuentran cada una de las races reales de un polinomio de coeficientes enteros. El resultado se proporciona en forma de lista de parejas de nmeros racionales: o cuando ambos valores de la pareja son iguales ste representa un nico valor (raz entera del polinomio) o cuando son diferentes representan un intervalo abierto donde se encuentra esta raz. > restart: Sea el polinomio p: > p:=3*x^4-16*x^3-3*x^2+13*x+16; realroot(p); p := 3 x 4 16 x 3 3 x 2 + 13 x + 16
[ [ 0 , 4 ], [ 4 , 8 ] ]

El tamao de los intervalos de salida los ha tomado automticamente. Es posible, especificar el tamao de los intervalos en los que se encuentran las soluciones: > realroot(p,1/10000); 2713, 21705 , 87381 , 43691 2048 16384 16384 8192 Cuando el polinomio posee races enteras estas se muestran con ambos extremos iguales:

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

> p:=x^8+5*x^7-4*x^6-20*x^5+4*x^4+20*x^3; realroot(p,1/1000); p := x 8 + 5 x 7 4 x 6 20 x 5 + 4 x 4 + 20 x 3


[ 0, 0 ], 181, 1449 , -1449, -181 , [ -5, -5 ] 128 1024 1024 128

es interesante utilizar estos intervalos, por ejemplo, como dato de entrada para los algoritmos iterativos de bsqueda de races de polinomios, especialmente cuando se utiliza el mtodo de biparticin, que toma como datos de entrada el intervalo donde se desea encontrar la raz. > fin;
fin

Nota: hay que sealar que el comando realroot utiliza un esquema semejante al mtodo de biparticin para la determinacin de los intervalos donde se encuentra la raz (regla de los signos de Descartes). Una vez vistas las diferentes posibilidades que ofrece el entorno de trabajo MAPLE para resolver una ecuacin no lineal estudiemos a continuacin cmo se programan algunos de los algoritmos ms comnmente utilizados para ste tipo de problemas no lineales, que pueden dar solucn a algunos problemas que MAPLE no puede resolver.

Segundo ejemplo: El mtodo de biparticin (o de biseccin o de punto medio).


La bsqueda de alguna raz de una ecuacin no lineal se realiza mediante el mtodo de biparticin a travs de las sucesivas localizaciones del intervalo donde sta se encuentra. Para asegurar que dentro de un intervalo (a,b) hay una raz de una funcin f(x) (es decir algn punto en el que f(x) = 0) son condiciones suficientes a) que la funcin f(x) cambie de signo en los extremos del intervalo y b) que f(x) sea continua en l (teorema de Bolzano). Si esto es as, es posible asegurar que existe al menos una raz (aunque pudiera haber ms de una siempre que la suma de sus

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

multiplicidades fuese impar) dentro del intervalo (a, b). EL que la funcin cambie de signo es equivalente a que f(a)f(b) < 0 Cuando la funcin toma un signo igual en los extremos de un intervalo puede ocurrir que o bien no haya raz en su interior o bien que haya una multiplicidad par de races. En ese caso f(a)f(b) > 0 no siendo posible entonces asegurar la existencia de solucin al problema no lineal f(x) = 0 El mtodo de biparticin se basa en encontrar iterativamente los sucesivos intervalos para en los que se verifica el cambio de signos de los valores en los extremos tomados por funciones continuas, siendo en cada iteracin el tamao del intervalo tomado la mitad del precedente. El esquema computacional seguido puede resumirse como sigue: 1.- entrada de datos (a,b), f(x),eps 2.- inicio x <-- (a+b)/2 3.- bucle iterativo mientras |a-b|>eps si f(x)f(a) > 0 entonces a <-- x si no b <-- x fin condicin x <-- (a+b)/2 fin bucle 4.- escribir solucin x <-- (a+b)/2 Como se ha sealado anteriormente, este algoritmo converger a una raz, siempre y cuando f(x) sea continua en (a, b) y adems f(a)f(b) < 0 para el intervalo inicial. El criterio de parada del algoritmo es directamente el criterio de convergencia del mismo, es decir, que se alcance un intervalo de tamao: |a-b| < . El nmero de veces que se lleva a cabo este proceso iterativo se demuestra que est dado por:

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

imax

ba ln = 1 ln(2)

que nos asegura la relacin adecuada del tamao del ltimo intervalo y con el tamao del primer intervalo (suponiendo que la primera iteracin toma como ndice el 0). En el procedimiento que sigue se recoge el algoritmo de biparticin

Procedimiento del mtodo de biseccin


> bipart:=proc(aa,bb,f,epsilon,sol,numit) local a, b, iter, j, x, vmed: a:=aa: b:=bb: iter:=ceil(ln(abs(b-a)/epsilon)/ln(2))-1: numit:= iter: for j from 0 to iter by 1 do x:=(a+b)/2.: vmed:=f(x): if (f(a)*vmed >0) then a:=x: else b:=x: fi: od: sol:=x: end proc: > save bipart,"bipart.m":

Apliquemos el mtodo de biparticin a algunas ecuaciones

Aplicacin del mtodo de biparticin: caso 1


Utilizar el mtodo de biseccin para encontrar una aproximacin de 25^(1/3) con una precisin de 10^(-4). (NOTA: considerar la ecuacin no lineal f(x)=x^3-25=0)
> restart: with(plots):

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

Definimos la funcin no lineal:


> f:=x->x^3-25;
f := x x 3 25

cuyo comportamiento puede verse en la grfica


> plot(f(x),x=0..4);

donde se aprecia que posee una raz dentro del intervalo (2,3). Para buscar dicha raz nos aseguramos de que:
> a:=2;f(a);b:=3;f(b);f(a)*f(b); a := 2
-17 b := 3

2 -34

con lo que puede iniciarse el proceso de bsqueda en este intervalo. Para ello utilicemos el procedimiento antes escrito.
> read "bipart.m":

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

> epsilon:=1.*10^(-4.); bipart(a, b, f,epsilon ,solucion, numiter): := 0.0001000000000 > solucion; numiter;
2.924011231 13

En 13 iteraciones hemos encontrado la solucin de la ecuacin x3 - 25 = 0 con una precisin mayor a 10-4. Con el objeto de poder graficar la posicin de los puntos medios del intervalo de bsqueda de la raz repetimos el proceso de biparticin sin usar el procedimiento anterior y almacenando las posiciones de los puntos medios de cada intervalo. Usaremos adems una tolerancia menor = 10-7.
> eps:=10^(-7); numit:=evalf((ln(abs(b-a)/eps)/ln(2.))-1.); 1 eps := 10000000
numit := 22.25349667

> numit:=round(numit)+1;
numit := 23

> for j from 0 to numit by 1 do izq[j]:=a: der[j]:=b: ptmed[j]:=evalf(a+((b-a)/2.),14): vmed:=evalf(f(ptmed[j]),14): if (vmed=0) then print(`la raiz buscada es `,ptmed[j]): else if(vmed*f(a)>0) then a:=ptmed[j]: else b:=ptmed[j]: fi: fi: od:

La solucin alcanzada tras numit iteraciones es almacenda en el vector ptmed[], posicin numit: 10

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

> ptmed[numit];
2.9240177273749

El cmo se han comportado los sucesivos puntos solucin (puntos medios de los intervalos en cada iteracin) a lo largo del proceso, puede verse en la siguiente grafica:
> dibsol:=[seq([k,ptmed[k]],k=0..numit)]: pointplot(dibsol,color=blue,symbol=cross,axes=boxed);

Es decir, la raz cbica de 25 es:


> ptmed[numit];
2.9240177273749

como puede comprobarse:


> evalf(25.^(1/3));
2.924017738

> fin;
fin

11

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

Aplicacin del mtodo de biparticin: caso 2


Sea la funcin no lineal (de tipo polinmico) f(x) = (x+2)(x+1)x(x-1)3(x-2). Hacia qu raz de la ecuacin f(x) = 0 converge el mtodo de biseccin para los intervalos siguientes: [-3,2.5] [-1.75,1.5] [-2.5,3] [1.5,1.75] ? Supngase, en el caso de tener que hacer los clculos que el mximo error admisible es del orden de 10-7.
> restart: > f:=x->(x+2)*(x+1)*x*(x-1)^3*(x-2); plot(f(x),x=-2.1..2.5); f := x ( x + 2 ) ( x + 1 ) x ( x 1 ) 3 ( x 2 )

La figura anterior muestra que es posible aplicar el mtodo de biparticin a cada uno de los tres primeros casos considerados ya que en todos ellos la funcin continua f(x) tiene cambio de signo entre los valores en los extremos de los intervalos dados. En el ltimo de ellos no podremos aplicar el procedimiento de biparticin ya que: > f(1.5)*f(1.75); 1.561367512

12

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

es positivo (lo que indica que no hay raz o que hay un nmero pares de ellas; en este caso, no hay raz). Apliquemos pues el procedimiento visto anteriormente a los tres primeros casos.

a) Intervalo [-3, 2.5]:


> read "bipart.m": > a1:=-3.;f(a1);b1:=2.5;f(b1);f(a1)*f(b1)<0; a1 := -3.
-1920.
b1 := 2.5

66.4453125 -127575.0000 < 0

con lo que sobre el primer intervalo se tiene:


> eps:=10^(-7.);
eps := 0.1000000000 10 -6

> bipart(a1,b1,f,eps,sol1,numit1): > sol1;numit1; 2.000000068


25

El mtodo converge hacia la solucin x = 2 y en 25 iteraciones lo hace con una precisin mayor a 0.1 millonsima. No obstante, con el objeto de poder representar la evolucin de los puntos medios de los intervalos hacia la solucin, repetiremos el proceso de bsqueda sin utilizar el algoritmo anterior y almacenando dichos puntos medios:
> a:=a1: b:=b1: for j from 0 to numit1 by 1 do izq[j]:=a: der[j]:=b: ptmed[j]:=evalf(a+((b-a)/2.),14): vmed:=evalf(f(ptmed[j]),14): if (vmed=0) then

13

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

print(`la raiz buscada es `,ptmed[j]): else if(vmed*f(a)>0) then a:=ptmed[j]: else b:=ptmed[j]: fi: fi: od:

Verifiquemos que la solucin alcanzada tras numit1 iteraciones, almacenda en el vector ptmed, posicin numit1, coincide con la anterior: > sol1:=ptmed[numit1]; sol1 := 2.0000000670552 Y almacenemos en la variable dibsol1 el grfico de los valores de los puntos medios en cada iteracin:
> dibsol1:=[seq([k,ptmed[k]],k=0..numit1)]:

B) Intervalo [-1.75,1.5]: > a2:=-1.75;f(a2);b2:=1.5;f(b2);f(a2)*f(b2)<0; a2 := -1.75


25.58990478 b2 := 1.5

-0.8203125 -20.99171876 < 0

> eps:=10^(-7); numit2:=ceil((ln(abs(b2-a2)/eps)/ln(2.))-1.); 1 eps := 10000000


numit2 := 24

> a:=a2: b:=b2: for j from 0 to numit2 by 1 do izq[j]:=a: der[j]:=b: ptmed[j]:=evalf(a+((b-a)/2.),14): vmed:=evalf(f(ptmed[j]),14): if (vmed=0) then print(`la raiz buscada es `,ptmed[j]): else

14

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

if(vmed*f(a)>0) then a:=ptmed[j]: else b:=ptmed[j]: fi: fi: od:

La solucin alcanzada tras numit iteraciones es almacenda en el vector ptmed[], posicin numit:2
> sol2:=ptmed[numit2];
sol2 := -0.99999994784595

> dibsol2:=[seq([k,ptmed[k]],k=0..numit2)]:

C) Intervalo [-2.5,3]:
> a3:=-2.5;f(a3);b3:=3;f(b3);f(a3)*f(b3)<0; a3 := -2.5
-361.7578125 b3 := 3 480
-173643.7500 < 0

> eps:=10^(-7); numit3:=ceil((ln(abs(b3-a3)/eps)/ln(2.))-1.); 1 eps := 10000000


numit3 := 25

> a:=a3: b:=b3: for j from 0 to numit3 by 1 do izq[j]:=a: der[j]:=b: ptmed[j]:=evalf(a+((b-a)/2.),14): vmed:=evalf(f(ptmed[j]),14): if (vmed=0) then print(`la raiz buscada es `,ptmed[j]): else if(vmed*f(a)>0) then a:=ptmed[j]: else b:=ptmed[j]:

15

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

fi: fi: od:

La solucin alcanzada tras numit iteraciones es almacenda en el vector ptmed[], posicin numit3:
> sol3:=ptmed[numit3];
sol3 := -2.0000000670552

> dibsol3:=[seq([k,ptmed[k]],k=0..numit3)]:

Estudiemos ahora cmo se han comportado cada una de las soluciones obtenidas grficamente.
> with(plots): pp1:=pointplot(dibsol1,color=blue,symbol=cross,axes=boxed): pp2:=pointplot(dibsol2,color=red,symbol=diamond,axes=boxed): pp3:=pointplot(dibsol3,color=brown,symbol=circle,axes=boxed): display(pp1,pp2,pp3);

> fin;
fin

16

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

Aplicacin del paleontolgica)

mtodo

de

biparticin:

caso

(datacin

En una muestra de suelo, se pretende datar la aparicin de ciertos organismos fsiles. Se conoce la cantidad de un cierto istopo p, habitualmente C14, inicialmente presente antes de que el organismo falleciera, sea esta cantidad NC14 . 0

A partir de ese momento comienza la desintegracin isotpica, con una tasa marcada por la constante de desintegracin . Si la cantidad medida de C14 en el momento actual es NC14 (t a ) la ecuacin que rige la concentracin en moles del C14, para un aporte externo es:
t NC14 (t a ) NC14 + et 1 = 0 0 e

donde, para el istopo C14: = 0.00012378 moles/ao y = 10-8 moles/ao. = 1mol cul es la edad del fsil Sabiendo que NC14 (t a ) = 0.0001moles y NC14 0 hallado?

En resumen, se debe resolver la ecuacin f(t) = 0 donde: f(t) = 0.0001 1e 0.00012378t + 108 ( e0.00012378t 1) = 0 0.00012378

> restart: > f:=t->NC14ta-(NC14t0 * exp(-lambda*t)) + (nu/lambda) * (exp(-lambda*t)-1); ( t ) ( t ) (e 1) f := t NC14ta NC14t0 e + > lambda:=0.00012378: > NC14ta:=0.0001: > NC14t0:=1.: > nu:=10^(-8): Para poder aplicar el mtodo de biparticin es necesario encontrar un intervalo ene l que la funcin cambie de signo. Para ello podemos observar que si a = 0, > a:=0: f(a); -0.9999

17

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

As pues, la funcin toma valor negativo en a = 0. Puesto que adems la funcin es creciente, (a medida que se incremente el tiempo transcurrido hasta el instante actual mayor cantidad de istopo haba), podemos probar con distintas potencias de 10 para determinar el extremo superior del intervalo de bsqueda de la raz:
> f(10);f(10^2);f(10^3);f(10^4);f(10^5);f(10^6); -0.9986630657
-0.9875992861 -0.8834836117 -0.2899789221 0.00001500164271
0.00001921150428

Podemos observar que en b = 100000 la funcin ya cambia de signo tomando valores positivos. Por tanto buscaremos la solucin en el intervalo [0, 100000]. Para utilizar el mtodo de biparticin consideraremos adems = 0.01 ao.
> b:=100000: > f(a);f(b);is(f(a)*f(b)<0); -0.2899789221
0.00001500164271 true

> eps:=0.01:

Ejecutamos con estos parmetros el procedimiento de biparticin:


> bipart(a,b,f,eps,sol,numit):

Obteniendo como edad del fsil:


> sol;numit;
87735.65885 23

habiendo realizado 23 iteraciones para determinarla.


> fin;
fin

18

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

Aplicacin del mtodo de biparticin: caso 4 (determinacin de temperaturas de ebullicin de mezclas)


El enunciado de este ejercicio fue sugerido por el profesor D. Jos Aguado, Catedrtico de Universidad del rea Ingeniera Qumica en la Universidad Rey Juan Carlos.

La presin de vapor (en mmHg) del n-hexano (C6) y del n-octano (C8) se pueden relacionar con la temperatura absoluta mediante las expresiones: 2697.55 0 log PC = 15.8737 6 T 48.784 3127.60 0 log PC = 15.9798 8 T 63.633 Segn dichas frmulas, para 2 atmsferas (1520 mm Hg) la temperatura de ebullicin del n-hexano es 364.39K y la del n-octano es de 425.07K.

( )

( )

Se desea conocer la temperatura de ebullicin a 2 atmsferas de una mezcla lquida conteniendo el 50% de moles de cada uno de los dos componentes. Para ello, denotando por x1 y x2 a las fracciones molares en la fase lquida de n-hexano y n-octano respectivamente (ambas 0.5 como se acaba de sealar), y por y1 e y2 a las fracciones molares respectivas en la fase vapor, se pueden relacionar ambas fracciones por:
y1 =
0 PC 6

.x1 =

0 PC 6

2.P

, y2 =

0 PC 8

.x 2 =

0 PC 8

2.P

donde Pz es la presin de vapor del compuesto z puro y P es la presin de trabajo (2 atmsferas = 1520 mmHg) Puesto que adems se sabe que las fracciones molares debe sumar la unidad resultar que:
1 = y1 + y 2 =
0 PC 6

2.P

0 PC 8

2.P

19

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

de donde se tiene que la temperatura de ebullicin buscada se podr determinar resolviendo la ecuacin:
f(T) = e
2697.55 15.8737 T 48.784

3040

3127.60 15.9798 T 63.633

3040

1= 0

El programa que sigue realiza esta tarea utilizando el procedimiento del mtodo de biparticin antes sealado. Para ello utiliza una precisin de 10-3 K (muy superior a la que en un laboratorio se podra utilizar) y se realiza la bsqueda en el intervalo [364, 425] cuyos extremos son una aproximacin de las temperaturas de ebullicin a 2 atmsferas del n-hexano y del n-octano puros respectivamente.:
> restart; > with(linalg): with(plots):
Warning, the protected names norm and trace have been redefined and unprotected Warning, the name changecoords has been redefined

> read "bipart.m": > a:=364.; b:=425.; epsilon:=10^(-3.);


a := 364. b := 425. := 0.001000000000

> f:=T->(exp(15.8737 - (2697.55/(T-48.784)))+ exp(15.9798 - (3127.60/(T-63.633))))/3040 - 1;


15.8737 T 48.784 15.9798 T 63.633 1 1 f := T + 1 e e 3040 3040 2697.55 3127.60

> bipart(a,b,f,epsilon,sol,numit): > sol;


384.4298248

> fin_del_ejemplo;
fin_del_ejemplo

20

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

Tercer ejemplo: Mtodo sucesivas (o de punto fijo)

de

aproximaciones

Como ha podido comprobarse en los ejemplos anteriores, aunque la convergencia hacia una raz del problema f(x) = 0 es siempre posible mediante el mtodo de biparticin (siempre que se verifiquen las hiptesis sobre el cambio de signo de la funcin y sobre su continuidad en el intervalo de bsqueda de la solucin), sta es lenta, y puede suponer la realizacin de muchas iteraciones hasta alcanzar una precisin suficiente. Este hecho incrementa el coste computacional de obtencin de la solucin. Por otra parte, el mtodo de biparticin es complicado extenderlo al caso de resolucin de sistemas de ecuaciones no lineales. Es por ello conveniente considerar otros mtodos. Entre ellos dedicaremos este apartado al mtodo de aproximaciones sucesivas, o de punto fijo debido al fundamento matemtico que lo formula. Resumidamente para poder utilizar este mtodo es preciso reformular el problema no lineal hallar x solucin de f(x) = 0 (P1) en la forma denominada como bsqueda de un punto fijo hallar x solucin de g(x) = x (P2) Para llevar a cabo la transformacin de (P1) a (P2), pueden plantearse muchas posibilidades (algunas de ellas las veremos en los ejemplos) segn sea el tipo de funcin no lineal f(x). Pero una vez que se haya reformulado el problema, cundo tiene solucin (P2)?. Se demuestra tambin (para la justificacin detallada pueden consultarse las referencias [1] o [2] de esta prctica) que la condicin suficiente (que no necesaria) para que P2 posea solucin es que g(x) sea una contraccin (es decir una aplicacin cuyas imgenes, para todo punto del intervalo en el que se busque la solucin pertenezcan al propio intervalo de bsqueda y siendo g(x) una aplicacin lipschitziana de razn k<1, es decir que exista un valor k tal que 0 < k < 1 para el que |g(x)-g(y)|< k|x-y| sean cuales sean las abscisas x e y consideradas en el intervalo en el que se busca la solucin de (P2)) y que el intervalo de bsqueda sea un completo (en la recta real, y a nuestros efectos traduciremos esta condicin por el hecho de que el intervalo sea cerrado).

21

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

La primera de estas condiciones, a menudo, no es fcil de verificar. Una forma de relajar esta condicin (sustituyndola por otra ms restrictiva) y asegurar la convergencia del mtodo dentro de un intervalo [a,b] donde se busca el punto fijo es que: o g(x) tenga todas sus imgenes pertenecientes a [a, b] o g(x) sea continua en [a, b] y g(x) tambin sea continua en [a, b]. o |g'(x)| < 1 para todo x en [a,b] Una vez asegurada la contractividad de la funcin g(x), el algoritmo del punto fijo que permite obtener una sucesin de puntos convergente hacia dicho punto, responde al esquema siguiente: x0 dado en [a, b] xi+1 = g(xi) (i = 0, 1, 2, ) Un algoritmo para este mtodo puede esquematizarse como: El nmero de iteraciones que como mximo realiza el algoritmo, se encuentra acotado superiormente por:
(1 k) log x x 0 1 = log(k)

imax

Siendo k la constante de la contraccin g(x) y e la distancia mxima al punto fijo que se permite a la solucin aproximada. Puede demostrarse ver ([1] o [2]) que, si g(x) es una contraccin de razn k, la distancia de xi a la solucin x* es proporcional a la distancia |xi xi-1| siendo el factor de proporcionalidad k/(1-k). Por ello esta distancia entre aproximaciones consecutivas es el que suele ser utilizado en la prctica. En el procedimiento siguiente se recoge un algoritmo, programado en MAPLE, del mtodo de punto fijo. Su buen o mal funcionamiento depender de que la aplicacin g(x) sea una contraccin o no en el intervalo (a, b) en el que se busque la solucin (aspecto este ltimo del que mostraremos ms adelante ejemplos sobre cmo realizarlo). El procedimiento proporciona todas las aproximaciones 22

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

calculadas en las sucesivas iteraciones (en el array x y con el objeto de poder realizar grficos posteriormente con ellos) y el nmero de iteraciones realizadas (variable niter). En cuanto al nmero mximo de iteraciones permitidas al algoritmo se supone fijado en el parmetro de entrad maxiter. Cuando el valor de niter sea igual al de maxiter se tendr un motivo para sospechar que no ha habido convergencia del mtodo lo cual podr valorarse analizando la diferencia entre el valor de g(xniter) y xniter). El resto de parmetros de entrada del procedimiento son (se detendr el proceso cuando |xiter xiter-1| < ), la contraccin (g) y el valor semilla con el que se inicializa el proceso iterativo.

Procedimiento del mtodo de punto fijo


> aprsuc:=proc(semilla,g,maxiter,eps,x,niter) local iter,tol: x:=array(0..maxiter): x[0]:=semilla: iter:=0: tol:=2.*eps: while ((iter<maxiter) and (tol>eps)) do x[iter+1]:=g(x[iter]): tol:=abs(x[iter+1]-x[iter]): iter:=iter+1: od: niter:=iter: end proc: > save aprsuc,"aprsuc.m":

Apliquemos el mtodo a algunos ejemplos

Aplicacin del mtodo de aproximaciones sucesivas: caso 1 (los peligros de no verificar que g(x) es una contraccin)
> restart; with(linalg): with(plots):

El no analizar si una funcin g(x) es una contraccin sobre el intervalo de trabajo es algo que se hace con mucha frecuencia (por pereza o por no poder hacerlo al no conocer la funcin ms que a travs de los valores que toma en un conjunto discreto de abscisas). Ello es peligroso pues puede depararnos sorpresas como se ilustra en el siguiente ejemplo: Determinar la nica raz de la ecuacin x3 + 4x2 - 10 = 0 en el intervalo [1, 1'5] mediante el mtodo de aproximaciones sucesivas. 23

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

Primera opcin: Sumando x en ambos trminos de la ecuacin se tiene que x = g1(x) siendo g1(x) = x3 + 4x2 + x -10

Por tanto, partiendo de x[0] = 1.:


> g1:=x->x^3+4.*x^2+x-10.; g1 := x x 3 + 4. x 2 + x 10. > read "aprsuc.m": > epsilon:=1*10^(-6):maxiter:=100: semilla:=1.: aprsuc(semilla,g1,maxiter,epsilon,x,niter): > niter; 22

Todo parece indicar que en 22 iteraciones hemos hallado la solucin, pero.. Si escribimos el valor hallado, el de la funcin g1 en l y la diferencia entre ambos podemos observar que.:
> g1(x[niter]);x[niter];g1(x[niter])-x[niter]; Float( undefined )
Float( undefined ) Float( undefined )

Qu ha sucedido?. Escribamos las primeras iteraciones realizadas:


> x[0]; x[1]; x[2]; x[3]; x[4]; x[5]; 1.
-4. -14. -1984.

-0.7793788874 10 10
-0.4734192476 10 30

Claramente el mtodo no ha convergido (la aplicacin g1 no es una contraccin). Representemos grficamente el proceso. Para ello usaremos el comando arrow de la librera plottools que permite dibujar flechas y sobre el que puedes obtener informacin en la ayuda de MAPLE. Adems de los movimientos realizados en las primeras iteraciones representaremos la funcin g(x) y la bisectriz del primer y tercer cuadrante. 24

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

> dib1:=plot(g1,-25..25,-25..25,color=blue,thickness=2): > bis:=x->x: dibbis:=plot(bis,-25..25,-25..25,color=red,thickness=2): > with(plottools): > for i from 0 to 5 by 1 do if i=0 then base:=0 else base:=x[i] fi: iter[i+1] := arrow([x[i],base], [x[i],x[i+1]], .01, .3, .2, color=black): horiz[i+1] := arrow([x[i],x[i+1]],[x[i+1],x[i+1]], .01,.3, .2, color=black): od: > display(dib1,dibbis,seq(iter[i],i=1..6),seq(horiz[i], i=1..6));

Segunda opcin: Examinemos otra opcin. Siendo f(x) = x3 + 4.x2 -10, de la ecuacin f(x) = 0 puede despejarse x3 resultando que x3 = (10 4x2), y dividiendo por x resultar que: x2 = ((10/x) 4x) de donde hallando la raz cuadrada se obtiene finalmente que: x = sqrt( ((10/x) 4x)) habindonos quedado con la raz positiva pues se busca una solucin positiva. Veamos qu pasa ahora:

25

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

> g2:=x->sqrt((10./x)-4*x);
g2 := x 10. 4x x

> epsilon:=1*10^(-6): maxiter:=100: semilla:=1.: niter:='niter': aprsuc(semilla,g2,maxiter,epsilon,x,niter): > niter; 100

Hemos agotado las 100 iteraciones permitidas. Mala seal! Verifiquemos el parecido entre el supuesto punto fijo y el valor en l de la funcin:

> g2(x[niter]);x[niter];g2(x[niter])-x[niter]; 2.274754878 3.608812723 I


2.274754878 + 3.608812723 I 0. 7.217625446 I

Hemos viajado al campo de los complejos. Examinemos los primeros valores obtenidos:
> x[0]; x[1]; x[2]; x[3]; x[4]; x[5]; 1.
2.449489743 2.390706186 I 2.621611072 2.621611072 I
1.801962130 + 3.438936993 I

2.357415542 3.401440091 I

Qu sucedi ahora?: La explicacin se puede tener sin ms que representar la funcin g(x):
> dib2:=plot(g2,-25..25,-25..25, color=blue, thickness=2, numpoints=1000): > bis:=x->x: dibbis:=plot(bis,-25..25,-25..25,color=red,thickness=2): > display(dib2,dibbis);

26

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

La funcin g2(x) no existe para x >

2.5 ni para -

2.5 < x <= 0, tendiendo a

infinito cuando x tiende a 0 por la derecha. No se le pueden pedir peras al olmo!!!.


Tercera opcin: Cambiemos de funcin. Para ello de f(x) = x3 + 4.x2 -10 = 0,

despejamos el trmino en x2 obteniendo: x2 = (10 - x3)/4 de donde: x = Veamos qu pasa:


> g3:=x->sqrt(10.-x^3)/2.;
g3 := x 10. x 3 2.

10 x 3 . 2

> epsilon:=1*10^(-6):maxiter:=100: semilla:=1.: niter:='niter': aprsuc(semilla,g3,maxiter,epsilon,x,niter): > niter; 21

Slo hemos realizado 21 iteraciones. Esto parece que funciona. Pero verifiqumoslo:

27

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

> g3(x[niter]);x[niter];g3(x[niter])-x[niter]; 1.365229900


1.365230236 -0.336 10 -6

En efecto, ahora s que hemos determinado la solucin aproximada de la ecuacin:


> f:=x->x^3+4*x^2-10: f(x[niter]);
0.367 10 -5

Examinemos las primeras iteraciones y representemos grficamente el proceso::


> x[0]; x[1]; x[2]; x[3]; x[4]; x[5]; 1.
1.500000000 1.286953768

1.402540804 1.345458374 1.375170253

> dib3:=plot(g3,0..2,0..2,color=blue,thickness=2): > bis:=x->x: dibbis:=plot(bis,0..2,0..2,color=red,thickness=2): > iter[1]:=arrow([x[0],0], [x[0],x[1]], .01, .02, .1,color=black): > horiz[1] := arrow([x[0],x[1]], [x[1],x[1]], .01, .02, .1, color=black): > for i from 1 to 5 by 1 do iter[i+1]:= arrow([x[i],x[i]], [x[i],x[i+1]], .01, .02, .1,color=black): horiz[i+1]:= arrow([x[i],x[i+1]], [x[i+1],x[i+1]], .01, .02, .1, color=black): od: > display(dib3,dibbis,seq(iter[i],i=1..6), seq(horiz[i],i=1..6));

28

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

Cuarta opcin: Examinemos otra opcin. Para ello: f(x) = x^3 + 4.x^2 -10 = 0 lo 10 transformaremos en: x2 (x+4) - 10 = 0 de donde: x = . Veamos que x+4

sucede:
> g4:=x->sqrt(10./(x+4.));
g4 := x

10. x + 4.

> epsilon:=1*10^(-6):maxiter:=100: semilla:=1.: niter:='niter': aprsuc(semilla,g4,maxiter,epsilon,x,niter): > niter; 8

Slo hemos realizado 8 iteraciones (menos que en el caso anterior). Esto parece que funciona an mejor. Pero verifiqumoslo:
> g4(x[niter]);x[niter];g4(x[niter])-x[niter]; 1.365230017
1.365229987

0.30 10 -7

29

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

Examinemos las primeras iteraciones y representemos grficamente el proceso:


> x[0]; x[1]; x[2]; x[3]; x[4]; x[5]; 1.
1.414213562 1.359040218 1.366018219 1.365129741
1.365242771

> dib4:=plot(g4,0..2,0..2,color=blue,thickness=2): > dibbis:=plot(bis,0..2,0..2,color=red,thickness=2): > iter[1]:=arrow([x[0],0], [x[0],x[1]], .01, .02, .1,color=black): > horiz[1] := arrow([x[0],x[1]], [x[1],x[1]], .01, .02, .1, color=black): > for i from 1 to 5 by 1 do iter[i+1] := arrow([x[i],x[i]], [x[i],x[i+1]], .01, .02, .1,color=black): horiz[i+1] := arrow([x[i],x[i+1]], [x[i+1],x[i+1]], .01, .02, .1, color=black): od: > display(dib4, dibbis, seq(iter[i],i=1..6), seq(horiz[i],i=1..6));

30

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

Tercera opcin: Muchas otras opciones son posibles. Terminemos con una opcin muy especial (la del mtodo de Newton) eligiendo g(x) = x - f(x)/f'(x) es decir: g(x) = x - (x3+4x2-10) / (3x2+8x) > g5:=x->x-(x^3+4.*x^2-10)/(3.*x^2+8.*x); x 3 + 4. x 2 10 g5 := x x 3. x 2 + 8. x > g5:=x->x-(x^3+4.*x^2-10)/(3.*x^2+8.*x); x 3 + 4. x 2 10 g5 := x x 3. x 2 + 8. x > epsilon:=1*10^(-6):maxiter:=100: semilla:=1.: niter:='niter': aprsuc(semilla,g5,maxiter,epsilon,x,niter): > niter; 5

Slo hemos realizado 5 iteraciones! (an menos que las 8 del caso anterior y que las 21 del tercer caso considerado). El mtodo de Newton funciona mejor. Pero verifiqumoslo:
> g5(x[niter]);x[niter];g5(x[niter])-x[niter]; 1.365230013
1.365230013

0.

Examinemos las primeras iteraciones y representemos grficamente el proceso:


> x[0]; x[1]; x[2]; x[3]; x[4]; x[5]; 1.
1.454545454 1.368900401 1.365236600 1.365230013 1.365230013

> dib5:=plot(g5,0..2,0..2,color=blue,thickness=2): > dibbis:=plot(bis,0..2,0..2,color=red,thickness=2):

31

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

> iter[1]:=arrow([x[0],0], [x[0],x[1]], .01, .02, .1,color=black): > horiz[1] := arrow([x[0],x[1]], [x[1],x[1]], .01, .02, .1, color=black): > for i from 1 to 5 by 1 do iter[i+1] := arrow([x[i],x[i]], [x[i],x[i+1]], .01, .02, .1,color=black): horiz[i+1] := arrow([x[i],x[i+1]], [x[i+1],x[i+1]], .01, .02, .1, color=black): od: > display(dib5,dibbis,seq(iter[i],i=1..4), seq(horiz[i],i=1..4));

Para terminar representemos las tres funciones con las que hemos tenido buenos resultados en una misma grfica y junto a la bisectriz del primer cuadrante: > dib3:=plot(g3,0..2,0..2,color=blue,thickness=2): > dib4:=plot(g4,0..2,0..2,color=magenta,thickness=2): > dib5:=plot(g5,0..2,0..2,color=green,thickness=2): > display(dib3,dib4,dib5,dibbis);

32

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

En el entorno de la solucin x = 1.365230013 puede observarse que el valor absoluto de la derivada de las tres funciones es menor en el caso de g5, luego de g4 y el mayor es el de la derivada de g3. Comprobmoslo:
> dg3:=abs(D(g3)(1.365230013)); dg4:=abs(D(g4)(1.365230013)); dg5:=abs(D(g5)(1.365230013));
dg3 := 0.5119612546 dg4 := 0.1272294020 dg5 := 0.4750079764 10 -9

Ello te justifica la mayor velocidad de convergencia detectada en los ejemplos anteriores.


> fin;
fin

33

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

Aplicacin del mtodo de aproximaciones sucesivas: caso 2 (el anlisis del carcter contractivo de la aplicacin g(x))
Busquemos una raz de la funcin f(x) = 3x 2 e x en el intervalo [-4, 4].
> restart;with(linalg):with(plots):with(plottools): > f:=x->3*x^2-exp(x); f := x 3 x 2 e x

Intervalo de bsqueda de la raz


> a:=-4:b:=4:

Despejando del primer sumando de la funcin la variable x podemos definir la ecuacin g(x) = x siendo g(x) = ex . Analicemos si esta aplicacin es una 3 contraccin en [-4, 4]. Para ello definimos la funcin y su primera derivada:

> g:=x->sqrt(exp(x)/3);
g := x 1 x e 3

> der:=D(g);dera:=x->abs(der(x)); 1 der := x 6

ex 1 x e 3

dera := x der( x )

Representemos f(x) para visualizar sus races en [-4, 4]: > plot(f,a..b,thickness=3,color=red);

34

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

Analicemos en que subintervalo se verifica que | g'(x) | < 1 para comenzar a asegurar que el mtodo de aproximaciones sucesivas converge hacia una raz. Si representamos la funcin primera derivada tenemos:
> deri:=plot(dera(x),x=a..b,thickness=3, color=blue): uno:=plot(1,a..b,thickness=3,color=black,linestyle=3): > display(deri,uno);

35

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

La figura anterior muestra que existe un intervalo (entre -4 y alrededor de 2) en el que g(x) toma valores absolutos inferiores a la unidad. Pero determinemos ese intervalo analticamente. Para ello
> eq1:=der(x)=1;
eq1 := 1 3 6 ex = 1

nos indica que g(x) toma valor unidad en e x = 2 3


> b:=2.*ln(2*sqrt(3.));
b := 2.484906650

x = 2ln 2 3 , es decir:

En cuanto al extremo izquierdo del intervalo, al ser g(x) una funcin que slo toma valores positivos, consideraremos a = -4.
> a:=-4:

El que en el intervalo [a, b] la funcin g(x) tome valores siempre positivos, nos indica que g(x) es una funcin creciente en l. Por tanto para ver en que intervalo estn las imgenes por g(x) de todos los puntos de [a, b] bastar con ver qu sucede en sus extremos.
> evalf(g(a));g(b);
0.07813586219 2.000000000

Por tanto g(x) tiene todas las imgenes de los puntos de [a, b] en el propio [a, b]. Por ltimo la continuidad de g(x) es evidente al ser una raz cuadrada de valores siempre positivos.
> recta:=plot(x,x=a..b,thickness=3,color=black,linestyle=3): dibg:=plot(g,a..b,thickness=3,color=blue,linestyle=2): > rec1:=plot(-x,x=a..b,color=grey): > display(dibg,recta,rec1);

36

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

Pasemos por tanto a resolver la ecuacin:

> semilla:=-1.: eps:=1e-7: maxiter:=100: > aprsuc(semilla,g,maxiter,eps,x,niter):

habindose realizado el siguiente nmero de itraciones:

> niter;
21

Verifiquemos que el ltimo valor hallado es (aproximadamente) el punto fijo:


> x[niter];g(x[niter]);
0.9100075084 0.9100075434

Y que, efectivamente, la funcin alcanza un valor (aproximadamente) nulo en l:


> f(x[niter]);
-0.191 10 -6

37

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

Escribamos las soluciones aproximadas que se han ido hallando en cada iteracin:
> for j from 1 by 1 to niter do print(`iteracin=`,j,`solucin=`,x[j]); od; iteracin= , 1, solucin= , 0.3501806397
iteracin= , 2, solucin= , 0.6878284457 iteracin= , 3, solucin= , 0.8143281011
iteracin= , 4, solucin= , 0.8674979817

iteracin= , 5, solucin= , 0.8908696545 iteracin= , 6, solucin= , 0.9013412772 iteracin= , 7, solucin= , 0.9060729062 iteracin= , 8, solucin= , 0.9082190442 iteracin= , 9, solucin= , 0.9091941491
iteracin= , 10, solucin= , 0.9096375370

iteracin= , 11, solucin= , 0.9098392206 iteracin= , 12, solucin= , 0.9099309750 iteracin= , 13, solucin= , 0.9099727210 iteracin= , 14, solucin= , 0.9099917150 iteracin= , 15, solucin= , 0.9100003573
iteracin= , 16, solucin= , 0.9100042896

iteracin= , 17, solucin= , 0.9100060787 iteracin= , 18, solucin= , 0.9100068928 iteracin= , 19, solucin= , 0.9100072632 iteracin= , 20, solucin= , 0.9100074318 iteracin= , 21, solucin= , 0.9100075084

Por ltimo, representemos grficamente el proceso seguido en las primeras iteraciones y la representacin logartmica de la evolucin del error en las sucesivas iteraciones:

38

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

> l[0]:=[arrow([semilla,0],[semilla,g(semilla)],.0001,.08,0.1, color=blue), arrow([semilla,g(semilla)],[x[1],x[1]],.0001,.08, 0.2, color=red), arrow([x[1],x[1]],[x[1],0],.0001, .08, 0.1, color=brown)]: for k from 1 by 1 to niter-1 do l[k]:=[arrow([x[k],0],[x[k],g(x[k])],.0001, .08, 0.1, color=blue), arrow([x[k],g(x[k])],[x[k+1],x[k+1]],.0001,.08,0.2, color=red), arrow([x[k+1],x[k+1]],[x[k+1],0],.0001, .08, 0.1, color=brown)]: od: > bise:=t->t: dbis:=plot(bise,-0.5..2.3, color=black, thickness=3, linestyle=3): > display (dbis,dibg,seq(l[ii],ii=0..i-1));

> for i from 1 to niter-1 by 1 do difer[i]:=abs(x[i]-x[niter]): od: err:=pointplot ({seq([uu,log10(difer[uu])],uu=0..i)}): > display(err);

39

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

> fin;
fin

40

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

EJERCICIOS
Primer ejercicio propuesto: Aplicacin de los mtodos de biseccin o aproximaciones sucesivas a la determinacin de frecuencias de mxima emisin energtica
La densidad de energa radiada a la frecuencia por unidad de volumen en un cuerpo negro que se encuentra a la temperatura absoluta T, que denotaremos por u(,T),viene determinada por la ecuacin de Planck:
u(,T) = 8..h . c3 3 e k.T 1
h.

donde h es la constante de Planck h = 6.626.10-34 J.s , k es la constante de Boltzmann k = 1.38066.10-23 J/K y c es la velocidad de la luz en vaco c = 3.108 m/s . Se desea determnar la frecuencia (positiva) a la que se hace mxima la emisin de energa radiante a una temperatura fija T. Para ello, llamando M = Plank en la forma:
u(,T) = M. e 3
N. T

8..h c3

y N = h / k, se puede reescribir la ecuacin de

Como se busca que u sea mxima, derivando la expresin anterior respecto a e igualando a 0, se tiene que la mxima densidad de energa se produce cuando: N. N N. 3.2 . e T 1 3 . .e T T du =0 (,T) = M. d N. T e 1 de donde se tiene que:

41

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid
N. N. T 3 N T 3. . e 1 . .e = 0 T 2

La ecuacin anterior tiene una solucin trivial doble: u = 0. Pero esta solucin no tiene significacin fsica por lo que debe ser descartada. En este sentido, dividiendo por 2 en la ecuacin anterior resultar la ecuacin que debe resolverse: N. N N. 3 e T 1 e T = 0 T N Llamando x = podemos reescribir la ecuacin en la forma: T 3( e x 1) xe x = 0
Se pide: a) Resolver la ecuacin anterior por el mtodo de aproximaciones sucesivas, determinando un intervalo inicial de bsqueda de la solucin. Utilcese un parmetro de tolerancia = 10-5. b) Transformar a ecuacin anterior en una ecuacin de la forma x = g(x) determinado un intervalo en el que g(x) pueda garantizarse la convergencia del mtodo de aproximaciones sucesivas. Obtener una aproximacin de la constante de Lipschitz de la aplicacin g(x) y una estimacin del nmero de iteraciones que permitirn obtener la solucin aproximada de la ecuacin mediante el mtodo de punto fijo con una precisin de = 10-5. Obtener la solucin aproximada mediante el mtodo de aproximaciones sucesivas.
> restart; > > > > > > > > > > > fin_del_ejercicio;
fin_del_ejercicio

42

Programacin y Mtodos Numricos. C. Conde, A. Hidalgo y A. Lpez, C. Paredes y R. Rodrguez Prctica 12: Resolucin de ecuaciones no lineales(I) ETSI Minas de la Univ. Politcnica de Madrid

Segundo ejercicio propuesto: Aceleracin de la convergencia (Mtodo 2 de Aitken)


Consulta en la referencia [1] de esta prctica el mtodo D2 de Aitken (algoritmo de Steffensen) y elabora un procedimiento MAPLE que lo recoja. Aplica el mtodo a la resolucin del ejercicio anterior, grafica las distancias a la solucin de las aproximaciones obtenidas en cada iteracin y compralas con las del ejercicio anterior. > restart; > > > > > > > > > > > fin_del_ejercicio; fin_del_ejercicio

43

Potrebbero piacerti anche