Pular para o conteúdo

Método de Newton-Raphson

Implementação na linguagem C do método de Newton-Raphson, usado para obtenção numérica do zero de funções. Não pretendo explicar o funcionamento do método aqui; recomendo a leitura de um livro de Cálculo Numérico para tal fim.

float f(float x) é a função cujo zero queremos descobrir.
float der(float x) é a derivada da função f(x); uma derivada errada tornará a convergência lenta ou impossível.
Renan Birck Pinheiro Century_Child
Hits: 36.041 Categoria: C/C++ Subcategoria: Miscelânea
  • Download
  • Nova versão
  • Indicar
  • Denunciar

Descrição

Implementação na linguagem C do método de Newton-Raphson, usado para obtenção numérica do zero de funções. Não pretendo explicar o funcionamento do método aqui; recomendo a leitura de um livro de Cálculo Numérico para tal fim.

float f(float x) é a função cujo zero queremos descobrir.
float der(float x) é a derivada da função f(x); uma derivada errada tornará a convergência lenta ou impossível.
Download newton-raphson.c Enviar nova versão

Esconder código-fonte

#include <stdio.h>
#include <math.h>

float f(float x) {
   return pow(x,2)-5*x+6;
}

float der(float x) {
   return 2*x-5; // derivada de f(x).
}

int main() {
   float eps, x0, *iter; // erro, ponto inicial, vetor iterações.
   int i, numiter; // iteração atual, número de iterações.

   printf("Método de Newton-Rhapson para o zero da função f(x).\n");
   printf("Digite o erro: \n");

   scanf("%f",&eps);

   printf("Digite o número máximo de iterações?\n");
   scanf("%d", &numiter);

   printf("Digite o X0 inicial? \n");
   scanf("%f", &x0);

   // Alocar dinâmicamente memória para o vetor das iterações.
   iter = malloc(sizeof(float) * numiter);

   // Condições iniciais.
   iter[0] = x0;
   i = 0;

   // Iterações.
   while(f(iter[i]) > eps) {
      // Excedeu o nosso limite de iterações.
      if(i > numiter) {
         printf("Não convergiu em %d iterações!!!\n", numiter);
         printf("Provavelmente f'(x) está errada.\n");

      
      }
      iter[i+1] = iter[i] - f(iter[i])/der(iter[i]);
      i++;
   }

   printf("X ~= %f ", iter[i]);
   printf("\nForam feitas %d iterações.\n",i);
}

A - Comando strchr

Método de Power para calcular o autovelor dominante de uma matriz

Raizes reais e complexas de uma equação de 2º grau

checkscan.h

Algoritmo de Dijkstra

#1 Comentário enviado por ofelipinho em 23/06/2013 - 18:53h
Boa noite, e para usar a seguinte equação f(x)=x^3+x^2-2x+1

fiz a seguinte alteração:

float f(float x) {
return pow(x,3) + pow(x,2) - 2*x + 1;
}

float der(float x) {
return pow(x,2)*3 + 2*x - 2;// derivada de f(x)=x^3+x^2-2x+1.
}

não deu certo =S

Contribuir com comentário

Entre na sua conta para comentar.