All pastes #415660 Raw Edit

Exercice4

public text v1 · immutable
#415660 ·published 2007-03-29 19:49 UTC
rendered paste body
/**
*@file exercice4.c
*@author Alain CHRISTMANN
*@author Daniel CALECA
*@date 28.03.2007
*@version 1.00
*
*Programmation de la methode de Newton
*/

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

//calcul du polynome d'apres le schema de horner
float calcPoly(float *coefs, int degres, float x)
{
    int i;
    float poly = coefs[0];
    
    for (i = 1; i <= degres; i++)
    {
        poly = poly * x + coefs[i];
    }
    
    return poly;
}


float calcDeriv(float *coefs, int degres, float x, int derivee)
{
    int i, j;
    
    //calcul des coefficients du polynome derive
    for (i = 0; i < derivee; i++)
    {
        for (j = 0; j <= degres; j++)
        {
            coefs[j] = coefs[j] * (degres - j);
        }
    }

    if (degres - derivee < 0)
        return 0;
    else
        return calcPoly(coefs, degres - derivee, x);
}


float polyDeTest(float x, int derivee)
{
    float coefs[4] = { -1, 8, -17, 11 };    //Ici, la fonction de test est -x^3+8x^2-17x+11
    return calcDeriv(coefs, 3, x, derivee); //Le deuxieme parametre indique le degre du polynome.
}


float fonction(float x)
{
    return polyDeTest(x, 0);
}


float derivee(float x)
{
    return polyDeTest(x, 1);
}

/*
float fonction(float x)
{return sqrt(x);}

float derivee(float x)
{return 1/(2*sqrt(x));}
*/

float newton(float fonction(float x), float derivee(float x), float precision, float debut, int maxiter)
{
    int iter = 1;   //iteration en cours
    float valDerivee;
    float xPrecedent;

    valDerivee = derivee(debut);

    // test de derivee non nulle
    if (fabs(valDerivee) > 0.000001)
    {
        xPrecedent = debut;
        debut = debut - fonction(debut) / valDerivee;
    }
    // derivee nulle, on reprend un peu plus loin        
    else
    {
        xPrecedent = debut;
        debut = debut + precision * 100;
    }
    while (fabs(debut - xPrecedent) > precision * (fabs(debut) + 0.1) && iter <= maxiter)
    {
        valDerivee = derivee(debut);
        
        // test de derivee non nulle
        if (fabs(valDerivee) > 0.000001)
        {
            xPrecedent = debut;
            debut = debut - fonction(debut) / valDerivee;
        }
        // derivee nulle, on reprend un peu plus loin        
        else
        {
            xPrecedent = debut;
            debut = debut - precision * 100;
        }
        iter = iter + 1;
    }
    
    printf("nombre d'iterations : %d\n", iter);
    
    return debut;
}

int main()
{
    float debut;
    float precision;
    float resultat;
    int maxiter;

    printf("entrez le debut du test: ");
    scanf("%f", &debut);
    printf("entrez la precision: ");
    scanf("%f", &precision);
    printf("entrez le nombre d'iterations maximum: ");
    scanf("%d", &maxiter);

    resultat = newton(fonction, derivee, precision, debut, maxiter);
    printf("racine trouvee: %f\n", resultat);

    return (0);
}