Sei sulla pagina 1di 20

Inicio

MATLAB

Numrico

Races de ecuaciones Valores y vectores propios Integracin numrica Ecuaciones diferenciales Ajuste de datos Anlisis de Fourier Estadstica

Races de una ecuacin (II)


Mtodo del punto medio
El mtodo del punto medio es uno de los mtodos ms sencillos de comprender y es muy conveniente para dar rpidamente con la raz de la ecuacin dada, sin embargo, el nmero de clculos aumenta sustancialmente a medida que se desea mayor exactitud. Este procedimiento se basa en el teorema de Bolzano que dice que si tenemos una funcin y=f (x ), de variable real y continua en el intervalo [a, b], y el signo de la funcin en el extremo a es distinto al signo de la funcin en el extremo b del intervalo, existe al menos un valor c dentro de dicho intervalo tal que f (c)=0, c es por tanto, la raz buscada, vase la figura.

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Ejercicios

Supongamos una ecuacin f (x )=0 Para hallar la raz de la funcin en el intervalo (a, b), se divide el intervalo en la mitad. m=(a+b)/2 Pueden ocurrir uno de estos tres casos: Si f (m)=0 entonces m es la raz buscada Si f (a) y f (m) tienen signos contrarios, como en la figura, la raz buscada est en el intervalo (a, m). Si no se cumple la condicin anterior, f (b) y f (m) tendran signos contrarios y la raz estara en el intervalo (m, b). El nuevo intervalo reducido se divide por la mitad y se procede de igual forma. Finalmente, en una cierta etapa del proceso tendremos bien la raz exacta de la funcin f (x ), o una secuencia de intervalos cada vez ms reducidos [a1 ,b1 ], [a2 ,b2 ], .... [ai, bi]... tal que f(an )f(bn ) < 0bn an = 1 (b a) 2n

Como los puntos extremos de la izquierda a1 , a2 , ... an , ...forman una sucesin creciente y acotada, y los de la derecha b1 , b2 , ... bn , ... una sucesin acotada decreciente, existe un lmite comn que es la raz buscada.
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

= lim an = lim bn
n n

Si queremos conocer el valor de la raz con un error menor que , tenemos que realizar un nmero n de iteracciones tal que n> 1 ba ln( ) ln 2

Las condiciones de terminacin del proceso


El ordenador trabaja con nmeros de precisin limitada, por lo que tendremos que poner un criterio que establezca cuando la funcin f (x ) se considera nula. Diremos que f (x ) es nula cuando el valor absoluto de f (x ) sea menor que una cantidad pequea pero no nula 1. |f(x)| < 1 En segundo lugar, no podemos programar un proceso indefinido, es preciso, que la rutina repetitiva acabe en un momento dado. El criterio empleado es el siguiente an bn < 2 m Siendo 2 cierta cantidad prefijada. La raz se encuentra en el intervalo (an , bn ) y m es el punto medio de dicho intervalo. El tercer criterio de terminacin establece, que el proceso de bsqueda de la raz se interrumpir despus de un nmero prefijado de iteraciones, notificndose al usuario que no se ha encontrado la raz de la funcin con las condiciones fijadas anteriormente. Para poder codificar este procedimiento hemos de seguir los pasos siguientes 1. Partimos de un intervalo (a, b) en el que la funcin f (x ) cambia de signo 2. Se calcula m, abscisa mitad del intervalo mediante m=(a+b)/2 3. Se verifican las condiciones de terminacin 4. Si f (a) y f (m) tienen signos contrarios, como se ve en la figura, la raz est en el intervalo (a, m), entonces b toma el
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

valor de m. 5. Si la condicin anterior no es cierta, la raz se encuentra en el intervalo (m, b), por lo que a tomar el valor de m. 6. Se repite el proceso hasta que se cumple una u otra condicin de terminacin
function m=punto_medio(f, a, b, MAXITER) CERO=1e-10; ERROR=0.001; for i=1:MAXITER m=(a+b)/2; ym=f(m); if abs(ym)<CERO break elseif abs((a-b)/m)<ERROR break elseif (f(a)*ym)<0 b=m; else a=m; end end if(i==MAXITER) error('no se ha encontrado la raiz') end end

Resolver la ecuacin trascendente f (x )=cos(x )- x =0, aplicando el procedimiento del punto medio. En la grfica, se representa y=cos(x )- x , tiene un cero y=0, para x comprendido entre 0.7 y 0.8

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Definimos la funcin f para calcular la raz de la ecuacin trascendente y buscamos la raz en el intervalo (0.5,1) haciendo 10 iteracciones. Vamos a la ventana de comandos
>> func=@(x) cos(x)-x; >> punto_medio(func,0.5,1,10) ??? Error using ==> punto_medio at 18

Nos da un mensaje de error bien por que hemos puesto pocas iteracciones MAXITER, o por que no acotamos suficientemente el intervalo (a,b).
>> punto_medio(func,0.7,0.8,10) ans = 0.7393

Mtodo de la secante
Este mtodo comienza con dos puntos (x 0 , f (x 0 )) y (x 1 , f (x 1 )), tales que los signos de f (x 0 ) y f (x 1 ) son opuestos, es
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

decir, f (x 0 )f (x 1 )<0

Se dibuja una lnea recta entre los dos puntos cuya ecuacin es f(x1 ) f(x0 ) y f(x0 ) = x x0 x1 x0 x1 x0 f(x1 ) f(x0 )

El valor de x=x 2 para el cual y se aproxima a la raz buscada es x2 = x0 f(x0 )

En la siguiente iteraccin, tomamos un intervalo ms pequeo comprendido entre x 2 y x 1 que es donde se encuentra la raz. Por lo que hacemos x 0 =x 2 y volvemos a calcular un nuevo valor x 2 cada vez ms prximo a la raz buscada. Definimos un nuevo procedimiento denominado secante, similar al del punto_medio, se pasa la funcin f , el intervalo en el que se encuentra la raz (x 0 , x 1 ) y el nmero de iteracciones MAXITER. El procedimiento termina, cuando se encuentra la raz dentro de una determinada tolerancia an bn < 2 m donde m=(an +bn )/2 es el punto medio del intervalo (an , bn ) cada vez ms pequeo.
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

donde =(an +bn )/2 es el punto medio del intervalo (an , bn ) cada vez ms pequeo. O bien, cuando se han completado el bucle, sin que se haya encontrado la raz emitiendo un mensaje de error.
function x2=secante(f,x0,x1,MAXITER) ERROR=0.0001; for i=1:MAXITER f0=f(x0); f1=f(x1); x2=x0-f0*(x1-x0)/(f1-f0); if (abs(2*(x2-x1)/(x2+x1))<ERROR | abs(2*(x2-x0)/(x2+x0))<ERROR) break; end if f(x2)*f0<0 x1=x2; else x0=x2; end end if(i==MAXITER) error('no se ha encontrado la raiz') end end

A la funcin secante, le pasamos la funcin f , el intervalo en el que se encuentra la raz (x 0 , x 1 ) y el nmero de iteracciones MAXITER Consideremos la funcin f (x )=cos(x )- x , en la ventana de comandos escribimos
>> func=@(x) cos(x)-x; >> secante(func,0.5,1,10) ans = 0.7391

Races mltiples
La representacin grfica de la funcin en una pantalla de alta resolucin nos permitir estimar los intervalos en los que la funcin cambia de signo y aplicar en consecuencia, el procedimiento mitad a cada intervalo. Si no es posible una representacin grfica o esta no es de la suficiente resolucin, ser preciso explorar el eje X en busca de intervalos en los que la funcin cambia de signo. Cuando los encontremos aplicaremos a cada uno de ellos el procedimiento del punto
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

medio. Esta exploracin no es sencilla, ya que podemos encontrarnos con intervalos en que la funcin no cambia de signo ya sea por que no tiene races, o por que tiene un nmero par, tal como se ve en las figuras. La solucin a este problema es hacer ms pequeo el intervalo de exploracin, esto implica ms tiempo de clculo y no garantiza que las races puedan ser encontradas si algunas de ellas estn muy juntas, o la curva es tangente al eje X. Las situaciones en las que nos podemos encontrar cuando buscamos las races de una funcin y=f (x ) en un intervalo (a,b) se muestran en la figura f (a) y f (b) tienen el mismo signo, no hay raz de la funcin en dicho intervalo, pero tambin puede ocurrir que haya un nmero par de races en dicho intervalo. f (a) y f (b) tienen distinto signo, hay una raz de la funcin en dicho intervalo, pero tambin puede ocurrir que haya un nmero impar de races en dicho intervalo.

Vamos a crear un procedimiento que nos permita buscar los intervalos en los que la funcin cambia de signo y calcular la raz en cada uno de ellos, definiendo una funcin denominada buscar_intervalos. Se divide el intervalo (a,b) en n-1 intervalos igualmente espaciados (n divisiones incluidos los extremos) se calcula si en los extremos de los cada uno de los pequeos intervalos la funcin cambia de signo, en caso afirmativo se guardan los extremos (x j, yj) de dicho intervalo en una matriz xb. Si la matriz est vaca (no tiene ningn elemento) isempty, un mensaje nos lo indica. La funcin devuelve los intervalos (x j, yj) guardados en la matriz xb.
function xb = buscar_intervalos(f,a,b,n) x = linspace(a,b,n); j = 0; for i = 1:length(x)-1 if sign(f(x(i))) ~= sign(f(x(i+1)))

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

j = j + 1; xb(j,1) = x(i); xb(j,2) = x(i+1); end end if isempty(xb) disp('no se han encontrado cambios de signo') else disp(['nmero de intervalos:' int2str(j)]) end end

Este cdigo es correcto, pero se puede hacer ms eficiente, un asunto de vital importancia en el clculo intensivo. Nos daremos cuenta, que se calcula dos veces la funcin f para el mismo valor de x , en el final de un intervalo y en el comienzo del siguiente, ahorraremos el tiempo que tarda al procesador en realizar estas operaciones si guardamos el valor de f (x ) calculado al final del intervalo previo en la variable local y2 y lo asignamos a la variable y1, que guarda el valor de la funcin f (x ) en el principio del intervalo siguiente.
function xb = buscar_intervalos(f,a,b,n) x = linspace(a,b,n); j = 0; y1=f(x(1)); for i = 1:length(x)-1 y2=f(x(i+1)); if sign(y1) ~= sign(y2) j = j + 1; xb(j,1) = x(i); xb(j,2) = x(i+1); end y1=y2; end if isempty(xb) disp('no se han encontrado cambios de signo') else disp(['nmero de intervalos:' int2str(j)]) end end

Difraccin Fraunhofer producida por una abertura circular


open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

http://www.sc.ehu.es/sbweb/fisica_/ondas/interfer/difraccion1/difraccion1_1.html

En la figura vemos el mximo principal de difraccin en el origen, los mximos secundarios y los mnimos o ceros de intensidad debida a la difraccin por una abertura circular. La intensidad en una direccin producida por una abertura circular de raio a es I = I0 ( 2J1 (x) x ) x =
2

2a sin

Los mnimos de intensidad son los ceros de la funcin de Bessel J1 (x ) cuya representacin grfica vemos en la figura

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Si exploramos el intervalo comprendido entre a=0 y b=30, tomando 6 intervalos, de anchura x =5 tal como vemos en la figura, la funcin cambia de signo en los intervalos (0,5), (5,10) y (20,25), pero no cambia de signo en los intervalos (10,15), (15,20) y (25,30) por tener un nmero par de races. Luego, si exploramos la funcin J1 (x ) en el intervalo (0,30) tomando 6 intervalos de anchura x =5 encontraremos solamente tres races de las nueve existentes. Nota: omitimos el origen x =0, por que se produce un mximo (no un mnimo de intensidad)
open in browser PRO version
Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

x0

lim (

J1 (x) x

)=1

Escribimos el script denominado circular_difraccion para calcular las races de la ecuacin trascendente J1 (x )=0 La funcin buscar_intervalos, busca los intervalos en los que la funcin J1 (x ) cambia de signo, el intervalo en el que se explora la funcin es (0.1, 30), omitimos el origen, y el nmero de divisiones del intervalo es 50, incluyendo los extremos. La funcin devuelve la matriz xb, que guarda los extremos (x j, yj) de cada intervalo en los que la funcin cambia de signo. La dimensin de la martriz xb nos la proporciona la funcin size y se guarda en el vector nb de dos elementos [filas columnas]. El nmero de columnas nb(2) de la matriz es dos y el nmero de filas nb(1) es el nmero de intervalos. Para cada intervalo en el que la funcin cambia de signo, se aplica el procedimiento del punto medio, llamando a la funcin punto_medio, para buscar la raz en dicho intervalo. Escribimos un script que realiza las siguientes tareas: 1. Define una funcin annima besselj (1,x ) 2. Utiliza la funcin buscar_intervalos para encontrar los intervalos en los que la funcin cambia de signo. Explorando el intervalo que va de a=0.1 y b=30. Se omite la primera raz x =0 por que corresponde al mximo principal 3. Calcula e imprime las races empleando el procedimiento del punto medio, llamando a la funcin punto_medio.
J1=@(x) besselj(1,x); xb=buscar_intervalos(J1,0.1,30,50); nb=size(xb); disp('mnimos: difraccin por abertura circular') for i=1:nb(1) min(i)=punto_medio(J1,xb(i,1),xb(i,2),50); disp(min(i)) end

En la ventana de comandos corremos el script circular_difraccion para resolver la ecuacin trascendente J1 (x )=0 en el intervalo (0.1,30)
>> circular_difraccion mnimos: difraccin por abertura circular

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

3.8315 7.0149 10.1731 13.3195 16.4659 19.6170 22.7634 25.9097 29.0561

Difraccin Fraunhofer producida por una rendija


http://www.sc.ehu.es/sbweb/fisica_/ondas/interfer/difraccion/difraccion.html El mximo principal ocurre en el origen x =0, y los mximos secundarios son las races de la ecuacin trascendente tan(x )- x =0

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

En la figura se representan la recta y=x (color azul) y la funcin y=tan(x ) (color rojo). Se ha hecho ms pequea la escala vertical que la horizontal. Como observamos en la grfica los mximos secundarios ocurren aproximadamente para x n (2n+1)/2 donde n=1, 2, 3... Escribimos el script rendija_difraccion que realiza las siguientes tareas: 1. Define una funcin annima tan(x )-x 2. Utiliza la funcin buscar_intervalos para encontrar los intervalos en los que la funcin cambia de signo. Explorando el intervalo que va de a=0.1 y b=7/2. Se omite la primera raz x =0 por que corresponde al mximo principal 3. Calcula e imprime las races empleando el procedimiento del punto medio, llamando a la funcin punto_medio.
f=@(x) tan(x)-x; xb=buscar_intervalos(f,0.1,7*pi/2,10);

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

nb=size(xb); disp('mximos secundarios: difraccin por una rendija') for i=1:nb(1) max(i)=punto_medio(f,xb(i,1),xb(i,2),50); disp(max(i)) end

En la ventana de comandos corremos el script rendija_difraccion


>> rendija_difraccion mximos secundarios: difraccin por una rendija 1.5710 4.4933 4.7122 10.9018

Como hemos visto en la figura (ms arriba), la primera raz es prxima a 3/2=4.7124, la segunda, es prxima 5/2=7.8540 y la tercera es prxima a 7/2=10.9956. El resultado que hemos obtenido difiere notablemente. No parece adecuado el procedimiento del punto medio para calcular las races de la ecuacin tan(x )- x =0. El problema radica, como se v en la figura, en que la tangente se hace muy grande en valores prximos a x n (2n+1)/2. Cambiamos la ecuacin tan(x )- x=0 por su equivalente x cos(x )-sin(x )=0. Representamos la funcin y=x cos(x )-sin(x )

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Escribimos el siguiente script denominado rendija_difraccion


f=@(x) x*cos(x)-sin(x); xb=buscar_intervalos(f,0.1,7*pi/2,50); nb=size(xb); disp('mximos: difraccin por una rendija') for i=1:nb(1) r(i)=punto_medio(f,xb(i,1),xb(i,2),50); disp(max(i)) end

En la ventana de comandos
>> rendija_difraccion mximos: difraccin por una rendija

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

4.4933 7.7262 10.9018

Comparamos las races obtenidas con la representacin grfica y vemos que hemos obtenido un resultado mejor. Un procedimiento numrico no siempre es adecuado para resolver un problema particular.

Funciones MATLAB para calcular las races de una ecuacin


El procedimiento del punto medio, aproximaciones sucesivas, secante, etc., pueden ser tiles para obtener races reales, pero no son vlidas para obtener las races complejas de un polinomio. MATLAB dispone del la funcin roots para este propsito, tal como ya hemos visto al principio de este captulo La funcin fzero puede encontrar la raz de una ecuacin trascendente f (x )=0. Su sintaxis es fzero(funcion,x 0) Donde funcion es el nombre de la funcin cuyas races queremos determinar y x 0 es el intervalo [a b] donde la funcin cambia de signo, es decir, el signo de f (a) es distinto al signo de f (b). x 0 puede ser tambin un valor cercano a la raz es decir, una primera aproximacin. Podemos definir una funcin annima y guardarla en el manejador func.Le pasamos la funcin annima func a fzero. En la ventana de comandos, definimos la funcin y buscamos un intervalo [0.4 1] donde la funcin cambia de signo. Alternativamente, probamos una primara aproximacin a la raz buscada x 0=0.6
>> func=@(x) cos(x)-x; >> func(0.4) ans = 0.5211 >> func(1) ans = -0.4597 >> r=fzero(func,[0.4 1]) %intervalo donde se encuentra la raz r= 0.7391 >> fzero(func,0.6) %aproximacin inicial a la raz ans = 0.7391

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Podemos definir explcitamente la funcin func y guardarla en el fichero func.m


function y=func(x) y=cos(x)-x; end

Llamamos a fzero anteponiendo al nombre de la funcin el smbolo @ (vase al final de la pgina Funciones)
>> fzero(@func,0.6) ans= 0.7391

A veces la funcin func definida y guardada en un fichero .M precisa de los valores de ciertos parmetros a, b
function y=func(x,a,b) %cdigo de la funcin end

A fzero solamente le podemos pasar el manejador (handle) de la funcin de variable x . La forma en que la funcin func conoce el valor de sus parmetros a y b es crear una funcin annima f 1 en trminos de func y se le pasamos su manejador a la funcin fzero
f1=@(x)func(x,a,b); p=fzero(f1,x0);

En el ejercicio "La ecuacin de van der Waals" utilizaremos esta opcin.

Sistemas de ecuaciones no lineales


Calcular las races del sistema de dos ecuaciones: f 1 (x,y)=2x 2- xy-5x -1=0 f 2 (x,y)=x +3log10x - y2=0

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

En la figura vemos el punto de interseccin y mediante Tools/Data Cursor sus coordendas aproximadas..
x=linspace(2.5,5.5,50); y1=(2*x.^2-5*x-1)./x; y2=sqrt(x+3*log10(x)); plot(x,y1,'b',x,y2,'r')

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Vamos a utilizar la funcin fsolve de MATLAB para obtener el punto de interseccin. En primer lugar, tenemos que definir la funcin denominada sis_ecuaciones y guardarla en el correspondiente fichero . M. A esta funcin le tenemos que pasar los valores de x e y en el vector xn, y nos devuelve los valores de las funciones f 1 (x,y) y f 2 (x,y) en el vector s.
function s=sis_ecuaciones(xn) x=xn(1); y=xn(2); s=[2*x^2-x*y-5*x-1, x*3*log10(x)-y^2]; end

Creamos el script sis_ecuaciones_script para llamar al procedimiento numrico implementado en la funcin fsolve de MATLAB.
x0 =[3 2]; %valor inicial [x,fval] = fsolve(@sis_ecuaciones,x0); fprintf('La solucin es x=%1.3f, y=%1.3f\n',x(1),x(2)); fprintf('Valores de la funcin = %g\n',fval)

A fsolve tenemos que pasarle la funcin que hemos definido, sis_ecuaciones y la aproximaxin inicial (x 0, y0) que hemos encontrado anteriormente de forma grfica. Esta funcin nos devuelve las coordenadas (x,y) del punto de interseccin buscado y los valores de las funciones f 1 (x,y) y f 2 (x,y) en dicho punto. En la ventana de comandos corremos el script sis_ecuaciones_script
>> sis_ecuaciones_script La solucin es x=3.958, y=2.664 Valores de la funcin = -1.33692e-010 Valores de la funcin = -3.07305e-009

Energas Renovables EUIT I de Eibar

Typesetting math: 100%

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Potrebbero piacerti anche