function y=f3(x) y = x.^3-5*x+1;
FP3 - Ex 3) Dada a equação , verifique graficamente e com a ajuda do método da bissecção que as três raízes da equação estão perto de 2.35, 0.20 e 2.10.
>> fp3_ex3 (-2.5, 2.5)
Determinar as raízes de é equivalente a determinar os pontos que intersectam as funções e .
Podemos determinar o zero de uma função ou raiz da equação 0 utilizando a função fzero do MatLab.
Para programar a função f(x) podemos utilizar a função inline na linha de comandos ou criar e salvar a função num ficheiro externo.
>> f3 = inline(‘x.^3-5*x+1'); ou no ficheiro f3.m
>> fzero('f3', [0,0.5]) ([0, 0.5] é o intervalo onde vai ser determinado o zero) ans =
0.201639675723405
Como a função f(x) é um polinómio de grau 3 podemos alternativamente utilizar a função
roots para determinar as raízes de um polinómio.
>> roots([1 0 -5 1]) ([1 0 -5 1] representam os 4 coeficientes do polinómio de grau 3 , 5 1)
ans =
Determinar aproximações das raízes da equação linear x3 = 5x-1 usando o método da bissecção com erro absoluto inferior a ε = 10-5.
Para aproximar r1
∈
I1=[-2.5, -2]>> y1 = f3(-2.5)
y1 = -2.12500000000000 >> y2 = f3(-2)
y2 = 3
Como f(-2.5) * f(-2) < 0 e f’(x)= 3 x2 – 5 > 0 ∀ x ∈ I
1 então r1 é o único zero em I1.
Podemos usar o método da bissecção para determinar uma aproximação de r1 em I1.
>> bissec('f3', -2.5,-2, 10^-5, 20)
Após 16 iterações, obtemos
r1 ≈x16 = -2.3300552368164 com | e(x16) | < 0.7629394531 x 10-5 < ε = 1 x 10-5
Como | e(x16) | < 0.7629394531 x 10-5 < 0.5 x 10-4
esta aproximação da raiz r1 ∈ I1 tem pelo menos 4 casas decimais correctas.
r1 = - 2.330058739567982 (tomando como valor exacto o valor calculado com a função fzero)
x16 = -2.3300552368164
Podemos constatar que as 4 primeiras casas decimais da aproximação encontrada resultam de um arredondamento correctamente efectuado sobre r1.
(a quinta casa decimal da aproximação x16 se for obtida por um arredondamento correcto seria 6 e não 5).
Para aproximar r
2∈
I
2=[0, 0.5]
>> y1 = f3(0)
y = 1 (valor da função f(x)=x3 – 5 x + 1) >> y2 = f3(0.5)
y = -1.37500000000000
Como f(0) * f(0.5) < 0 e f’(x)= 3 x2 – 5 < 0 ∀ x ∈ I
2 então r2 é o único zero em I2.
Podemos usar o método da bissecção para determinar uma aproximação de r2 em I2.
>> bissec('f3', 0, 0.5, 10^-5, 20)
Após 16 iterações, obtemos
r2 ≈x16 = 0.20163726806641 com | e(x16) | < 0.7629394531 x 10-5 < ε = 1 x 10-5
Como | e(x16) | < 0.7629394531 x 10-5 < 0.5 x 10-4
Seja f(x) uma função contínua num intervalo I=[a , b].
(1) Se f(a) f(b) <0 então existe pelo menos um zero α em I
(2) Se f’(x) existir e preservar o sinal em ]a , b[, então α é o
r2 = 0.201639675723405 (calculado com a função fzero do MatLab) x16 = 0.20163726806641
Podemos constatar que as 4 primeiras casas decimais da aproximação encontrada resultam de um arredondamento correctamente efectuado sobre r2.
(a quinta casa decimal da aproximação x16 se for obtida por um arredondamento correcto seria 4 e não 3).
Para aproximar r3 ∈ I3=[2, 2.5]
>> y1 = f3(2) y = -1
>> y2 = f3(2.5) y = 4.125
Como f(2) * f(2.5) < 0 e f’(x)= 3 x2 – 5 > 0 ∀ x ∈ I
3 então r3 é o único zero em I3.
Podemos usar o método da bissecção para determinar uma aproximação de r3 em I3.
>> bissec('f3', 2, 2.5, 10^-5,20)
Após 16 iterações, obtemos
r3 ≈x16 = 2.1284255981445 com | e(x16) | < 0.7629394531 x 10-5 < ε = 1 x 10-5
Como | e(x16) | < 0.7629394531 x 10-5 < 0.5 x 10-4
esta aproximação da raiz r3 ∈ I3 tem pelo menos 4 casas decimais correctas.
r3 = 2.1284190638446 (calculado com a função fzero do MatLab)
x16 = 2.1284255981445
2 3(5 1)
3 5 )
( '
− =
x x
g
) 1 5 ( )
(x =3 x− g
a) Encontre, para cada raiz, uma função iteradora g que torne o método do ponto fixo convergente. Justifique.
Definição: Um ponto fixo de uma função g(x) é um número real α tal que α=g (α).
Podemos encontrar uma função g(x) tal que f(x) = 0 ⇔ x = g(x) (g(x) é chamada função iteradora )
I. Função iteradora para aproximar a única raiz de f(x) em I
1= [-2.5, -2]
3 3
3
1
5
)
(
1
5
0
1
5
+
=
⇔
=
−
⇒
=
−
−
x
x
x
g
x
x
x
>> fp3_ex3_a_1(-2.5, -2)
Graficamente verifica-se que g(x) e g'(x) são contínuas em I1. Além disso: i) g(x) ⊂ I1=[-2.5, -2], ∀ x ∈ I1
ii) 0 < M = max |g’(x)| < 1
Como g’(x) é monótona crescente, então M= | g’(-2) | ≈ 0.337 Teorema: (condições de convergência do método de ponto fixo)
Seja α uma raiz da equação f(x) = 0, isolada num intervalo I=[a,b]. Seja g(x) ∈ C’(I) uma função iteradora para a equação f(x) = 0. se:
i)
g
(I) ⊂ I ( i.e.g
(x) ∈ I, ∀x∈ I)ii) 0 < M= max |
g
’(x
)| < 1x
∈ Ientão
∀
x
0∈
I
>> [y, y1]=f3_it_1(-2.5) y =
-2.3811 % g(x) y1 =
0.2940 % g’(x)
>> [y, y1]=f3_it_1(-2) y =
-2.2240 % g(x) y1 =
0.3370 % g’(x)
3 5 1
)
(x = x−
g
Então, ∀ x0 ∈ I1 a fórmula de iteração definida por
x
k=
35
x
k−1−
1
,
k = 1, 2, … converge para a única raiz da equação f(x)=0 existente em I1=[-2.5, -2].Podemos também verificar as condições de convergênciaanaliticamente:
3 5 1
)
(x = x−
g ,
2 3 (5 1)
3 5 )
( '
− =
x x
g , I1 = [-2.5, -2]
Podemos constatar pelas expressões de g(x) e g'(x) que ambas as funções são contínuas em I1=[-2.5, -2].
Verificando condições i) e ii):
i) g(x)
⊂
I1,∀
x∈
I1
Como g'(x) > 0 ∀ x ∈ I1 ⇒ g(x) é monótona crescente em I1
Por outro lado, g(-2.5) = -2.3811 e g(-2.0) = -2.2240
⇒ g(x) ⊂ I1 = [-2.5, -2] ∀ x ∈I1
ii) 0 < M = max |g’(x)| < 1
g'(x) monótona cresce em I1
( h(x) = (5x-1)2 é monótona decrescente em I
1 (h’(x)= 50x -10 < 0 ∀ x ∈ I1) e
3 h(x)mantém o sinal, pelo que
3 ( )
1
x h
resulta numa função monótona crescente)
Por outro lado, g'(-2.5) = 0.2940 e g'(-2.0) = 0.3370
⇒ 0 < M = max | g'(x) | = | g'(-2.0) | ≈ 0. 3370 < 1
⇒
∀
x
0∈
I1=[-2.5, -2]
a fórmula de iteração definida porx
k=
35
x
k−1−
1
,
k = 1, 2, …converge para a única raiz existente emI1.
II. Função iteradora para aproximar a única raiz de f(x) em I
2= [0, 0.5]
>> fp3_ex3_a_1(0, 0.5)
2 3 (5 1)
3 5 )
( '
− =
x x
2
5
3
)
(
'
x
x
g
=
Como g'(x) não é contínua em I2 (para x=0.2, g'(x) está indefinida) não podemos usar esta função iteradora em I2=[0, 0.5].
Temos que procurar uma outra função iteradora alternativa:
Graficamente verifica-se que g(x) e g'(x) são contínuas em I2. Além disso:
i) g(x) ⊂ I2=[0, 0.5], ∀ x ∈ I2 ii) 0 < M = max |g’(x)| < 1
Como g’(x) é monótona crescente, então M= |g’(0.5) | ≈ 0.15 Então, ∀ x0 ∈ I2 a fórmula de iteração definida por:
5
1
3
1
+
=
k−k
x
x
, k = 1, 2, ….converge para a única raiz existente em I2=[0, 0.5].
5
1
)
(
5
1
0
1
5
3
3 3
+
=
⇒
+
=
⇔
=
+
−
x
x
g
x
x
x
III. Função iteradora para aproximar a única raiz de f(x) em I
3= [2, 2.5]
>> fp3_ex3_a_2(2, 2.5)
5
1
)
(
3
+
=
x
x
g
2
5
3
)
(
'
x
x
g
=
Não podemos considerar esta função de iteração pois g’(x)>1 ∀ x ∈I3.
Voltamos a considerar a 1ª função de iteração:
>> fp3_ex3_a_1(2, 2.5)
g(x)=3 5x−1
2 3 (5 1)
3 5 )
( '
− =
x x
g
Graficamente verifica-se que g(x) e g'(x) são contínuas em I3. Além disso: i) g(x) ⊂ I3, ∀ x ∈ I3
ii) 0 < M = max |g’(x)| < 1
>> [y, y1]=f3_it_1(2) y =
2.0801 % g(x) y1 =
0.3852 % g’(x)
>> [y, y1]=f3_it_1(2.5) y =
2.2572 y1 =
0.3271
Podemos também verificar as condições de convergênciaanaliticamente:
3 5 1
)
(x = x−
g ,
2 3 (5 1)
3 5 )
( '
− =
x x
g , I3 = [2, 2.5]
Podemos constatar pelas expressões de g(x) e g'(x) que ambas as funções são contínuas em I3.
Verificando condições i) e ii):
i) g(x)
⊂
I3,∀
x∈
I3
Como g'(x) > 0 ∀ x ∈ I3 ⇒ g(x) é monótona crescente em I3.
Por outro lado, g(2) = 2.0801 e g(2.5) = 2.2572
⇒ g(x) ⊂ I3 = [2, 2.5] ∀ x ∈I3
ii) 0 < M = max |g’(x)| < 1
g'(x) monótona decresce em I
( h(x) = (5x-1)2 é monótona crescente em I3 (h’(x)= 50x -10 > 0 ∀ x ∈ I3)
e 3 h(x)mantém o sinal, pelo que
3 ( )
1
x h
resulta numa função monótona decrescente)
Por outro lado, g'(2) = 0.3852 e g'(2.5) = 0.3271
⇒ 0 < M = max | g'(x) | = | g'(2.0) | ≈ 0. 385 < 1
⇒
∀
x
0∈
I3 a fórmula de iteração definida porx
k=
35
x
k−1−
1
,
k = 1, 2, … convergeb) Considerando x0=2.10, execute 10 iterações do método do ponto fixo
usando uma iteradora xk = g(xk-1) convergente, e diga, justificando qual a
ordem de convergência da sequência de iterações obtida.
Pretende-se aproximar a raiz r3∈ I3=[2, 2.5] da equação 5 1 pelo método do ponto
fixo
Aproximação Inicial: x0= 2.10
Fórmula Iteradora: 3
1
1
)
5
1
(
=
−
=
k− k−k
g
x
x
x
, k
= 1, 2, …(na alinha anterior foi provada a convergência desta iteradora) Critério de Paragem: k_max = 10
k xk = g(xk-1) |f(xk)|
0 2.1 0.238999999999999
1 2.11791179212745 0.089558960637234
2 2.12454635469756 0.033172812850546
3 2.12699332396014 0.012234846312916
4 2.12789439916539 0.004505376026243
5 2.12822602012021 0.001658104774124
6 2.12834803992282 0.000610099013032
7 2.12839293354130 0.000224468092405
8 2.12840945035895 0.000082584088268
9 2.12841552699921 0.000030383201306
10 2.12841776262435 0.000011178125664
r3 = 2.1284190638446 (calculado com a função fzero do MatLab)
r3 ≈x16 = 2.1284255981445 com |e(x16)| = |r3 - x16| < 0.8 x 10-5 < 0.5 x 10-4 (Bissecção) r3 ≈x10 = 2.1284177626243 com |e(x10)| = |r3 - x10| ≈ 0.1 x 10-5 < 0.5 x 10-5 (PontoFixo)
A aproximação de r3 encontrada pelo método do ponto fixo é melhor pois com menos iterações (10 vs. 16) foi determinada uma aproximação com pelo menos 5 casas decimais correctas
>> [y, y1]=f3_it_1(2.12841776262435)
y =
2.128418585120388 y1 =
0.367904131281848
IMPORTANTE:
O método do ponto fixo tem convergência linear se g’(α) ≠ 0
O método do ponto fixo tem convergência quadrática se g’(α) = 0, g’’(α) ≠ 0 Diga, justificando qual a ordem de convergência da sequência de iterações obtida.
Seja α o ponto fixo de g(x)=3 5x−1 em I
3 = [2, 2.5].
Como g’(x) monótona decresce em I3
g'(2) = 0.3852, g'(2.5) = 0.3271 e por outro lado α∈ I3= [2, 2.5]
então | g’(α) | ≠ 0
⇒ a convergência é linear.
Assim, a sucessão {xk} gerada pela fórmula iterativa
x
k=
35
x
k−1−
1
,
k = 1, 2,… comaproximação inicial x0 = 2.1 converge para α com ordem de convergência linear sendo a
razão de convergência C = |g’(α)|.
Considerando para raiz αo valor aproximado de x10 temos que
c = | g’(x10) | ≈ 0.3679
Isto quer dizer que quando
k
→
∞
:e
k+1≈
0.3679
×
e
k
c) Indique estimativas, a priori e a posteriori, para o erro absoluto da aproximação x7 obtida na alínea anterior.
1 0
1
L
x
x
L
x
e
k
k
k
=
α
−
≤
−
−
- estimativaa priori
para |ek | 1
1
−
−
−≤
−
=
k k kk
x
x
L
L
x
e
α
- estimativaa posteriori
para |ek |onde
max
[ ]|
'
(
)
|
,
g
x
L
b a x∈
Tem-se que: 1 1 0
1
1
L
x
x
L
x
x
L
L
x
k k k k−
−
≤
−
−
≤
−
−α
Para g(x)=3 5x−1,
2 3 (5 1)
3 5 ) ( ' − = x x
g , I3 = [2, 2.5]:
L
≈
0.3852 < 1
(o máximo de g’(x) se atinge quando x=2) | x1 – x0 | = | 2.11791179212745 - 2.1 | = 0.01791179212745
| x7 – x6 | = | 2.12839293354130 - 2.12834803992282 | = 0.44893618480036 x 10-4
então:
Estimativa a priori para |e7 | : 1 0 7
7
1
L
x
x
L
x
−
−
≤
−
α
≈ 0.36619 x 10-4 Estimativa a posteriori para |e7 | : 7 7 6
1
L
x
x
L
x
−
−
≤
−
α
≈ 0.28128 x 10-4d) Indique um conjunto de comandos em MatLab que considerando x0=2.10, permita executar 10 iterações do método do ponto fixo usando a iteradora
(
)
5
1
,
1
,
2
,...,
31
1
=
−
=
=
g
x
−x
−k
x
k k k .para aproximar a raiz r3∈ I3=[2, 2.5] da equação 5 1.
Implementação em MatLab
• Implementação na Linha de Comandos
• Implementação construindo um programa (script) em Matlab
k xk = g(xk-1) |f(xk)|
0 2.1 0.238999999999999 1 2.11791179212745 0.089558960637234 2 2.12454635469756 0.033172812850546 3 2.12699332396014 0.012234846312916 4 2.12789439916539 0.004505376026243 5 2.12822602012021 0.001658104774124 6 2.12834803992282 0.000610099013032 7 2.12839293354130 0.000224468092405 8 2.12840945035895 0.000082584088268 9 2.12841552699921 0.000030383201306 10 2.12841776262435 0.000011178125664
>> g=inline('(5*x-1).^(1/3)'); >> x0=2.1 >> x1=g(x0) x1 = 2.117911792127447 >> x2=g(x1) x2 = 2.124546354697556 >> x3=g(x2) x3 = 2.126993323960139 >> x4=g(x3) x4 = 2.127894399165388 >> x5=g(x4) x5 = 2.128226020120213 >> x6=g(x5) x6 =
2.128348039922820 >> x7=g(x6) x7 = 2.128392933541300 >> x8=g(x7) x8 = 2.128409450358953 >> x9=g(x8) x9 = 2.128415526999214 >> x10=g(x9) x10 = 2.128417762624346 g=inline('(5*x-1).^(1/3)'); x=2.1; for i=1:10 x=g(x); end
Ao executar o programa anterior obtemos
Para visualizar todas as aproximações, basta apenas enviar uma mensagem com o comando display após de ser calculada cada aproximação.
Ao executar o novo programa obtemos todas as aproximações com 8 casas decimais:
• Implementação utilizando a função pontofixo do pacote de rotinas de MN
Nota: para obter a raiz real de um número real negativo "x", em vez de executar: x.^(1/3) devemos utilizar sign(x).*abs(x.^(1/3)). A raiz retornada pelo operador ^ do MatLab é a raiz complexa com o menor ângulo de fase.
Após 10 iterações a aproximação encontrada é
x =
2.128417762624346
g=inline('(5*x-1).^(1/3)'); x=2.1;
for k=1:10 x=g(x);
display(['x(', num2str(k),')= ', num2str(x,8)]); end
display('Após 10 iterações a aproximação encontrada é'); x
x(1)= 2.1179118 x(2)= 2.1245464 x(3)= 2.1269933 x(4)= 2.1278944 x(5)= 2.128226 x(6)= 2.128348 x(7)= 2.1283929 x(8)= 2.1284095 x(9)= 2.1284155 x(10)= 2.1284178
Após 10 iterações a aproximação encontrada é x =
2.128417762624346
>> f=inline('x.^3-5*x+1');
>> g=inline('sign(5*x-1).*abs((5*x-1).^(1/3))');