Cálculo numérico_Algoritmo de Newton-Raphson_MATLAB

2
Fernando Henrique Gomes Zucatelli 1 sexta-feira – 01/10/2010 – 21:45 1. CÁLCULO NUMÉRICO Algoritmo de Newton-Raphson A Figura 1 mostra o gráfico das funções cujas raízes serão determinadas pelo método. a) b) Figura 1 – Gráfico da funções: a) 2 3 3 1 x x + - e b) cos( ) x x - gerados por Matlab. A partir da Figura 1 foram decididos os valores para o “chute” inicial. Algoritmo do item a) e sublinhada as linhas alteradas para o item b). Algoritmo: function x0 = newton_raphson_itema(F, dF, x0, imax, tipo_tol) %Função que calcula a raiz da de F(x) = 0 %F = função %dF = derivada da função em relação a uma variável. %x0 = valor do chute %imax = número máximo de iterações F = inline(F); %o usuário digita apenas 'f(x)' dF = inline(dF); %o usuário digita apenas 'df(x)' tol = 10^-6; %Vamos calcular a raiz for i = 1:imax, if feval(dF,x0) == 0,%verifico se não é ponto crítico if feval(F,x0) == 0,%verifico se é pt. critico e raiz fprintf('Uma solução exata x = %11.6f foi obtida num ponto crítico\n\n', x1); break; else fprintf('Erro: %11.6f é ponto crítico e não é raiz da função.',x0); break; end end x1 = x0 - (feval(F,x0)/feval(dF,x0)); %Solução numérica aproximada até aqui método de Newton- Raphson Fx1 = feval(F,x1);%valor da iteração x(n+1) %Tolerância atual, abs é o módulo if tipo_tol == 1; %tipo de tolerancia escolhida pelo usuário toli = abs((Fx1-feval(F,x0))/2); %tolerancia a ser usada em 'x^3+3*x^2-1' else toli = abs(x1-x0)/2; %tolerancia a ser usada em 'x-cos(x)' end fprintf('%3i x(n-1) = %11.6f raiz = %11.6f F(raiz) = %11.6f tolerancia = %11.6f\n\n',i,x0,x1,Fx1,toli); if Fx1 == 0; %análise fprintf('Uma solução exata x = %11.6f foi obtida\n\n', x1); break; end if toli < tol, fprintf('Tolerância atingida!\n\n', x1); break; end if i == imax, fprintf('Número máximo de iterações atingido!\n\n', x1); break; end x0 = x1; %preparando próximo condição do próximo ciclo. end Resultado a). 3 2 3 ( ) 1 f x x x + - = Chute x 0 = -2.5: newton_raphson_itema( 'x^3+3*x^2-1', '3*x^2+6*x', -2.5, 20 , 1) 1 x(n-1) = -2.500000 raiz = -3.066667 F(raiz) = -1.626963 tolerancia = 1.875981 2 x(n-1) = -3.066667 raiz = -2.900876 F(raiz) = -0.165860 tolerancia = 0.730551

description

Programa uqe permite encontrar raízes de equações nã-lineares (também de lineares) utilizando o algoritmo de Newton-Raphson considerando os parâmetros inseridos de tolerância epsilon e o número máximo de iterações.É necessário que o usuário insira a derivada da função que deseja analisar.

Transcript of Cálculo numérico_Algoritmo de Newton-Raphson_MATLAB

Page 1: Cálculo numérico_Algoritmo de Newton-Raphson_MATLAB

Fernando Henrique Gomes Zucatelli 1

sexta-feira – 01/10/2010 – 21:45

1. CÁLCULO NUMÉRICO

Algoritmo de Newton-Raphson

A Figura 1 mostra o gráfico das funções cujas raízes serão determinadas pelo método.

a) b)

Figura 1 – Gráfico da funções: a) 23

3 1x x+ − e b) cos( )x x− gerados por Matlab.

A partir da Figura 1 foram decididos os valores para o “chute” inicial. Algoritmo do item a) e

sublinhada as linhas alteradas para o item b). Algoritmo:

function x0 = newton_raphson_itema(F, dF, x0, imax, tipo_tol)

%Função que calcula a raiz da de F(x) = 0

%F = função

%dF = derivada da função em relação a uma variável.

%x0 = valor do chute

%imax = número máximo de iterações

F = inline(F); %o usuário digita apenas 'f(x)'

dF = inline(dF); %o usuário digita apenas 'df(x)'

tol = 10^-6;

%Vamos calcular a raiz

for i = 1:imax,

if feval(dF,x0) == 0,%verifico se não é ponto crítico

if feval(F,x0) == 0,%verifico se é pt. critico e raiz

fprintf('Uma solução exata x = %11.6f foi obtida num ponto crítico\n\n', x1);

break;

else

fprintf('Erro: %11.6f é ponto crítico e não é raiz da função.',x0);

break;

end

end

x1 = x0 - (feval(F,x0)/feval(dF,x0)); %Solução numérica aproximada até aqui método de Newton-

Raphson

Fx1 = feval(F,x1);%valor da iteração x(n+1)

%Tolerância atual, abs é o módulo

if tipo_tol == 1; %tipo de tolerancia escolhida pelo usuário

toli = abs((Fx1-feval(F,x0))/2); %tolerancia a ser usada em 'x^3+3*x^2-1'

else

toli = abs(x1-x0)/2; %tolerancia a ser usada em 'x-cos(x)'

end

fprintf('%3i x(n-1) = %11.6f raiz = %11.6f F(raiz) = %11.6f tolerancia =

%11.6f\n\n',i,x0,x1,Fx1,toli);

if Fx1 == 0; %análise

fprintf('Uma solução exata x = %11.6f foi obtida\n\n', x1);

break;

end

if toli < tol,

fprintf('Tolerância atingida!\n\n', x1);

break;

end

if i == imax,

fprintf('Número máximo de iterações atingido!\n\n', x1);

break;

end

x0 = x1; %preparando próximo condição do próximo ciclo.

end

Resultado a). 3 23( ) 1f x x x+ −=

• Chute x0 = -2.5:

newton_raphson_itema( 'x^3+3*x^2-1', '3*x^2+6*x', -2.5, 20 , 1)

1 x(n-1) = -2.500000 raiz = -3.066667 F(raiz) = -1.626963 tolerancia = 1.875981

2 x(n-1) = -3.066667 raiz = -2.900876 F(raiz) = -0.165860 tolerancia = 0.730551

Page 2: Cálculo numérico_Algoritmo de Newton-Raphson_MATLAB

Fernando Henrique Gomes Zucatelli 2

sexta-feira – 01/10/2010 – 21:45

3 x(n-1) = -2.900876 raiz = -2.879720 F(raiz) = -0.002543 tolerancia = 0.081659

4 x(n-1) = -2.879720 raiz = -2.879385 F(raiz) = -0.000001 tolerancia = 0.001271

5 x(n-1) = -2.879385 raiz = -2.879385 F(raiz) = -0.000000 tolerancia = 0.000000

Tolerância atingida! ans = -2.87938532466927

Dada a precisão de 6 casas: raiz = -2.879385

• Chute x0 = -2:

newton_raphson_itema( 'x^3+3*x^2-1', '3*x^2+6*x', -2, 20 , 1)

Erro: -2.000000 é ponto crítico e não é raiz da função.

ans = -2

• Chute x0 = -1.9:

newton_raphson_itema(-1.9,20)

1 x(n-1) = -1.900000 raiz = 3.312281 F(raiz) = 68.253316 tolerancia = 32.641158

2 x(n-1) = 3.312281 raiz = 2.019293 F(raiz) = 19.466392 tolerancia = 24.393462

3 x(n-1) = 2.019293 raiz = 1.219799 F(raiz) = 5.278682 tolerancia = 7.093855

4 x(n-1) = 1.219799 raiz = 0.771790 F(raiz) = 1.246703 tolerancia = 2.015990

5 x(n-1) = 0.771790 raiz = 0.577530 F(raiz) = 0.193254 tolerancia = 0.526724

6 x(n-1) = 0.577530 raiz = 0.534256 F(raiz) = 0.008781 tolerancia = 0.092236

7 x(n-1) = 0.534256 raiz = 0.532094 F(raiz) = 0.000022 tolerancia = 0.004380

8 x(n-1) = 0.532094 raiz = 0.532089 F(raiz) = 0.000000 tolerancia = 0.000011

9 x(n-1) = 0.532089 raiz = 0.532089 F(raiz) = 0.000000 tolerancia = 0.000000

Tolerância atingida! ans = 0.53208888627014.

Dada a precisão de 6 casas: raiz = 0.532089. Percebe-se que para este valor o algoritmo convergiu

para uma raiz mais distante do valor do chute (confira próximo resultado).

• Chute x0 = -1.5:

newton_raphson_itema( 'x^3+3*x^2-1', '3*x^2+6*x', -1.5, 20 , 1)

1 x(n-1) = -1.500000 raiz = -0.444444 F(raiz) = -0.495199 tolerancia = 1.435099

2 x(n-1) = -0.444444 raiz = -0.683201 F(raiz) = 0.081398 tolerancia = 0.288298

3 x(n-1) = -0.683201 raiz = -0.653042 F(raiz) = 0.000892 tolerancia = 0.040253

4 x(n-1) = -0.653042 raiz = -0.652704 F(raiz) = 0.000000 tolerancia = 0.000446

5 x(n-1) = -0.652704 raiz = -0.652704 F(raiz) = 0.000000 tolerancia = 0.000000

Tolerância atingida! ans = -0.65270368975208

Dada a precisão de 6 casas: raiz = -0.652704.

Resultado b) c( () os )xf xx −=

• Chute x0 = 0.75:

newton_raphson_itema( 'x-cos(x)', '1+sin(x)', 0.75, 20 , 0)

1 x(n-1) = 0.750000 raiz = 0.739111 F(raiz) = 0.000044 tolerancia = 0.005444

2 x(n-1) = 0.739111 raiz = 0.739085 F(raiz) = 0.000000 tolerancia = 0.000013

3 x(n-1) = 0.739085 raiz = 0.739085 F(raiz) = 0.000000 tolerancia = 0.000000

Uma solução exata x = 0.739085 foi obtida

ans = 0.73908513336448

Dada a precisão de 6 casas: raiz = 0.739085.