Anda di halaman 1dari 9

6.4 Practicando con programas (VI).

Ejercicios de autoevaluacin del


mdulo.
Ejercicio 6.4.1 Otra frmula de cuadratura para aproximar la integral de una funcin es la
frmula de Simpson que aproxima la funcin en cada intervalo Ik por un polinomio de grado 2
que pase por los extremos y el centro del intervalo. Como en casos anteriores tendremos m
subintervalos de tamao h y m+1 puntos que son los extremos de los subintervalos. Se
utilizar adems el punto central de cada subintervalo.

ba
Suponemos que xk x0 hk son nodos equiespaciados con paso h y el punto medio
m
xk 1 xk
del subintervalo [xk-1,xk] es xk y f k f ( xk ) , la expresin matemtica de la integral
2
queda:
b
h m
I f ( x)dx ( f ( xk 1 ) 4 f ( xk ) f ( xk ))
6 k 1
a

Escribir una funcin llamada simpson que implemente el mtodo de Simpson teniendo
como argumentos de entrada la funcin a integrar, los extremos del intervalo de integracin y
el nmero de subintervalos en los que se divide ste. La funcin retornar la integral
aproximada.

Probar la funcin calculando la siguiente integral con 5 subintervalos:


1

sin(ln( x))dx
0

Sabiendo que tiene como resultado exacto

1
x(sin(ln( x)) cos(ln( x)))]12
2
Calcular el error obtenido.
Ejercicio 6.4.2

Se considera el sistema lineal Ax b donde:

4 1 1 7

A 4 8 1 , b 21
2 1 5 15

Se trata de calcular usando un programa M las soluciones sucesivas que se obtienen utilizando
el mtodo de Jacobi explicado en este mdulo. Cul es la solucin del sistema utilizando
tolerancia 10-6?
Ejercicio 6.4.3 Sea el sistema de ecuaciones lineales Ax b . El mtodo de Gauss-Seidel es un
mtodo iterativo en el que la matriz de coeficientes A se descompone de la misma manera que
en el mtodo de Jacobi:

A D L U

En estos mtodos iterativos se cumple que la matriz A P Q , en el mtodo de Gauss-Seidel


se toma P D L y Q U , es decir el esquema iterativo queda

( D L) x ( n 1) Ux ( n ) b, n 0,1,...

Si la matriz A es de tamao N N , las sucesivas soluciones x ( n 1) son vectores de tamao


N 1 . En cada iteracin, por tanto, se debe calcular las N componentes del vector x ( n 1) .
Observemos que dadas las caractersticas de las matrices, las operaciones a realizar en cada
iteracin son las siguientes,

a11 x1( n 1) fila1U .x ( n ) b1 ,


a21 x1( n 1) a22 x2( n 1) fila 2U .x ( n ) b2 ,
a31 x1( n 1) a32 x2( n 1) a33 x3( n 1) fila3U .x ( n ) b3 ,
...
( n 1)
donde la notacin x j indica componente j-sima del vector solucin de la iteracin (n+1).
Observemos que las nicas operaciones a realizar son productos escalares entre vectores
adems de operaciones escalares y que no se necesita almacenar ninguna matriz adems de A.

Si lo escribimos en componentes, y a j j 0, j 1,..., N resultara:

i 1 N
1
xi( n 1) (bi aij x (jn 1) aij x (jn ) ) i 1,, N
aii j 1 j i 1

SE PIDE Escribir una funcin M que implemente el mtodo iterativo de Gauss-Seidel. Los datos
de entrada sern la matriz de coeficientes del sistema, el vector columna de trminos
independientes, el nmero mximo de iteraciones permitido y la tolerancia del mtodo. Los
datos de retorno sern la solucin del sistema y el nmero de iteraciones en las que se ha
llegado a sta. Aplicarla a resolver el sistema lineal planteado en el ejercicio anterior con la
misma tolerancia.
Ejercicio 6.4.4 El mtodo de Newton hace uso de la funcin f y de su primera derivada f' lo
cual lleva a tener que calcular la derivada de la funcin. Esto puede evitarse usando frmulas
de derivacin numrica para aproximar la derivada. Existen varias posibilidades, una de las
frmulas es conocida como diferencia finita regresiva y viene dada con la expresin

f ( xn ) f ( xn h)
f '( xn )
h

que aproxima la derivada usando la pendiente de una recta que pasa por (xn f(xn)) y un punto
de la funcin situado a su izquierda h unidades.

Empleando otra notacin tendramos

f '( xk ) ( f ( xk ) f ( xk 1 ) / ( xk xk 1 )

que sustituyendo en la frmula iterativa del mtodo de Newton resulta el siguiente mtodo
iterativo:

( xk xk 1 )
xk 1 xk f ( xk ) , k 1, 2,...
f ( xk ) f ( xk 1 )

Este mtodo se conoce como Mtodo de la Secante. Observemos que para el clculo de la
aproximacin xk+1 se utilizan las dos aproximaciones anteriores xk y xk-1 y por tanto para
comenzar el proceso iterativo son necesarios los dos primeros puntos iniciales x0 , x1 . Se
supone que f ( xk ) f ( xk 1 ) 0 para k 1 . El mtodo de la secante es un ejemplo de
mtodo iterativo multietapa.

SE PIDE escribir una funcin M de nombre secante que implemente el mtodo de la


Secante. Utilizar la distancia entre dos iteraciones sucesivas como mtodo de finalizacin del
proceso. Aplicarla a solucionar las ecuaciones

a) ( x 2) 0 con x0 2.3, x1 2.1 .


2

b) ( x 2) 0 con x0 2.3, x1 2.1 .


5

c) cos ( x ) 0 con x0 2.9, x1 3 , x0 3.9, x1 4 y x0 1.2, x1 1.3 .


Solucin Ejercicio 6.4.1

La funcin simpson es la siguiente:

function [int]=simpson(fun,a,b,m)

f=inline(fun);

h=(b-a)/m;

x=a:h:b; %m+1 puntos, m intervalos

int=0;

for i=1:m %para cada intervalo

%extremos x(i), x(i+1)

xm=(x(i)+x(i+1))/2;

int=int+f(x(i))+4*f(xm)+f(x(i+1));

end

int=h/6*int;

La llamada a la funcin y el resultado obtenido se escribe a continuacin:

x2=2;x1=1;

exacta=1/2*x2*(sin(log(x2))-cos(log(x2)))-(1/2*x1*(sin(log(x1))-...
cos(log(x1))));

I1=simpson('sin(log(x))',1,2,5);

fprintf('Aproximacin con Simpson: %f.\nError: %e\n',I1,...

abs(exacta-I1));

Aproximacin con Simpson: 0.369722.

Error: 3.755307e-007
Solucin Ejercicio 6.4.2

Un programa vlido es el siguiente:

A=input('Introduce matriz de coeficientes');

b=input('Introduce vector columna de trminos independientes');

niter=input('Introduce nmero mximo de iteraciones');

tol=input('Introduce la tolerancia del mtodo');

N=length(b);

xx=zeros(N,1); %primera aproximacin

x=zeros(N,1); % almacena las aproximaciones sucesivas

for j=1:niter

for i=1:N

x(i)=(-A(i,1:i-1)*xx(1:i-1)-A(i,i+1:N)*xx(i+1:N)+b(i))/A(i,i);

end

if norm(x-xx)<1.e-6

fprintf('Nmero de iteraciones: %d\n',j);

disp('Solucin');

disp(x);

return;

end

xx=x;

end

disp('Solucin no encontrada');

Las soluciones obtenidas son las siguientes:

1.5286
a)
2.2500

x
1.2000

0.6000

3.6417
b)
6.5833
x 3.8000

0.6000
1.6667

Solucin Ejercicio 6.4.3

La funcin Gauss-Seidel en MATLAB / Octave es:

function [x,niter]=gauss_seidel(A,b,maxiter,tol)

N=length(b);

xx=zeros(N,1);

x=zeros(N,1);

for j=1:maxiter

for i=1:N

x(i)=(-A(i,i+1:N)*xx(i+1:N)+b(i)-...

A(i,1:i-1)*x(1:i-1))/A(i,i);

end

if norm(x-xx)<tol

niter=j;

return;

end

xx=x;

end

disp('Solucin no encontrada');

Aplicndola al problema concreto resulta:

>> [sol,iteraciones]=gauss_seidel(A,b,100,1.e-6)

sol =

2.0000

4.0000

3.0000

iteraciones =

9
Solucin Ejercicio 6.4.4

Indicamos a continuacin el cdigo de la funcin secante:

function [x1,k]=secante(fun,x0,x1,epsilon,maxit)

% Entrada:

% fun- es la funcin objetivo .

% x0 y x1- son las aproximaciones iniciales al cero de f

% epsilon- es la tolerancia para el valor de la funcin

% maxit- es el numero mximo de iteraciones

% Salida:

% x1- es la aproximacin por el mtodo de la Secante a la solucion.

% k- es el numero de iteraciones

f=inline(fun);

for k=1:maxit

x2=x1-f(x1)*(x1-x0)/(f(x1)-f(x0));

err=abs(x2-x1);

x0=x1;

x1=x2;

if(err<epsilon), return, end

end

x1='No converge';

k=maxit;

Apartado a) Llamada a la funcin:

>> [sol,iteraciones]=secante('(x-2)^2',2.3,2.1,1e-7,100)

sol =

2.0002

iteraciones =

13
Apartado b) Llamada a la funcin:

>> [sol,iteraciones]=secante('(x-2)^5',2.3,2.1,1e-7,100)

sol =

2.0374

iteraciones =

Apartado c) Llamadas a la funcin:


>> [sol,iteraciones]=secante('cos(x)',2.9,3,1e-7,100)

sol =

4.7124

iteraciones =

>> [sol,iteraciones]=secante('cos(x)',3.9,4,1e-7,100)

sol =

4.7124

iteraciones =

>> [sol,iteraciones]=secante('cos(x)',1.2,1.3,1e-7,100)

sol =

1.5708

iteraciones =