Exercícios Zeros de Funções

Transcrição

Exercícios Zeros de Funções
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;
f1 := x → x2 − 4 x + 4
> plot(f1(x),x=-1..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);
f2 := arctan
> plot(f2(x),x=-3..3);
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;
fit1 := x →
1
2
x2 − 2 x + 4
> diff(fit1(x),x);
x−2
Nas proximidades de x=2 temos fit1´(2)=0
> fit2:= x-> x^2/2 - 2.5*x +5;
fit2 := x →
1
2
x2 − 2.5 x + 5
> diff(fit2(x),x);
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 )
(2 x)
fit11 := x → e
> 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 do;
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
print( i, "xk=", xk, "f(kx)=", evalf( fun( xk ) ), "phi(xk)=", evalf( φ( xk ) ) ) ;
xk := evalf( φ( xk ) )
end do
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 1099
4, "xk=", .1111572953 1099, "f(kx)=", .1054311601 1050, "phi(xk)=", Float( ∞ )
5, "xk=", Float( ∞ ), "f(kx)=", Float( ∞ ), "phi(xk)=", Float( ∞ )
6, "xk=", Float( ∞ ), "f(kx)=", Float( ∞ ), "phi(xk)=", Float( ∞ )
7, "xk=", Float( ∞ ), "f(kx)=", Float( ∞ ), "phi(xk)=", Float( ∞ )
8, "xk=", Float( ∞ ), "f(kx)=", Float( ∞ ), "phi(xk)=", Float( ∞ )
9, "xk=", Float( ∞ ), "f(kx)=", Float( ∞ ), "phi(xk)=", Float( ∞ )
10, "xk=", Float( ∞ ), "f(kx)=", Float( ∞ ), "phi(xk)=", Float( ∞ )
11, "xk=", Float( ∞ ), "f(kx)=", Float( ∞ ), "phi(xk)=", Float( ∞ )
12, "xk=", Float( ∞ ), "f(kx)=", Float( ∞ ), "phi(xk)=", Float( ∞ )
13, "xk=", Float( ∞ ), "f(kx)=", Float( ∞ ), "phi(xk)=", Float( ∞ )
14, "xk=", Float( ∞ ), "f(kx)=", Float( ∞ ), "phi(xk)=", Float( ∞ )
15, "xk=", Float( ∞ ), "f(kx)=", Float( ∞ ), "phi(xk)=", Float( ∞ )
Float( ∞ )
> f2:= x-> ln(x)-x+2;
fit12:= x-> exp(x-2);
f2 := x → ln( x ) − x + 2
fit12 := x → e
> plot({f2(x),x,fit12(x)},x= -4..4);
(x − 2)
> 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
> f3:= x-> exp(x/2)-x^3;
fit13:= x-> exp(x/6);
(1 / 2 x)
f3 := x → e
− x3
(1 / 6 x)
fit13 := x → e
> 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 do;
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
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 do
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;
end do;
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
end do;
if evalf( abs( fun( b1 ) ) ) < evalf( abs( fun( a1 ) ) ) then a1 := b1 ; print( a1 ) end if
end proc
> bisseccao(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
> posfalsa(0,1,f1,0.001);
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;
f4 := x → sin( x ) − x2
> plot(f4(x),x=-1..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));
end do;
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 ) )
end do;
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;
end do;
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
end do;
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 := x → e
> plot({f1(x),x,x(x)},x=-1..2);
( x −e
( −x )
+ x − 2)
> h1:= x-> sqrt(x)-exp(-x)-ln(x)+x-2;
h1 := x → x − e
> plot(h1(x),x=-2..2);
( −x )
− ln( x ) + x − 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
f5 := x → arctan( x ) −
4x
x2 + 4
> newton(1.4,f5,0.001,15);
# 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