Solucionario Exercícios de AN: Interpolação e
Mínimos Quadrados
7 de Maio de 2012
Pergunta 0.1 Implemente o algoritmo para obter o polinômio de Newton numa função do scilab. Forneça o resultado como um vetor de coecientes na forma de um polinômio de Newton. Use os seguintes dados: x = [−2 : 3] e y = [1 4 11 16 13 − 4].
Solução:
X = [−2 : 3] e Y = [1 4 11 16 13 − 4] function coef = poli_newton(x,y) //
// calcula coeficientes do polinomio de Newton //
// parametros de entrada:
// x: vetor contendo as abscissas, // y: vetor contendo as ordenadas, //
// parametro de saida:
// coef: coeficientes do polinomio de Newton determinados pelos // operadores de diferenca dividida
// os coeficientes sao retornados na primeira linha da matriz coef //
m = length(x); for i = 1:m
coef(i,1) = y(i); end
for k = 2:m for i = 1:m-k+1 coef(i,k) = (coef(i+1,k-1)-coef(i,k-1))/(x(i+k-1)-x(i)); end end endfunction P (x) = 11 + 7x − x2 − x3
Pergunta 0.2 Escreva uma função em scilab para atualizar o polinômio Newton que é calculado pela função do exercício anterior. A função deve calcular apenas o novo coeciente necessário para escrever o polinômio de Newton. Aplique sua função quando um novo ponto (4;-6) é adicionado à lista do exercício anterior.
Solução: function new_coef = poli_newton_update(x,y,coef) //
// atualiza o polinomio de Newton:
// dados um novo ponto p(m) = (x(m), y(m)) e os coeficientes de diferenca // dividida calculados para os pontos p(1),p(2),...,p(m-1),
// calcula o novo coeficiente do polinomio de Newton //
// parametros de entrada:
// x: vetor contendo as abscissas, // y: vetor contendo as ordenadas,
// coef: matriz com coeficientes (diferencas divididas) //
// parametro de saida:
// new_coef: novo coeficiente do polinomio de Newton, //
m = length(x); coef(m,1) = y(m);
// construcao das diferencas divididas for k = 2:m i = m-k+1; coef(i,k) = (coef(i+1,k-1)-coef(i,k-1))/(x(i+k-1)-x(i)); end new_coef = coef(1,m); endfunction
Pergunta 0.3 Seja x = [−2 : 2] e y = x2. Use a função lagrange do
arquivo lagrange.sci (ver página do curso) para calcular o único polinômio de Lagrange de grau 4 que passa por estes pontos. O que você encontra? Solução: -->X=[-2:2] X = -2. -1. 0. 1. 2. -->Y=X.^2 Y = 4. 1. 0. 1. 4. -->exec('C:\Program Files\scilab-5.3.3\CalcNum\lagrange.sci', -1) -->lagrange(X,Y) ans = 2 x
Pergunta 0.4 Suponha que você mede y com um pequeno erro aleatório. Seja x = [−2 : 2] e y = x2+ rand(5)/10. O que acontece com o polinômio de
Lagrange? Compare com o resultado supondo que não existe erro de medição (isto é, com y = x2). Solução: Y = 4.0932962 1.0214601 0.0312642 1.0361636 4.0292227 -->lagrange(X,Y) ans = 2 3 4 0.0312642 +0.0151418x +0.9942306x -0.0077900x +0.0033171x Pergunta 0.5 A viscosidade da água foi determinada experimentalmente em diferentes temperaturas conforme a tabela 1 mostra. A partir desta tabela, estime o valor da viscosidade à temperatura de 8o e 12o usando a
interpolação linear e ajustando um polinômio de Lagrange. Faça um grá-co com dos polinômios interpolantes. Use a função lagrange do arquivo lagrange.sci (ver página do curso).
Solução: Interpolação linear, P1(x) = y0+
y1− y0
x1− x0
Para 8o, temos i 0 1 xi 5 10 yi 1.519 1.308 P1(8) = 1.519 − 1.308 − 1.519 10 − 5 (8 − 5) = 1.6456 Para 12o, temos i 0 1 xi 10 15 yi 1.308 1.140 P1(12) = 1.308 − 1.140 − 1.308 15 − 10 (12 − 10) = 0.908 Interpolação de lagrange, -->X=[0 5 10 15] X = 0. 5. 10. 15. -->Y=[1.792 1.519 1.308 1.140] Y = 1.792 1.519 1.308 1.14 -->lagrange(X,Y) ans = 2 3 1.792 -0.0620667x +0.00162x -0.0000253x P (8) = 1.386176, P (12) = 1.236704 Gráca: -->xx=linspace(0,15,60); -->yye=horner(P,xx); -->plot2d(xx,yye)
Pergunta 0.6 Sejam (x1; y1) e (x2; y2) dois pontos com x1 6= x2. Mostre
que os coecientes do polinômio P (x) = a0+ a1x que passa pelos dois pontos
é a solução do sistema linear
" 1 x1 1 x2 # " a0 a1 # = " y1 y2 #
Obtenha a fórmula geral para a0 e a1 como solução deste sistema linear.
A seguir, mostre que o polinômio P (x) = a0 + a1x pode também ser escrito
como
P (x) = y1 + y2− y1 x2− x1
(x − x1)
Como seria o polinômio se fosse escrito como P (x) = α + y2− y1 x2− x1 (x − x2)? Solução: P (x1) = y1 P (x2) = y2 → ( a0+ a1x1 = y1 a0+ a1x2 = y2 ⇒ " 1 x1 1 x2 # " a0 a1 # = " y1 y2 # Cuja solução é a1 = y2− y1 x2− x1 , a0 = y1− a1x1 P1(x) = a0+ a1x = y1− y2− y1 x2− x1 (x − x1) Tambem, P1(x) = 1 + y1− y2− y1 x2− x1 (x − x2)
Pergunta 0.7 Escrever função em scilab que recebe dois pontos (x1; y1) e
(x2; y2), testa se x1 6= x2 e, se forem diferentes, retorna os coecientes a0 e
a1.
function [a0,a1]=L3Per07(x1,x2,y1,y2) if x1<>x2 then a1=(y2-y1)/(x2-x1) a0=y1-a1*x1 end endfunction
Pergunta 0.8 Construa outra função que recebe um conjunto de n pontos (x1, y1), · · · , (xn, yn), e outro conjunto de posições u1, · · · , uk. A função deve
testar se as abcissas xi s ao distintas. Se forem, obtenha o subintervalo em que cada ui cai e obtenha o valor da função linear interpolante em cada ponto ui. Com o output da função plote os pontos, as linhas interpolantes P (u) e os pontos (ui; P (ui)). Teste seu programa com os seguintes dados:
x = [0 2 1 5 4]; y = [-5 -6 -1 4 3]; w = [0.3 1.7 2.8 4.9]; v = myinterpln(x, y, u); plot(x, y, "-", w, v, "o"); Solução: Pergunta 0.9 ] Solução: Pergunta 0.10 ] Solução: Pergunta 0.11 ] Solução:
Pergunta 0.12 A interpolação polinomial pode ter resultados com grandes oscilações (overshoots) especialmente nos extremos. Para vericar quão ex-tremas estas oscilações podem ser, vamos olhar a função de Runge f(x) =
1
1+x2. Seja x = [−5 : 5]. Calcule f(x) nestes pontos e calcule o polinômio de
Lagrange. Plote o resultado junto com f(x). Onde o erro é maior? Repita o exercício com x = [−10 : 10]. Solução: --> exec('L3Per12.sci', -1); --> L3Per12(-5,5); --> L3Per12(-10,10); function L3Per12(a,b)
// calcula polinomio interpolador de Lagrange para // a funcao de Runge nos pontos de abscissas [a:b] exec('lagrange.sci', -1); deff("y=runge(x)","y=1 ./(1 + x.^2)") x1 = [a:b]; y1 = runge(x1); f1 = lagrange(x1, y1); h1 = horner(f1,x1); x = linspace(a, b, (b-a+1)*5)';
y1e = horner(f1,x); // valor do polinomio de lagrange y = runge(x); // valor exato da funcao de Runge clf()
plot2d(x,[y y1e],style=[2 5],leg="função exata@polinomio lagrange") endfunction
Pergunta 0.13 ] Solução:
Pergunta 0.14 A tabela 2 fornece a população do Brasil (em milhões de habitantes) desde 1872. Ajuste um polinômio interpolante e obtenha uma estimativa da população no ano de 1885 e de 1005. Ajuste também um spline cúbico natural e compare os resultados. Faça um gráco mostrando os dois ajustes que você fez e os pontos usados.
Solução:
--> exec('L3Per14.sci', -1); -->L3Per14(1,6,1885)
-->L3Per14(7,12,2005)
function est = L3Per14(a,b,z)
// determina polinomio interpolador de Lagrange de grau (b-a), // utilizando os pontos [a:b]. avalia o polinomio em z
// plota grafico do polinomio e do spline cubico natural exec('lagrange.sci',-1);
x = [1872 1890 1900 1920 1940 1950 1960 1970 1980 1990 2000 2010]; y = [9.9 14.3 17.4 30.6 41.2 51.9 70.9 93.1 130 150 170 190.7]; // polinomio de lagrange
ye = lagrange(x(a:b), y(a:b)); // polinomio de grau (b-a) est = horner(ye, z); // avalia polinomio em z
// spline d = splin(x(a:b), y(a:b)); // grafico m = 3*(b-a+1); xx = linspace(x(a), x(b), m)'; yye = horner(ye, xx);
yy = interp(xx, x(a:b), y(a:b), d, "natural"); clf()
plot2d(xx,[yy yye],style=[2 5],leg="spline cubico natural@polinomio lagrange"); plot2d(x(a:b), y(a:b), -9);
endfunction
Pergunta 0.15 Leia a documentação do scilab para aprender sobre os qua-tro principais tipos de splines existentes: not_a_knot, clamped, natural, pe-riodic. Seja x = [−2 : 2] e y = [1, 4, 11, 16, 13]. Ajuste cada um dos quatro tipos de splines a estes dados e compare os resultados gracamente.
Solução: -->exec('L3Per15.sci', -1) -->L3Per15 function L3Per15(void) x = [-2:2]; y = [1 4 11 16 13]; a = -2; b = 2; m = 100; xx = linspace(a, b, m)';
yy0 = interp(xx, x, y, splin(x,y,"not_a_knot"));
yy1 = interp(xx, x, y, splin(x,y,"clamped",[xx(1) xx(m)])); yy2 = interp(xx, x, y, splin(x,y,"natural"));
clf();
plot2d(xx, [yy0 yy1 yy2], style=[5 2 3], strf="121", ... leg="not_a_knot@clamped@natural");
plot2d(x,y,-9, strf="000"); endfunction
Pergunta 0.16 Sem usar a função splin, obtenha o spline cúbico natural que passa pelos pontos (−1; 3), (0; 2) e (1; −2). Monte um sistema de equações lineares e resolva-o usando o scilab.
Solução: Sejam os pontos (x0, y0) = (−1, 3), (x1, y1) = (0, 2) e (x2, y2) =
(1, −2). h0 = x1− x0 = 0 − (−1) = 1, h1 = x2− x1 = 1 − 0 = 1. Dy0 = y1h−y0 0 = 2−3 1 = −1, Dy1 = y2−y1 h1 = −2−2 1 = −4. Logo, h h0 2(h0+ h1) h1 i ∗ S000(x0) S100(x1) S200(x2) = 6 ∗ [Dy1− Dy0]
Usando a condição de Spline natural
S000(x0) = 0, S200(x2) = 0,
e resolvendo o sistema temos que S00
1(x1) = −9/2. Assim, coecientes de S0(x): a0 = S100(x1) − S000(x0) 6h0 = −3/4 b0 = S000(x0) 2 = 0 c0 = Dy0− S100(x1) + 2S000(x0) 6 ∗ h0 = −7/8 d0 = y0 = 3 S0(x) = −3/4(x + 1)3+ 0(x + 1)2− 7/8(x + 1) + 3, x ∈ [−1, 0] Coecientes de S1(x): a1 = S200(x2) − S100(x1) 6h1 = 3/4 b1 = S100(x1) 2 = −9/4 c1 = Dy1− S200(x2) + 2S100(x1) 6 ∗ h1 = −5/2 d1 = y1 = 2 S1(x) = 3/4(x + 1)3− 9/4(x + 1)2− 5/2(x + 1) + 2, x ∈ [0, 1] Pergunta 0.17 Solução: