Www Sc Ehu Es Sbweb Energias Renovables MATLAB Numerico Raic

20
pdfcrowd.com open in browser PRO version Are you a developer? Try out the HTML to PDF API Raíces de ecuaciones Valores y vectores propios Integración numérica Ecuaciones diferenciales Ajuste de datos Análisis de Fourier Estadística Inicio MATLAB Numérico Raíces de una ecuación (II) Método del punto medio El método del punto medio es uno de los métodos más sencillos de comprender y es muy conveniente para dar rápidamente con la raíz de la ecuación dada, sin embargo, el número de cálculos aumenta sustancialmente a medida que se desea mayor exactitud. Este procedimiento se basa en el teorema de Bolzano que dice que si tenemos una función y=f (x ), de variable real y continua en el intervalo [a, b], y el signo de la función en el extremo a es distinto al signo de la función 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 raíz buscada, véase la figura.

Transcript of Www Sc Ehu Es Sbweb Energias Renovables MATLAB Numerico Raic

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

Raíces de ecuaciones

Valores y vectorespropios

Integración numérica

Ecuacionesdiferenciales

Ajuste de datos

Análisis de Fourier

Estadística

Inicio MATLAB Numérico

Raíces de una ecuación (II)Método del punto medio

El método del punto medio es uno de los métodos más sencillos de comprender y es muy conveniente para darrápidamente con la raíz de la ecuación dada, sin embargo, el número de cálculos aumenta sustancialmente a medida quese desea mayor exactitud.

Este procedimiento se basa en el teorema de Bolzano que dice que si tenemos una función y=f(x), de variable real ycontinua en el intervalo [a, b], y el signo de la función en el extremo a es distinto al signo de la función en el extremo b delintervalo, existe al menos un valor c dentro de dicho intervalo tal que f(c)=0, c es por tanto, la raíz buscada, véase lafigura.

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

Ejercicios

Supongamos una ecuación

f(x)=0

Para hallar la raíz de la función 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 raíz buscada

Si f(a) y f(m) tienen signos contrarios, como en la figura, la raíz buscada está en el intervalo (a, m).

Si no se cumple la condición anterior, f(b) y f(m) tendrían signos contrarios y la raíz estaría 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 delproceso tendremos bien la raíz exacta de la función f(x), o una secuencia de intervalos cada vez más reducidos [a1,b1],[a2,b2], .... [ai, bi]... tal que

Como los puntos extremos de la izquierda a1, a2, ... an, ...forman una sucesión creciente y acotada, y los de la derechab1, b2, ... bn, ... una sucesión acotada decreciente, existe un límite común que es la raíz ξ buscada.

f( )f( ) < 0   − = (b− a)an bn bn an12n

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

Si queremos conocer el valor de la raíz con un error menor que ε, tenemos que realizar un número n de iteracciones talque

Las condiciones de terminación del proceso

El ordenador trabaja con números de precisión limitada, por lo que tendremos que poner un criterio que establezcacuando la función f(x) se considera nula. Diremos que f(x) es nula cuando el valor absoluto de f(x) sea menor que unacantidad pequeña pero no nula ε1.

En segundo lugar, no podemos programar un proceso indefinido, es preciso, que la rutina repetitiva acabe en unmomento dado. El criterio empleado es el siguiente

Siendo ε2 cierta cantidad prefijada. La raíz se encuentra en el intervalo (an, bn) y m es el punto medio de dicho intervalo.

El tercer criterio de terminación establece, que el proceso de búsqueda de la raíz se interrumpirá después de un númeroprefijado de iteraciones, notificándose al usuario que no se ha encontrado la raíz de la función con las condiciones fijadasanteriormente.

Para poder codificar este procedimiento hemos de seguir los pasos siguientes

1. Partimos de un intervalo (a, b) en el que la función f(x) cambia de signo

2. Se calcula m, abscisa mitad del intervalo mediante m=(a+b)/2

3. Se verifican las condiciones de terminación

4. Si f(a) y f(m) tienen signos contrarios, como se ve en la figura, la raíz está en el intervalo (a, m), entonces b toma el

ξ = =limn→∞

an limn→∞

bn

n > ln( )1ln2

b− a

ε

|f(x)| < ε1

<∣∣∣

−an bn

m

∣∣∣ ε2

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

valor de m.

5. Si la condición anterior no es cierta, la raíz 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 condición de terminación

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') endend

Resolver la ecuación trascendente f(x)=cos(x)-x=0, aplicando el procedimiento del punto medio.

En la gráfica, se representa y=cos(x)-x, tiene un cero y=0, para x comprendido entre 0.7 y 0.8

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

Definimos la función f para calcular la raíz de la ecuación trascendente y buscamos la raíz en el intervalo (0.5,1) haciendo10 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 acotamossuficientemente el intervalo (a,b).

>> punto_medio(func,0.7,0.8,10)ans = 0.7393

Método de la secante

Este método comienza con dos puntos (x0, f(x0)) y (x1, f(x1)), tales que los signos de f(x0) y f(x1) son opuestos, es

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

decir, f(x0)·f(x1)<0

Se dibuja una línea recta entre los dos puntos cuya ecuación es

El valor de x=x2 para el cual y se aproxima a la raíz buscada es

En la siguiente iteracción, tomamos un intervalo más pequeño comprendido entre x2 y x1 que es donde se encuentra laraíz. Por lo que hacemos x0=x2 y volvemos a calcular un nuevo valor x2 cada vez más próximo a la raíz buscada.

Definimos un nuevo procedimiento denominado secante, similar al del punto_medio, se pasa la función f, el intervalo enel que se encuentra la raíz (x0, x1) y el número de iteracciones MAXITER. El procedimiento termina, cuando seencuentra la raíz dentro de una determinada tolerancia

donde m=(an+bn)/2 es el punto medio del intervalo (an, bn) cada vez más pequeño.

=y− f( )x0

f( )− f( )x1 x0

x−x0

−x1 x0

= − f( )x2 x0 x0−x1 x0

f( )− f( )x1 x0

<∣∣∣

−an bn

m

∣∣∣ ε2

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

donde =(an+bn)/2 es el punto medio del intervalo (an, bn) cada vez más pequeño.

O bien, cuando se han completado el bucle, sin que se haya encontrado la raíz 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 función secante, le pasamos la función f, el intervalo en el que se encuentra la raíz (x0, x1) y el número deiteracciones MAXITER

Consideremos la función 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

Raíces múltiples

La representación gráfica de la función en una pantalla de alta resolución nos permitirá estimar los intervalos en los que lafunción cambia de signo y aplicar en consecuencia, el procedimiento mitad a cada intervalo. Si no es posible unarepresentación gráfica o esta no es de la suficiente resolución, será preciso explorar el eje X en busca de intervalos en losque la función cambia de signo. Cuando los encontremos aplicaremos a cada uno de ellos el procedimiento del punto

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

medio.

Esta exploración no es sencilla, ya que podemos encontrarnos con intervalos en que la función no cambia de signo ya seapor que no tiene raíces, o por que tiene un número par, tal como se ve en las figuras. La solución a este problema eshacer más pequeño el intervalo de exploración, esto implica más tiempo de cálculo y no garantiza que las raíces puedanser encontradas si algunas de ellas están muy juntas, o la curva es tangente al eje X.

Las situaciones en las que nos podemos encontrar cuando buscamos las raíces de una función y=f(x) en un intervalo(a,b) se muestran en la figura

f(a) y f(b) tienen el mismo signo, no hay raíz de la función en dicho intervalo, pero también puede ocurrir que haya unnúmero par de raíces en dicho intervalo.

f(a) y f(b) tienen distinto signo, hay una raíz de la función en dicho intervalo, pero también puede ocurrir que haya unnúmero impar de raíces en dicho intervalo.

Vamos a crear un procedimiento que nos permita buscar los intervalos en los que la función cambia de signo y calcular laraíz en cada uno de ellos, definiendo una función denominada buscar_intervalos.

Se divide el intervalo (a,b) en n-1 intervalos igualmente espaciados (n divisiones incluidos los extremos) se calcula si enlos extremos de los cada uno de los pequeños intervalos la función cambia de signo, en caso afirmativo se guardan losextremos (xj, yj) de dicho intervalo en una matriz xb. Si la matriz está vacía (no tiene ningún elemento) isempty, unmensaje nos lo indica. La función devuelve los intervalos (xj, 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)))

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

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(['número de intervalos:' int2str(j)]) endend

Este código es correcto, pero se puede hacer más eficiente, un asunto de vital importancia en el cálculo intensivo. Nosdaremos cuenta, que se calcula dos veces la función f para el mismo valor de x, en el final de un intervalo y en elcomienzo del siguiente, ahorraremos el tiempo que tarda al procesador en realizar estas operaciones si guardamos elvalor de f(x) calculado al final del intervalo previo en la variable local y2 y lo asignamos a la variable y1, que guarda elvalor de la función 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(['número de intervalos:' int2str(j)]) endend

Difracción Fraunhofer producida por una abertura circular

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

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

En la figura vemos el máximo principal de difracción en el origen, los máximos secundarios y los mínimos o ceros deintensidad debida a la difracción por una abertura circular. La intensidad en una dirección θ producida por una aberturacircular de raio a es

Los mínimos de intensidad son los ceros de la función de Bessel J1(x) cuya representación gráfica vemos en la figura

I =  x = sinθI0( )2 (x)J1

x

22πaλ

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

Si exploramos el intervalo comprendido entre a=0 y b=30, tomando 6 intervalos, de anchura Δx=5 tal como vemos en lafigura, la función 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 número par de raíces. Luego, si exploramos la función J1(x) en el intervalo(0,30) tomando 6 intervalos de anchura Δx=5 encontraremos solamente tres raíces de las nueve existentes.

Nota: omitimos el origen x=0, por que se produce un máximo (no un mínimo de intensidad)

( )

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

Escribimos el script denominado circular_difraccion para calcular las raíces de la ecuación trascendente J1(x)=0

La función buscar_intervalos, busca los intervalos en los que la función J1(x) cambia de signo, el intervalo en el que seexplora la función es (0.1, 30), omitimos el origen, y el número de divisiones del intervalo es 50, incluyendo los extremos.La función devuelve la matriz xb, que guarda los extremos (xj, yj) de cada intervalo en los que la función cambia de signo.La dimensión de la martriz xb nos la proporciona la función size y se guarda en el vector nb de dos elementos [filascolumnas]. El número de columnas nb(2) de la matriz es dos y el número de filas nb(1) es el número de intervalos.

Para cada intervalo en el que la función cambia de signo, se aplica el procedimiento del punto medio, llamando a lafunción punto_medio, para buscar la raíz en dicho intervalo.

Escribimos un script que realiza las siguientes tareas:

1. Define una función anónima besselj(1,x)

2. Utiliza la función buscar_intervalos para encontrar los intervalos en los que la función cambia de signo. Explorando elintervalo que va de a=0.1 y b=30. Se omite la primera raíz x=0 por que corresponde al máximo principal

3. Calcula e imprime las raíces empleando el procedimiento del punto medio, llamando a la función punto_medio.

J1=@(x) besselj(1,x);xb=buscar_intervalos(J1,0.1,30,50);nb=size(xb);disp('mínimos: difracción 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 ecuación trascendente J1(x)=0 en elintervalo (0.1,30)

>> circular_difraccionmínimos: difracción por abertura circular

( ) = 1limx→0

(x)J1

x

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

3.8315 7.0149 10.1731 13.3195 16.4659 19.6170 22.7634 25.9097 29.0561

Difracción Fraunhofer producida por una rendija

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

El máximo principal ocurre en el origen x=0, y los máximos secundarios son las raíces de la ecuación trascendente

tan(x)-x=0

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

En la figura se representan la recta y=x (color azul) y la función y=tan(x) (color rojo). Se ha hecho más pequeña la escalavertical que la horizontal.

Como observamos en la gráfica los máximos secundarios ocurren aproximadamente para xn≈(2n+1)π/2 donde n=±1,±2, ±3...

Escribimos el script rendija_difraccion que realiza las siguientes tareas:

1. Define una función anónima tan(x)-x

2. Utiliza la función buscar_intervalos para encontrar los intervalos en los que la función cambia de signo. Explorando elintervalo que va de a=0.1 y b=7π/2. Se omite la primera raíz x=0 por que corresponde al máximo principal

3. Calcula e imprime las raíces empleando el procedimiento del punto medio, llamando a la función punto_medio.

f=@(x) tan(x)-x;xb=buscar_intervalos(f,0.1,7*pi/2,10);

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

nb=size(xb);disp('máximos secundarios: difracción 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_difraccionmáximos secundarios: difracción por una rendija 1.5710 4.4933 4.7122 10.9018

Como hemos visto en la figura (más arriba), la primera raíz es próxima a 3π/2=4.7124, la segunda, es próxima5π/2=7.8540 y la tercera es próxima a 7π/2=10.9956. El resultado que hemos obtenido difiere notablemente. No pareceadecuado el procedimiento del punto medio para calcular las raíces de la ecuación tan(x)-x=0. El problema radica, comose vé en la figura, en que la tangente se hace muy grande en valores próximos a xn≈(2n+1)π/2.

Cambiamos la ecuación tan(x)-x=0 por su equivalente x·cos(x)-sin(x)=0. Representamos la función

y=x·cos(x)-sin(x)

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

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('máximos: difracción 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_difraccionmáximos: difracción por una rendija

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

4.4933 7.7262 10.9018

Comparamos las raíces obtenidas con la representación gráfica y vemos que hemos obtenido un resultado mejor. Unprocedimiento numérico no siempre es adecuado para resolver un problema particular.

Funciones MATLAB para calcular las raíces de una ecuación

El procedimiento del punto medio, aproximaciones sucesivas, secante, etc., pueden ser útiles para obtener raíces reales,pero no son válidas para obtener las raíces complejas de un polinomio. MATLAB dispone del la función roots para estepropósito, tal como ya hemos visto al principio de este capítulo

La función fzero puede encontrar la raíz de una ecuación trascendente f(x)=0. Su sintaxis es

fzero(funcion,x0)

Donde funcion es el nombre de la función cuyas raíces queremos determinar y x0 es el intervalo [a b] donde la funcióncambia de signo, es decir, el signo de f(a) es distinto al signo de f(b). x0 puede ser también un valor cercano a la raíz esdecir, una primera aproximación. Podemos definir una función anónima y guardarla en el manejador func.Le pasamos lafunción anónima func a fzero.

En la ventana de comandos, definimos la función y buscamos un intervalo [0.4 1] donde la función cambia de signo.Alternativamente, probamos una primara aproximación a la raíz buscada x0=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 raíz r= 0.7391 >> fzero(func,0.6) %aproximación inicial a la raízans = 0.7391

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

Podemos definir explícitamente la función 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 función el símbolo @ (véase al final de la página Funciones)

>> fzero(@func,0.6)ans= 0.7391

A veces la función func definida y guardada en un fichero .M precisa de los valores de ciertos parámetros a, b

function y=func(x,a,b)%código de la funciónend

A fzero solamente le podemos pasar el manejador (handle) de la función de variable x. La forma en que la función funcconoce el valor de sus parámetros a y b es crear una función anónima f1 en términos de func y se le pasamos sumanejador a la función fzero

f1=@(x)func(x,a,b);p=fzero(f1,x0);

En el ejercicio "La ecuación de van der Waals" utilizaremos esta opción.

Sistemas de ecuaciones no lineales

Calcular las raíces del sistema de dos ecuaciones:

f1(x,y)=2x2-xy-5x-1=0f2(x,y)=x+3log10x-y2=0

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

En la figura vemos el punto de intersección 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')

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

Vamos a utilizar la función fsolve de MATLAB para obtener el punto de intersección.

En primer lugar, tenemos que definir la función denominada sis_ecuaciones y guardarla en el correspondiente fichero .M. A esta función le tenemos que pasar los valores de x e y en el vector xn, y nos devuelve los valores de las funcionesf1(x,y) y f2(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 numérico implementado en la función fsolve deMATLAB.

x0 =[3 2]; %valor inicial[x,fval] = fsolve(@sis_ecuaciones,x0); fprintf('La solución es x=%1.3f, y=%1.3f\n',x(1),x(2));fprintf('Valores de la función = %g\n',fval)

A fsolve tenemos que pasarle la función que hemos definido, sis_ecuaciones y la aproximaxión inicial (x0, y0) que hemosencontrado anteriormente de forma gráfica. Esta función nos devuelve las coordenadas (x,y) del punto de intersecciónbuscado y los valores de las funciones f1(x,y) y f2(x,y) en dicho punto.

En la ventana de comandos corremos el script sis_ecuaciones_script

>> sis_ecuaciones_scriptLa solución es x=3.958, y=2.664Valores de la función = -1.33692e-010Valores de la función = -3.07305e-009

Energías Renovables ©EUITI de EibarTypesetting math: 100%