Baixe o app para aproveitar ainda mais
Prévia do material em texto
FISP 1/6 110 Computação para Engenharia Turmas EM1A, EM1B, EM2A e EM2B 12a AULA - exercícios 12ª Aula - Exercícios Implementação Computacional do Método Newton-Raphson Método das Aproximações Sucessivas de Newton-Raphson: Utilizado para encontrar a raiz ou raízes de uma função matemática complexa. A raiz é o ponto exato em que a função cruza o eixo x, ou seja, o valor de x que torna o resultado da função igual a zero. Aplicação do Método: 1) Dada a função f(x), ao qual se deseja calcular a raiz, determinar a derivada primeira da função: f’(x) 2) Montar a expressão do Método de Newton-Raphson (fórmula de recorrência) utilizada para obter as aproximações: )(' )( 1 i i ii xf xf xx −=+ 3) Escolher o valor inicial (“chute inicial”) para começar as aproximações. Se o gráfico da função estiver disponível, deve ser escolhido como “chute inicial” um valor próximo ao ponto onde gráfico cruza o eixo x (raiz da função). Desta forma o programa convergirá rapidamente à raiz da função e, consequentemente, serão realizadas menos iterações. 4) Começar o cálculo com a expressão usando x=x1 (valor inicial ou “chute inicial”). Em seguida, obter os demais valores de x por meio da expressão do Método de Newton- Raphson dada acima. 5) Continuar o procedimento até que o resultado atinja a precisão desejada. Exemplo 1: Calcular a raiz da função 5)( 2 −= xxf ou 505)( 2 =⇒=−= xxxf Figura 1 – Gráfica da função FISP 2/6 110 Computação para Engenharia Turmas EM1A, EM1B, EM2A e EM2B 12a AULA - exercícios Fórmula de recorrência utilizada para realizar as aproximações: i i i i i ii x x x xf xf xx 2 5 )(' )( 2 1 − −=−=+ Começando o cálculo com x1 = 2 teremos a tabela abaixo como exemplo da aplicação do método de Newton-Raphson: i 1 x 1 = 2 2 x 2 = 2.25 3 x 3 = 2.236111111 x 4 =2.236067978 4 x 4 = 2.236067978 x 5 =2.236067977 5 x 5 = 2.236067977 x 6 =2.236067977 x i i i i i i ii x x x xf xf xx 2 5 )(' )( 2 1 − −=−=+ 25.2 22 522 2 2 = ⋅ − −=x 2361111111.2 25.22 525.225.2 2 3 = ⋅ − −=x Logo se continuarmos aplicando a fórmula de recorrência do Método de Newton obteremos sempre o mesmo resultado, pois o mesmo convergiu para a raiz da função, ou seja, 236068.25 = (considerando apenas 6 casas após o separador decimal). Implementação computacional usando laço contado (FOR) para 10 iterações. #include<stdio.h> #include<stdlib.h> #include<math.h> int I; float X=2; //declaração da variável X e seu chute inicial int main() { for (I=1;I<=10;I++) //laco contado para 10 iteracoes { printf("Valor de X%d=%f\n",I,X); X=X-((X*X-5)/(2*X)); //formula de recorrencia de Newton que } //calcula o novo valor de X (raiz da função) printf("raiz da funcao=%f\n",X); system ("PAUSE"); } SAÍDA (OUTPUT) DO PROGRAMA: Valor de X1=2.000000 Valor de X2=2.250000 Valor de X3=2.236111 Valor de X4=2.236068 Valor de X5=2.236068 Valor de X6=2.236068 Valor de X7=2.236068 Valor de X8=2.236068 Valor de X9=2.236068 Valor de X10=2.236068 raiz da funcao=2.236068 Pressione qualquer tecla para continuar. FISP 3/6 110 Computação para Engenharia Turmas EM1A, EM1B, EM2A e EM2B 12a AULA - exercícios A implementação computacional do laço condicional (while) com controle de precisão de 0.000001 (1x10-6) para o mesmo exemplo é apresentado a seguir. Neste caso não utilizaremos a condição de exatidão da repetição Xi+1=Xi, aplicada nos exemplos da Aula 12 - exemplos de programas com estruturas de repetição. A explicação para não utilizarmos esta condição reside no fato de que nem sempre a mesma pode ocorrer de fato, e a maioria dos profissionais opta por descartá-la em suas aplicações. Alguns optam por substituírem por outra condição que limita o número de repetições ou iterações (imáx=100), conforme pode ser visto no programa abaixo. #include <stdio.h> #include <stdlib.h> #include <math.h> int I=1; double X=2,Aux=0; int main() { while(fabs(X-Aux)>0.000001 && I<=100) //fabs eh o absoluto de um float { //operador “E” com Imax de 100 printf("Valor de X%d= %f\n",I,X); //apresenta o valor de X atual Aux=X; //variavel que armazena o valor do X anterior X=X-((X*X-5)/(2*X)); //formula de recorrencia de Newton //calcula o novo valor de X (raiz da função) I++; //contador do numero de iteracoes } printf("Raiz da funcao=%f\n",X); printf("Valor encontrado com %d iteracoes\n",I); system("PAUSE"); } SAÍDA (OUTPUT) DO PROGRAMA: Notar que o valor da raiz da função apresentado é o X5, é por esta razão que o programa indica 5 iterações. Valor de X1= 2.000000 Valor de X2= 2.250000 Valor de X3= 2.236111 Valor de X4= 2.236068 Raiz da funcao=2.236068 Valor encontrado com 5 iteracoes Pressione qualquer tecla para continuar. É importante observar a diferença entre os dois exemplos apresentados: Embora ambos gerem o mesmo resultado para a raiz aproximada da função, o exemplo com o laço condicional while chegou ao resultado da raiz da função em 5 iterações, sendo 1 chute inicial e 4 aplicações do método de Newton-Raphson ou fórmula de recorrência com precisão de cálculo de 1x10-6. Já o exemplo com laço contado for foram geradas 11 aproximações da raiz da função, sendo 1 chute inicial e 10 aplicações do método de Newton-Raphson. FISP 4/6 110 Computação para Engenharia Turmas EM1A, EM1B, EM2A e EM2B 12a AULA - exercícios Exemplo 2: Calcular a raiz da função )cos()( xxxf −= Comece o cálculo com 11 =x Expressão utilizada para realizar as aproximações: )(1 )cos( )(' )( 1 i ii i i i ii xsen xx x xf xf xx + − −=−=+ Começando o cálculo com x1 = 1 teremos a tabela abaixo como exemplo da aplicação do método de Newton-Raphson: i x i 1 1 0.750363867840244 2 0.750363867840244 0.739112890911362 3 0.739112890911362 0.739085133385284 4 0.739085133385284 0.739085133215161 5 0.739085133215161 0.739085133215161 6 0.739085133215161 0.739085133215161 7 0.739085133215161 0.739085133215161 8 0.739085133215161 0.739085133215161 9 0.739085133215161 0.739085133215161 10 0.739085133215161 0.739085133215161 )(1 )cos( )(' )( 1 i ii i i i ii xsen xx x xf xf xx + − −=−=+ Implementação computacional usando laço contado (FOR) #include<stdio.h> #include<stdlib.h> #include<math.h> int I; float X=2; int main() { for (I=1;I<=10;I++) { X=X-((X-cos(X))/(1+sin(X))); printf("Valor de X%d=%f\n",I,X); } printf("raiz da funcao=%f\n",X); system ("PAUSE"); } SAÍDA (OUTPUT) DO PROGRAMA: Valor de X1=0.734536 Valor de X2=0.739090 Valor de X3=0.739085 Valor de X4=0.739085 Valor de X5=0.739085 Valor de X6=0.739085 Valor de X7=0.739085 Valor de X8=0.739085 Valor de X9=0.739085 Valor de X10=0.739085 raiz da funcao=0.739085 Pressione qualquer tecla para continuar. FISP 5/6 110 Computação para Engenharia Turmas EM1A, EM1B, EM2A e EM2B 12a AULA - exercícios Implementação computacional usando laço condicional (WHILE) com controle de precisão de 0.000001. #include <stdio.h> #include <stdlib.h> #include <math.h> int I=1; double X=2,Aux=0; int main() { while(fabs(X-Aux)>0.000001 && I<=100) { printf("Valor de X%d= %f\n",I,X); Aux=X; X=X-((X-cos(X))/(1+sin(X))); I++; } printf("Raiz da funcao=%f\n",X);printf("Valor encontrado com %d iteracoes\n",I); system("PAUSE"); } SAÍDA (OUTPUT) DO PROGRAMA: Notar que o valor da raiz da função apresentado é o X5, é por esta razão que o programa indica 5 iterações. Valor de X1= 2.000000 Valor de X2= 0.734536 Valor de X3= 0.739090 Valor de X4= 0.739085 Raiz da funcao=0.739085 Valor encontrado com 5 iteracoes Pressione qualquer tecla para continuar.. Se considerarmos uma precisão de 1x10-3 obteríamos a seguinte saída: Valor de X1= 2.000000 Valor de X2= 0.734536 Valor de X3= 0.739090 Raiz da funcao=0.739085 Valor encontrado com 4 iteracoes Notar que o módulo da subtração do valor da raiz da função pelo valor de X3 é igual a 5x10-6, valor inferior à precisão desejada de 1x10-3. Nota: é possível alterar o número de algarismos do resultado da função da seguinte forma: printf("Raiz da funcao=%1.9f\n",X); Para o exemplo acima a saída do programa ficaria: Valor de X1= 2.000000 Valor de X2= 0.734536 Valor de X3= 0.739090 Valor de X4= 0.739085 Raiz da funcao=0.739085133 Valor encontrado com 5 iteracoes Experimente alterar os valores de %N.Nf e verifique o resultado. FISP 6/6 110 Computação para Engenharia Turmas EM1A, EM1B, EM2A e EM2B 12a AULA - exercícios Exercícios propostos 1) Calcule a raiz das funções matemáticas abaixo através de um laço contado para um máximo de 15 iterações. a) 19)( 3 −= xxf (adote x1=3) b) xexf x 5)( 2 += (adote x1=0) c) xexxf 3ln)( −−= (adote x1=2) 2) Calcule as raízes das funções matemáticas abaixo com controle de precisão de 0.000001, e também determinando quantas iterações serão necessárias para se atingir esta precisão. O programa deverá ter um limite de iterações da fórmula de recorrência de Newton-Raphson, tal como mostrado nos exemplos desta nota de aula. a) xexxf 3ln)( −−= (adote x1=2) b) )4(ln)( 2 −−= xxxf (adote x1=1) c) 124)( 37 ++= xxxf (adote x1=-1.5) Respostas: 1) a) 2.668402 b) -0.148584 c) 1.044525 2) a) 1.044525 com 7 iterações b) 2.186888 com 7 iterações c) -1.236927 com 6 iterações
Compartilhar