Exercícios Zeros de Funções Cálculo Numérico, Turma A Profª. Dra. Tina Andreolla Data: 22/04/2008. Nome: Laure Max Da Silva Palma Curso: Engenharia Industrial Elétrica 1. Dê um exemplo de função f(x), que tenha pelo menos uma raiz, que não pode ser determinada usando o Método da Bisseção. > f1:= x-> x^2-4*x + 4; > plot(f1(x),x=-1..4); f1 := x x 2 4 x + 4 2. Dê um exemplo de função f(x), que tenha pelo menos uma raiz, onde o Método de Newton-Raphson não converge. > f2:= x-> arctan(x); > plot(f2(x),x=-3..3); f2 := arctan
3) A equação x^2-7x + 12 = 0 tem 3 e 4 como raízes. Considere a função de iteração dada por fit(x) = x^2-6x + 12. Determine o intervalo (a; b), onde para qualquer que seja x0 escolhido a sequência X n+1 = fit (Xn) converge para a raiz x = 3. Mostre que a convergência é quadrática. > mpfixo(2.2,f1,fit1,0.001,15); #nota-se que usando x0=2.2 a função converge para a raiz 3. 1, "xk=", 2.2, "f(kx)=", 1.44, "phi(xk)=", 3.64 2, "xk=", 3.64, "f(kx)=", -.2304, "phi(xk)=", 3.4096 3, "xk=", 3.4096, "f(kx)=", -.24182784, "phi(xk)=", 3.16777216 4, "xk=", 3.16777216, "f(kx)=", -.13962466, "phi(xk)=", 3.02814750 5, "xk=", 3.02814750, "f(kx)=", -.02735522, "phi(xk)=", 3.000792282 3.000792282 4. Para determinar a raiz quadrada de um número c >= 0, basta resolver a equação x^2-c = 0. É possível determinar sua raiz quadrada usando a função de iteração fit(x) = c/x. Justifique a resposta. Condição para convergência -1 < diff(fit(x),x) < 1 sabe-se que r1= sqrt(c) e r2=-sqrt(c) então diff(fit(x),x) = c / x^2 <1, logo x^2 > c, portanto x >sqrt(c) Como r1 e r2 nao pertecem ao intervalo I=(-inf,-sqrt(c))U(sqrt(c),+inf), logo nao é possivel. 5) As funções de iterações fit1(x) = x^2/2-2x+4 e fit2(x) = x^2/2-2.5x+5, geram sequências convergentes para a raiz x = 2, para qualquer aproximação inicial
x0 pertence (1.5; 3). Qual das duas funções geram sequências mais rapidamente convergente para esta raiz. Justifique a resposta. > fit1:= x-> x^2/2-2*x +4; > diff(fit1(x),x); Nas proximidades de x=2 temos fit1 (2)=0 > fit2:= x-> x^2/2-2.5*x +5; > diff(fit2(x),x); 1 fit1 := x + 2 x2 2 x 4 x 2 1 fit2 := x + 2 x2 2.5 x 5 x 2.5 Nas proximidades de x=2 temos fit2 (2)=0.5 Logo, fit1 (2) < fit2 (2), entao fit1 (2) convergirá mais rapido para raíz. 6. Determine um intervalo (a; b) e uma fun c ao de iteração fit(x) associada, de tal forma que para todo x0 pertencente (a; b) a função de iteração gere uma sequância convergente para a(s) raiz(es) de cada uma das funções abaixo, usando o método iterativo linear (MIL) com tolerância com erro de 0.001. > f1:= x-> sqrt(x)- exp(-x); fit11:= x-> exp(2*x); f1 := x x e ( x) fit11 := x e ( 2 x ) > plot([f1(x),fit11(x)],x=-4..4,y=-10..10);
um bom intervalo I=(0.42,0.44) usando x0=0.43, temos: > mpfixo := proc(x0,fun,phi,erro,itmax) local xk :: real, i :: integer; xk:=x0; for i from 1 by 1 while ( abs(fun(xk)) > erro) and (i <=itmax) do print(i,"xk=",xk,"f(kx)=",evalf(fun(xk)),"phi(xk)=",evalf(phi(xk ))); xk:= evalf(phi(xk)); end proc; mpfixo := proc( x0, fun, φ, erro, itmax) local xk:: real, i:: integer; xk := x0; for i while erro < abs ( fun( xk )) and i itmax do end do print ( i, "xk=", xk, "f(kx)=", evalf ( fun( xk )), "phi(xk)=", evalf ( φ( xk ) )); xk := evalf ( φ( xk )) end proc > mpfixo(0.43,f1,fit11,0.001,15); 1, "xk=",.43, "f(kx)=",.0052347577, "phi(xk)=", 2.363160694 2, "xk=", 2.363160694, "f(kx)=", 1.443135263, "phi(xk)=", 112.8795576 3, "xk=", 112.8795576, "f(kx)=", 10.62447917, "phi(xk)=",.1111572953 10 99
4, "xk=",.1111572953 10 99, "f(kx)=",.1054311601 10 50, "phi(xk)=", Float( ) > f2:= x-> ln(x)-x+2; fit12:= x-> exp(x-2); 5, "xk=",, "f(kx)=",, "phi(xk)=", 6, "xk=",, "f(kx)=",, "phi(xk)=", 7, "xk=",, "f(kx)=",, "phi(xk)=", 8, "xk=",, "f(kx)=",, "phi(xk)=", 9, "xk=",, "f(kx)=",, "phi(xk)=", 10, "xk=",, "f(kx)=",, "phi(xk)=", 11, "xk=",, "f(kx)=",, "phi(xk)=", 12, "xk=",, "f(kx)=",, "phi(xk)=", 13, "xk=",, "f(kx)=",, "phi(xk)=", 14, "xk=",, "f(kx)=",, "phi(xk)=", 15, "xk=",, "f(kx)=",, "phi(xk)=", Float( ) f2 := x ln( x ) x + 2 fit12 := x e ( x 2 ) > plot({f2(x),x,fit12(x)},x= -4..4); > mpfixo(0.43,f2,fit12,0.001,15); 1, "xk=",.43, "f(kx)=",.726029930, "phi(xk)=",.2080451824 2, "xk=",.2080451824, "f(kx)=",.221954818, "phi(xk)=",.1666341117 3, "xk=",.1666341117, "f(kx)=",.041411070, "phi(xk)=",.1598745413 4, "xk=",.1598745413, "f(kx)=",.006759571, "phi(xk)=",.1587975023
5, "xk=",.1587975023, "f(kx)=",.001077039, "phi(xk)=",.1586265632 > f3:= x-> exp(x/2)-x^3; fit13:= x-> exp(x/6);.1586265632 e ( 1 / 2 x) x 3 f3 := x fit13 := x e ( 1 / 6 x) > plot({f3(x),x,fit13(x)},x= -4..4); > mpfixo(0.43,f2,fit12,0.001,15); 1, "xk=",.43, "f(kx)=",.726029930, "phi(xk)=",.2080451824 2, "xk=",.2080451824, "f(kx)=",.221954818, "phi(xk)=",.1666341117 3, "xk=",.1666341117, "f(kx)=",.041411070, "phi(xk)=",.1598745413 4, "xk=",.1598745413, "f(kx)=",.006759571, "phi(xk)=",.1587975023 5, "xk=",.1587975023, "f(kx)=",.001077039, "phi(xk)=",.1586265632.1586265632 7. Determine a(s) raiz(es) da função f1(x), usando o método da Bisseção, Método da Falsa posição e da Falsa posição modificada com erro de 0.001. Quantas iterações foram necessárias para cada um dos métodos. > bisseccao := proc(a,b,fun,erro) local a1, b1, med :: real, i :: integer; a1:=a; b1:=b; for i from 1 by 1 while ( abs(a1-b1) > erro) do print(i,a1,b1,evalf(fun(a1)), evalf(fun(b1))); med := evalf((a1+b1)/2);
if (evalf(fun(med))*evalf(fun(a1)) <= 0) then b1:=med else a1:=med end if; end proc; bisseccao := proc( a, b, fun, erro) local a1, b1, med:: real, i:: integer; a1 := a; b1 := b; for i while erro < abs ( a1 b1 ) do end do print ( i, a1, b1, evalf ( fun( a1 )), evalf ( fun( b1 )) ); med := evalf( 1 / 2 a1 + 1 / 2 b1 ); if evalf ( fun( med ) ) evalf( fun( a1) ) 0 then b1 := med else a1 := med end if end proc > posfalsa := proc(a,b,fun,erro) local a1, b1, ptpf :: real, i :: integer; a1:=a; b1:=b; for i from 1 by 1 while (( evalf(abs(a1-b1)) > erro) and (evalf(abs(fun(a1))) > erro) and (evalf(abs(fun(b1))) > erro) ) do print(i,"a=",a1,"b=",b1,"f(a)=",evalf(fun(a1)),"f(b)=",evalf(fun (b1))); ptpf := evalf((b1 * fun(a1) - a1 * fun(b1))/(fun(a1)-fun(b1))); if (evalf(fun(ptpf)) = 0) then a1:=ptpf; b1:=ptpf; else if (evalf(fun(ptpf)*fun(a1)) < 0) then b1:=ptpf; else a1:=ptpf end if; end if; if (evalf(abs(fun(b1))) < evalf(abs(fun(a1)))) then a1:=b1; print(a1) end if end proc; posfalsa := proc( a, b, fun, erro) local a1, b1, ptpf:: real, i:: integer; a1 := a; b1 := b; for i while erro < evalf ( abs ( a1 b1 ) ) and erro < evalf ( abs ( fun( a1 ) )) and erro < evalf ( abs ( fun( b1 ))) do print ( i, "a=", a1, "b=", b1, "f(a)=", evalf ( fun( a1 )), "f(b)=", evalf ( fun( b1 )) ); ptpf := evalf ( ( b1 fun( a1 ) a1 fun( b1 )) / ( fun( a1 ) fun( b1 ) )); if evalf ( fun( ptpf) ) = 0 then a1 := ptpf ; b1 := ptpf
else if evalf( fun( ptpf ) fun( a1) ) < 0 then b1 := ptpf else a1 := ptpf end if end if if evalf ( abs ( fun( b1 ))) < evalf ( abs ( fun( a1 )) ) then a1 := b1 ; print( a1) end if end proc > bisseccao(0,1,f1,0.001); > posfalsa(0,1,f1,0.001); 1, 0, 1, -1.,.6321205588 2, 0,.5000000000, -1.,.1005761215 3,.2500000000,.5000000000, -.2788007831,.1005761215 4,.3750000000,.5000000000, -.0749168431,.1005761215 5,.3750000000,.4375000000, -.0749168431,.0157893014 6,.4062500000,.4375000000, -.0287661715,.0157893014 7,.4218750000,.4375000000, -.0062969585,.0157893014 8,.4218750000,.4296875000, -.0062969585,.0047931195 9,.4257812500,.4296875000, -.0007400701,.0047931195 10,.4257812500,.4277343750, -.0007400701,.0020294728.4267578125 1, "a=", 0, "b=", 1, "f(a)=", -1., "f(b)=",.6321205588 2, "a=", 0, "b=",.6126998367, "f(a)=", -1., "f(b)=",.2408655637 3, "a=", 0, "b=",.4937681039, "f(a)=", -1., "f(b)=",.0923640502 4, "a=", 0, "b=",.4520179000, "f(a)=", -1., "f(b)=",.0359799856 5, "a=", 0, "b=",.4363191433, "f(a)=", -1., "f(b)=",.0141331858 6, "a=", 0, "b=",.4302385025, "f(a)=", -1., "f(b)=",.0055717185 7, "a=", 0, "b=",.4278546172, "f(a)=", -1., "f(b)=",.0021997840.4269154953 Para o metodo da Bissecção foram necessárias 10 interações, já para o metodo da posição falsa apenas 7. 8. Determine as raízes do exercício (6), usando o Método de Newton-Raphson. Para facilitar a minha vida e a correçao pegarei apenas um exemplo. Desculpa Prof e obrigado. pegarei a (d). > f4:= x-> sin(x)-x^2; > plot(f4(x),x=-1..2); f4 := x sin( x ) x 2
> newton := proc(x0,fun,erro,itmax) local dfun, xa, xb :: real, i :: integer; dfun:= unapply(diff(fun(x),x),x); xa:=x0; xb:=evalf(xa-fun(xa)/dfun(xa)); for i from 0 by 1 while ( abs(fun(xb)) > erro or abs(xb-xa) > erro) and (i < itmax) do print(i,"xk=",xa,"f(xk)=",evalf(fun(xa))); xa := xb; xb := evalf(xa-fun(xa)/dfun(xa)); print(i,"xk=",xb,"f(xk)=",evalf(fun(xb))); end proc; newton := proc( x0, fun, erro, itmax) local dfun, xa, xb:: real, i:: integer; dfun := unapply ( diff ( fun( x ), x ), x ); xa := x0; xb := evalf ( xa fun( xa ) / dfun( xa )); for i from 0 while ( erro < abs ( fun( xb )) or erro < abs ( xb xa ) ) and i < itmax do print ( i, "xk=", xa, "f(xk)=", evalf ( fun( xa ) )); xa := xb; xb := evalf ( xa fun( xa ) / dfun( xa) ) print ( i, "xk=", xb, "f(xk)=", evalf ( fun( xb )) )
end proc > newton(0.6,f4,0.001,15); 0, "xk=",.6, "f(xk)=",.2046424734 1, "xk=", 1.146202099, "f(xk)=", -.4025732857 2, "xk=",.9321189716, "f(xk)=", -.0659608437 3, "xk=",.8801036414, "f(xk)=", -.0037775096 4, "xk=",.8767262156, "f(xk)=", -.2 10-9 9. Determine as raízes do exercício (6), usando o Método das Secantes. > secante := proc(x0,x1,fun,erro,itmax) local xa, xb, xc :: real, i :: integer; xa:=x0; xb:=x1; for i from 0 by 1 while ( abs(fun(xb)) > erro or abs(xb-xa) > erro) and (i < itmax) do print(i,"xk=",xa,"f(xk)=",evalf(fun(xa))); xc := evalf((xa*fun(xb)-xb*fun(xa))/(fun(xb)-fun(xa))); xa:=xb; xb:=xc; print(i,"xk=",xb,"f(xk)=",evalf(fun(xb))); end proc; secante := proc( x0, x1, fun, erro, itmax) local xa, xb, xc:: real, i:: integer; xa := x0; xb := x1; for i from 0 while ( erro < abs ( fun( xb )) or erro < abs ( xb xa ) ) and i < itmax do print ( i, "xk=", xa, "f(xk)=", evalf ( fun( xa ) )); xc := evalf ( ( xa fun( xb) xb fun( xa ) ) / ( fun( xb ) fun( xa ) )); xa := xb; xb := xc print ( i, "xk=", xb, "f(xk)=", evalf ( fun( xb )) ) end proc > secante(0.6,0.9,f4,0.001,10); 0, "xk=",.6, "f(xk)=",.2046424734 1, "xk=",.9, "f(xk)=", -.0266730904 2, "xk=",.8654068797, "f(xk)=",.0124300517 3, "xk=",.8767308208, "f(xk)=", -.51294 10-5 10)??? 11. Determine o ponto de intersecção entre as funções f1(x) e f2(x), f2(x) e f3(x) e entre f1(x), f2(x) e f3(x).
Para encontrar o ponto em que as funções se interceptam basta igualar ambas f1(x)=f2(x) disto vem que x= exp(sqrt(x)-exp(-x)+x-2); > x:= x->exp(sqrt(x)-exp(-x)+x-2); x e( x) x 2 x := x e ( + ) > plot({f1(x),x,x(x)},x=-1..2); > h1:= x-> sqrt(x)-exp(-x)-ln(x)+x-2; h1 := x x e ( x ) ln( x ) + x 2 > plot(h1(x),x=-2..2);
> newton(0.07,h1,0.001,15); 0, "xk=",.07, "f(xk)=",.061441348 1, "xk=",.07619976706, "f(xk)=",.8615 10-5 > newton(1.4,h1,0.001,15); 0, "xk=", 1.399846311, "f(xk)=",.1 10-8 Logo o ponto de intersecção é P=(1.39984,0.0762). 12) Substituindo os valores na equação dada obtemos: arctg(x)= arctg(0)+ (x-0)f (x/2) logo arctg(x)= x f (x/2) sabendo que arctg(x)= 1/(1+x^2), temos arctg(x)= 4x/(4+x^2) usando o método de Newton obtemos: > f5:= x-> arctan(x)- 4*x/(x^2 +4); #usando x0=1.4 > newton(1.4,f5,0.001,15); f5 := x arctan( x ) 4 x x 2 + 4 # entao x = 1.2856 0, "xk=", 1.4, "f(xk)=",.0109495252 1, "xk=", 1.298726585, "f(xk)=",.0011069130
2, "xk=", 1.285643813, "f(xk)=",.54 10-8