Método de Newton Modificado p/ Raízes Multiplas

Publicado por Rafael Amorim 28/03/2005

[ Hits: 10.411 ]

Homepage: http://www.rafa-amorim.com.br/

Download teste.c




O Algoritmo foi desenvolvido para cálcular raízes multiplas de polinômios com grau menor ou igual a 6, através do Método de Newton Modificado. Espero que seja de grande ajuda!!!

  



Esconder código-fonte

#include <stdio.h>
#include <math.h>
double calculafx(double coef[6], double p0){
    double fx;
    int i;
    fx = coef[6];
    for(i= 5;i>=0;i--){
       fx = (p0*fx) + coef[i];}
    return fx;}

double calculadfx(double coef[6], double p0){
    double fx, dfx;
    int i;
    fx = coef[6];
    dfx = coef[6];
    for(i= 5;i>=1;i--){
       fx = (p0*fx) + coef[i];
       dfx = (p0*dfx) + fx;}
    return dfx;}

double calculaddfx(double coef[6], double p0){
    double fx, dfx, ddfx;
    int i;
    fx = coef[6];
    dfx = coef[6];
    ddfx = coef[6];
    for(i= 5;i>=2;i--){
       fx = (p0*fx) + coef[i];
       dfx = (p0*dfx) + fx;
       ddfx = (p0*ddfx) + 2*dfx;}
     return ddfx;}

double modulo(double x){
    if (x>=0.0){
      return (x);}
    else{
       return (-1.0*x);}}

void main(void)
{
     int n, op, grau, i;
     double e, numer, denom, p0, p, fx, dfx, ddfx, tol, coef[6];
     printf("\e[H\e[2J");
     tol = 0.000001;
     printf("Digite 0 p/ polinômio ou 1 p/ exponecial: ");
     scanf("%i", &op);
     if (op>0){
       printf("\nEntre com o ponto inicial: ");
       scanf("%lf", &p0);
       fx = exp(p0) - p0 -1;
       dfx = exp(p0) -1;
       ddfx = exp(p0);
       n =1;
       p = p0 - (fx*dfx)/((dfx*dfx)-(fx*ddfx));
       printf("\nP%i %lf\n", (n-1), p0);
       e = modulo(p-p0);
       while (n<20 && e>=tol) {
          p0 = p;
          fx = exp(p0) - p0 -1;
          dfx = exp(p0) -1;
          ddfx = exp(p0);
          p = p0 - (fx*dfx)/((dfx*dfx)-(fx*ddfx));
           n++;
     e = modulo(p-p0);
     printf("P%i %lf\n", (n-1), p0);}
       printf("\nAproximação p/ raíz é  %e\n", p);
       printf("\nAproximação da f(x) no ponto é  %e\n", fx);
       printf("Com %i iterações\n\n", n);}
     else{
     printf("Entre com o grau do polinômio: ");
     scanf("%i", &grau);
     for(i = 0 ; i <= 6 ; i++){
       coef[i] = 0;
       }
     for(i = 0 ; i <= grau ; i++){
       printf("\nEntre com o coeficiente a%i: ", i);
       scanf("%lf",&coef[i]);
       }
     printf("\nEntre com o ponto inicial: ");
     scanf("%lf", &p0);
     n = 1;
     fx = calculafx (coef,p0);
     dfx = calculadfx (coef,p0);
     ddfx = calculaddfx (coef,p0);
     p = p0 - (fx*dfx)/((dfx*dfx)-(fx*ddfx));
     printf("\nP%i %lf\n", (n-1), p0);
     e = modulo(p-p0);
     while (n<20 && e>=tol) {
        p0 = p;
        fx = calculafx (coef,p0);
        dfx = calculadfx (coef,p0);
        ddfx = calculaddfx (coef,p0);
        p = p0 - (fx*dfx)/((dfx*dfx)-(fx*ddfx));
   n++;
   e = modulo(p-p0);
   printf("P%i %lf\n", (n-1), p0);
}
     printf("\nAproximação p/ raíz é  %e\n", p);
     printf("\nAproximação da f(x) no ponto é  %e\n", fx);
     printf("Com %i iterações\n\n", n);
     }}

Scripts recomendados

Contar elementos de uma lista encadeada

Ejetor

Thread, Courses, Shell e Aquivo

Estrutura Simples (REGISTRO)

[C] Fatorial ilimitado


  

Comentários
[1] Comentário enviado por Tadzio em 30/01/2010 - 22:58h

não estou em condições de testar mas tenho a impressão que este código vai dar problema.
vou demonstrar só na primeira função, a lógica se repete depois:

double calculafx(double coef[6], double p0){ // coef = new double(6)
double fx;
int i;
fx = coef[6]; // W fx = 7º elemento de coef que só tem 6 elementos
for(i= 5;i>=0;i--){
fx = (p0*fx) + coef[i];} // ERRO vc tenta ler fx em p0*fx
return fx;}


Contribuir com comentário