4
METODOS NUMERICOS 3006907 TALLER 10, SEMESTRE 02–2014 Tema: Programaci´ on en Matlab 1. Considere la siguiente funci ´ on para aproximar la funci ´ on seno usando la serie de potencias: function [sen, n] = senPot(x, tol) % Calcula sen(x) usando la serie % de potencias sen = 0; t = x; k = 1; n = 0; while abs(t) > tol sen = sen + t; t = - x^2/((k+1)*(k+2))*t; k = k+2; n = n+1; end end (a) Modifique esta funci ´ on para incluir nmax, un n ´ umero m´ aximo de iteraciones, como par´ ametro de entrada. (b) Modifique esta funci ´ on para obtener una funci ´ on cosPot que eval´ ue el coseno. (c) Eval´ ue senPot para x =(4k + 1)π /2 con k = 1, 2, 3, 4, 5, 6, 7, 8 y observe los resultados. (d) Modifique senPot para que desplace la entrada de tal manera que la serie se eval´ ue siempre para un argumento entre 0 y π /2. 2. La siguiente funci´ on eval´ ua un polinomio p(x)= a 0 + a 1 x + a 2 x 2 + ··· + a n x n para un argumento x empleando el m´ etodo de Horner para evaluar un polinomio: p(x)= a 0 + x · (a 1 + x · (a 2 + x · (a 3 + ··· +(a n-1 + x · a n ) ··· ))) function r = PoliEval (a,x) % Entrada: a ... vector de coeficientes del polinomio p % x ... argumento % Salida: r ... p(x) m = length(a); r = a(1); for j = 2:m r = r * x + a(j); end end Modifique esta funci´ on para evaluar un polinomio en la forma que resulta directamente del m´ etodo de interpolaci´ on de Newton, para nodos x 0 , x 1 ,..., x n p(x)= c 0 + c 1 (x - x 0 )+ c 2 (x - x 0 )(x - x 1 )+ ··· + c n (x - x 0 )(x - x 1 ) ··· (x - x n-1 ) extendiendo el m´ etodo de Horner apropiadamente: p(x)= c 0 +(x - x 0 ) · (c 1 +(x - x 1 ) · (c 2 +(x - x 2 ) · (c 3 + ··· + c n (x - x n-1 ) ··· ))). La funci ´ on tiene como par´ ametros el vector c de coeficientes en orden c n , c n-1 ,..., c 1 , c 0 , el vector x de nodos, y el argumento x: y = PoliNewtonEval(c, xx, x) 3. Escriba una funci´ on DivSintetica (p, c) que implemente la divisi´ on del polinomio con vector de coeficientes p por x - c. La funci´ on retorna el vector q de coeficientes del polinomio cociente, y el residuo: function [q, r] = DivSintetica(p, c) Ayuda: Es similar a la regla de Horner.

Taller 10-14-ii

Embed Size (px)

Citation preview

Page 1: Taller 10-14-ii

METODOS NUMERICOS 3006907TALLER 10, SEMESTRE 02–2014

Tema: Programacion en Matlab

1. Considere la siguiente funcion para aproximar la funcion seno usando la serie de potencias:function [sen, n] = senPot(x, tol)

% Calcula sen(x) usando la serie

% de potencias

sen = 0; t = x;

k = 1; n = 0;

while abs(t) > tol

sen = sen + t;

t = - x^2/((k+1)*(k+2))*t;

k = k+2; n = n+1;

end

end

(a) Modifique esta funcion para incluir nmax, un numero maximo de iteraciones, como parametro de entrada.

(b) Modifique esta funcion para obtener una funcion cosPot que evalue el coseno.

(c) Evalue senPot para x = (4k +1)π/2 con k = 1,2,3,4,5,6,7,8 y observe los resultados.

(d) Modifique senPot para que desplace la entrada de tal manera que la serie se evalue siempre para un argumento entre 0y π/2.

2. La siguiente funcion evalua un polinomio p(x) = a0 +a1x+a2x2 + · · ·+anxn para un argumento x empleando el metodo deHorner para evaluar un polinomio:

p(x) = a0 + x · (a1 + x · (a2 + x · (a3 + · · ·+(an−1 + x ·an) · · ·)))

function r = PoliEval (a,x)

% Entrada: a ... vector de coeficientes del polinomio p

% x ... argumento

% Salida: r ... p(x)

m = length(a);

r = a(1);

for j = 2:m

r = r * x + a(j);

end

end

Modifique esta funcion para evaluar un polinomio en la forma que resulta directamente del metodo de interpolacion deNewton, para nodos x0,x1, . . . ,xn

p(x) = c0 + c1(x− x0)+ c2(x− x0)(x− x1)+ · · ·+ cn(x− x0)(x− x1) · · ·(x− xn−1)

extendiendo el metodo de Horner apropiadamente:

p(x) = c0 +(x− x0) · (c1 +(x− x1) · (c2 +(x− x2) · (c3 + · · ·+ cn(x− xn−1) · · ·))).

La funcion tiene como parametros el vector c de coeficientes en orden cn,cn−1, . . . ,c1,c0, el vector x de nodos, y el argumentox:

y = PoliNewtonEval(c, xx, x)

3. Escriba una funcion DivSintetica (p, c) que implemente la division del polinomio con vector de coeficientes p porx− c. La funcion retorna el vector q de coeficientes del polinomio cociente, y el residuo:

function [q, r] = DivSintetica(p, c)

Ayuda: Es similar a la regla de Horner.

Page 2: Taller 10-14-ii

4. (a) Escriba una funciondp = DPoli(p)

la cual dado el vector de coeficientes p de un polinomio, retorna el vector de coeficientes de su derivada.

(b) Generalice lo anterior a una funciondnp = DnPoli(p,n)

que retorna la n-esima derivada del polinomio.

5. Programe el metodo de Halley para estimar la solucion de una ecuacion f (x) = 0, cuya formula de iteracion es

g(x) = x− f (x)f ′(x)

(1− f (x) f ′′(x)

2( f ′(x))2

)−1

.

Para este proposito, se recomienda modificar la rutina newton.m. La funcion debe tener los argumentos de entrada y salidaque se especifican a continuacion:

[p,err,k,yp] = halley(f,df,df2,p0,delta,epsilon,max)

donde:

• f, df, df2 son la funcion objetivo, su primera y segunda derivada respectivamente.

• p, err, k, yp, p0, delta, epsilon, max son como en la rutina newton.m

6. Programe el metodo de la secante para estimar la solucion de una ecuacion f (x) = 0, cuya formula de iteracion es:

pn+1 = pn−f (pn)(pn− pn−1)f (pn)− f (pn−1)

Para este proposito, se recomienda modificar la rutina newton.m. La funcion debe tener los argumentos de entrada y salidaque se especifican a continuacion:

[p,err,k,yp] = secante(f,p0,p1,delta,epsilon,max)

donde:

• p0, p1 son dos aproximaciones iniciales.

• p, err, k, yp, f, delta, epsilon, max son como en la rutina newton.m

7. El siguiente segmento en Matlab encuentra la solucion de un sistema de ecuaciones lineales triangular inferior Ax=b dondeL es la matriz triangular inferior de coeficientes y b es un vector columna. Haga las modificaciones necesarias para resolverun sistema triangular superior con el mismo metodo.

n = length(b);

x = zeros(n,1);

for i = 1:n

x(i) = b(i)/L(i,i);

for j = i+1:n

b(j) = b(j) - L(j,i)*x(i);

end

end

8. Sustituya ??1?? y ??2?? apropiadamente para que la siguiente funcion normaInf sea correcta:

function ninf = normaInf(v)

% Calcula la norma infinito del vector v .

% Entrada: - v:= vector.

% Salida: - ninf:= norma inf de v.

n = length(v);

ninf = 0;

for i=1:n

if ??1??

ninf = ??2??;

end

end

Modifıque esta funcion para calcular la norma ‖ · ‖1.

2

Page 3: Taller 10-14-ii

9. (a) Escriba una funcion Matlabb = esEDD(A)

la cual determina si la matriz cuadrada A dada es estrictamente diagonal dominante. De una primera solucion que soloaccese la matriz elemento por elemento, usando solo funciones basicas y necesariamente for o while.

(b) De una segunda solucion que no use lazos de ningun tipo. Ayuda: Use la funcion sum y all.

10. Escriba una funcion MatlabTJ = MatJacobi(A)

la cual dada para la matriz A regresa la matriz de iteracion del metodo de Jacobi.

11. El siguiente segmento de Matlab calcula los primeros k polinomios de Chebyshev usando la relacion de recurrencia: T0(x) =1, T1(x) = x y para k = 2,3,4, . . . , se satisface la recurrencia

Tk(x) = 2xTk−1(x)−Tk−2(x).

T=zeros(k+1,k+1);

T(1,:) = [zeros(1,k) 1];

T(2,:) = [zeros(1,k-1) 1 0];

for i = 3:k+1

T(i,:)= conv([2 0], T(i-1,2:k+1)) - T(i-2,:);

end;

Escriba un segmento similar para calcular los primeros k polinomios de Legendre haciendo uso de la recurrencia correspon-diente: P0(x) = 1, P1(x) = x,

Pn+1(x) = xPn(x)−n2

4n2−1Pn−1(x).

12. Considere la funcion:

function v = polyinterp (x, y, u)

% interpola el valor de la funcion en u a partir

% de los datos (xi,yi) en los vectores x, y,

% usando el metodo de Lagrange

n = length(x);

v = 0;

for k = 1:n

w = 1;

for j = [1:k-1 k+1:n]

w = (u-x(j))/(x(k)-x(j))*w;

end

v = v + w*y(k);

end

end

−0.5 0 0.5 1 1.5 2 2.5 3 3.5−10

−5

0

5

10

15

20

25

(a) Modifıquela para que funcione vectorialmente, es decir, para un vector u retorna un vector v de valores interpoladoscorrespondientemente.

(b) Use la version vectorial obtenida con un vector u suficientemente denso de nodos, y uselo para producir una grafica dela interpolacion, con los datos iniciales resaltados (similar a la grafica mostrada).

13. (a) Escriba una funciony = SplineEval (XX, S, x)

la cual evalua para el argumento x la spline cubica dada por la matriz S y con vector de nodos XX (S es la matriz queregresan las funciones spline con argumentos XX y YY correspondiente). Para argumentos menores que el primer nodouse la cubica del primer intervalo, y para argumentos mayores que el ultimo nodo use la cubica del ultimo intervalo.

3

Page 4: Taller 10-14-ii

(b) Haga las modificaciones necesaria para que evalue tambien la primera, segunda y tercera derivadas y devuela los cuatrovalores.

(c) Haga las modificaciones necesarias para que SplineEval funcione para un argumento x vectorial (componente acomponente).

14. Escriba una funcionfunction [a, b] = lsexp (X, Y)

que implemente el ajuste del modeloy = beax

a los datos xi,yi en los vectores x,y de entrada, usando una transformacion (linealizacion) y la funcion lsline (del curso) opolyfit de Matlab para ajuste lineal de mınimos cuadrados.

15. La siguiente funciones Matlab implementan la regla de Simpson compuesta evitando el uso de lazos mediante el uso deoperaciones vectoriales (se asume que M es par):

function s = simprl2 (f, a, b, M)

% Entrada - f ... integrando

% - a y b ... limites de integracion

% - M ... numero de subintervalos

% Salida - s ... cuadratura

h = (b-a)/M;

x = a+h*(0:M);

y = f(x);

s = (h/3)*(y(1)+ 2*sum(y(2:M)) ...

+ 2*sum(y(2:2:M)) + y(M+1));

end

function s = simprl3 (f, a, b, M)

% Entrada - f ... integrando

% - a y b ... limites de integracion

% - M ... numero de subintervalos

% Salida - s ... suma de la regla de simpson

h = (b-a)/M;

x = a+h*(0:M); y = f(x);

fa = y(1:2:M-1);

fb = y(3:2:M+1);

fm = y(2:2:M);

ss = (h/3)*(fa+4*fm+fb);

s = sum (ss);

end

Escriba una funcion Matlab que implemente la regla de Boole que funcione de manera similar a alguna de estas (evitandolazos). Como comparacion, la regla de Simpson compuesta es

S( f ,h) =h3( f0 +4 f1 +2 f2 +4 f3 +2 f4 + · · ·+2 fM−2 +4 fM−1 + fM)

con M par, mientras en la regla de Boole M es multiplo de 4, y

B( f ,h) =2h45

(7 f0 +32 f1 +12 f2 +32 f3 +14 f4 +32 f5 +12 f6 +32 f7

+14 f8 + · · ·+14 fM−4 +32 fM−3 +12 fM−2 +32 fM−1 +7 fM) .

16. ? Sistema de ecuaciones lineales tridiagonal. Escriba una funcion Matlab

function x = SolnTridiag (a, b, c)

para resolver un sistema tridiagonal:

b1 c1 0 · · · 0 0 0a2 b2 c2 · · · 0 0 00 a3 b3 · · · 0 0 0...

......

. . ....

......

0 0 0 · · · bn−2 cn−2 00 0 0 · · · an−1 bn−1 cn−10 0 0 · · · 0 an bn

·

x1x2x3...

xn−2xn−1xn

=

d1d2d3...

dn−2dn−1dn

Siguiendo la notacion en la ecuacion, puede asunmir que los vectores a, b, c tienen la misma longitud, pero que el primerelemento de a y el ultimo de c se ignoran. Use eliminacion gaussiana adaptada para este caso particular: un primer “barrido”elimina los ai hacia abajo, y luego un barrido hacia arriba los ci.

4