Cálculo Numérico- UFABC

O método iterativo de Newton Raphson é utilizado para calcular o valor aproximado da raiz de uma função.
Tentaremos explicá-lo de uma maneira simples antes de nos voltarmos ao exercício propriamente dito.




Dada uma função f(x) , queremos descobrir o valor de sua raiz, ou seja, o valor de f(x) quando x=0. Escolhe-se um ponto Xo arbitrário que ligamos à função até que a reta e a curva da função se encontrem. Traçamos uma reta tangente à curva naquele ponto até que encontre o eixo x . O nosso próximo ponto a ser projetado para encontrar a função será a raiz da reta tangente. E esse processo ocorre sucessivamente, de forma iterativa, até que a raiz de uma das retas tangentes seja tão próxima da raiz da função real que possamos aproximar os valores.
Uma das deduções da notação matemática do método se dá pela análise da equação geral da reta. Ao final, ele é representado da seguinte maneira:

Para que obtenhamos sucesso no processo de iteração, a função f analisada deve ser diferenciável em Xn e seu valor deve ser não nulo.
Um outro ponto que merece destaque é que dependendo da complexidade da função que iremos analisar, encontrar a sua derivada pode ser um processo extremamente trabalhoso. Em casos como esse, o método das secantes é uma alternativa e passa a ser mais produtivo, uma vez que não necessita da derivada da função.
Para a realização do problema utilizamos o programa Scilab.
Para o calculo da derivada da função utilizamos o programa wolfram alpha.
function y=fun(x) (definimos a função necessária para calculo de alpha)
y=[[10*cos(2*%pi/5-x)]/[sin(2*%pi/5-x)]^2]-8*cos(x)/[sin(x)]^2;
endfunction
function y=dfun(x) ( definimos a derivada da função)
y=8*[cotg(x)]^2*csc(x)+8*[csc(x)]^3+10*[sec(%pi/10+x)]^3+10*sec(%pi/10+x)*[tan(%pi/10+x)]^2;
endfunction
x0= input('Ingresse um valor inicial'); (
error=0.0001;
while error>abs(fun(x0))
x1=x0-[fun(x0)/dfun(x0)];
x0=x1;
end
disp (x1);
(enquanto o valor absoluto da função não for tão próximo de zero quanto
demandado pelo erro, uma nova iteração é realizada).
Para qualquer valor inicial escolhido,ou seja, o Xo arbitrário positivo o código retornou o mesmo valor de alpha- 0,5962796 radianos, que corresponderia a mais ou menos 34,16 graus.

Como já mencionado anteriormente, uma outra alternativa para encontrar a raiz desejada seria o médodo das secantes. Trata-se de um algoritimo que usa sequencia de raizes de linhas secantes para a realizar a aproximação da raiz da função que queremos calcular.
Quando fazemos a seguinte a proximação para o médodo de Newton, temos o médodo da secante.
Substituindo no que ja conhecemos do método de newton chegamos em:
Os pontos excolhidos X0 e X1 devem ser escolhidos próximos da raiz da função. Sendo assim, o intervalo escolhido foi [0,55-0,68] radianos.





Como no método das secantes a cada passo só é necessário calcular o valor de f(xk), a ordem de convergência é menor.
Testando diversos valores de a, pôde-se verificar alguns “comportamentos” do algoritmo, como o número de iterações realizadas à medida que o valor de a aumenta, e a incapacidade do método em encontrar raízes de potências de 10 com a precisão máxima (format (25)), como ilustrado a seguir:
Calculando a raiz de 1E-2 (cujo resultado sabemos ser 1E-1):
Observa-se que na quinta iteração o algoritmo encontra um valor cuja diferença para o valor exato 0.1 é menor que o Eps da máquina. Demonstraremos mais à frente que alguns resultados são oscilantes, o que ocasiona a perda de alguns resultados que não passam pelo teste x==a^0.5.
Calculando a raiz de 2E-5:
Para a= 2E-5, o algoritmo encontra o valor exato na nona iteração.
Calculando a raiz de 9:
Para a raiz de 9, o algoritmo encontra o resultado exato já na 0-ésima iteração, sem problemas.
Calculando a raiz de 3:
Aqui já podemos observar uma oscilação dos resultados, sendo o primeiro resultado correto encontrado na quarta iteração e depois sofrendo oscilação de duas iterações posteriores não apresentadas por não passarem no teste de igualdade.
Isso ocorre pela perda de precisão já comentada em aulas anteriores devido aos cálculos serem realizados com diferenças muito próximas de eps.
Isso fica mais evidente quando retiramos o teste de igualdade e permitimos que o programa mostre todos os resultados calculados (todos os Xk+1).
Como exemplo crítico, mostraremos o programa calculando a raiz de 10000:
Fica claro como a partir da 4ª iteração o programa encontra valores próximos do real, porém não exatos, e sofre uma oscilação dos resultados com frequência de 4 iterações (repare como o valor da quarta iteração é repetida na oitava, e a quinta na nona).
Um fato interessante é que o código é sensível ao valor de x0 colocado no início do código, apesar desse ser constante e igual a 3 conforme descrito no próprio código, porém se para o cálculo da raiz de 10000 colocarmos x0=100, o programa consegue encontrar o valor correto:
Calculando raiz de 10000 com X0=100:
Com o reajuste de x0 o algoritmo encontra o valor correto desde a primeira iteração.
Extrapolando para valores bem maiores de potências de 10, rodamos o programa com
a=1E40:
Para encontrar a raiz de 1E40, foi necessário aumentar o número de iterações para 50, sendo que o programa efetivamente encontrou o resultado na iteração nº 40.
Ou seja, mesmo que a análise matemática mostre que a convergência é garantida para todo valor de a positivo é necessário tomar um certo cuidado com o valor inicial de X0, pois se o valor da raiz for muito alto comparado com x0 as aproximações geram erros de precisão.







