-
Notifications
You must be signed in to change notification settings - Fork 0
/
fpm_method.m
66 lines (53 loc) · 1.18 KB
/
fpm_method.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
% Implementação do Método da Falsa Posição Modificado
% Autor: William Henrique ([email protected])
%
% @[in] a, limite esquerdo
% @[in] b, limite direito
% @[in] f, função desejada
% @[in] tol, tolerância de aproximação (1e-12 padrão IEEE)
%
% @[out] xf, raiz encontrada
% @[out] ni, número de iterações
% @[out] status, status de execução
% 0 - OK
% 1 - troca de sinal entre o intervalo [a, b]
% 2 - Convergência lenta
%%
function [xf, ni, status] = fpm_method(a, b, f, tol = 1e-12, cmax = 300)
if f(a)*f(b) > 0
status = 1;
xf = [];
ni = -1;
return;
end
status = 0;
contador = 0;
% primeira aproximação
xi = 0;
xf = (a*f(b) - b*f(a)) / (f(b) - f(a));
while abs(f(xf)) > tol && contador <= cmax
% verifica em qual intervalo se encontra a raiz
if(f(a)*f(xf) < 0)
b = xf;
F = f(a);
G = f(b);
if (f(xi)*f(xf) > 0)
F = F/2;
end
else
a = xf;
F = f(a);
G = f(b);
if (f(xi)*f(xf) > 0)
G = G/2;
end
end
contador++; # incrementa contador em 1
xi = xf;
xf = a - F*(b-a)/(G - F);
end
ni = contador;
if(ni == cmax) % não convergiu
status = 2;
end
end %!function