Algorithme en C pour calculer les coefficients de polynôme en utilisant une interpolation de Lagrange

Cela fait un moment que je suis coincé là-dessus. J’écris un algorithme en C pour extraire les coefficients d’un polynôme en utilisant la méthode d’interpolation de Lagrange.

Mon code fonctionne partiellement, par exemple si nous faisons le premier exemple ici http://en.wikipedia.org/wiki/Lagrange_polynomial#Example_1, le code peut imprimer les 2 premiers coefficients (0 et 4.834848)

De même avec l’exemple 3 de cet article, les 2 coefficients 6 et -11 seront imprimés.

Je dois pouvoir obtenir avec précision tous les coefficients d’un ensemble de points. Veuillez indiquer les modifications à apporter au code.

Merci d’avance!

Mis à jour avec le dernier code, 19h57, GMT, le 5 août. 9 coefficients fonctionnent maintenant et deviennent laids. Enquêtera sur le processus itératif pour n degrés demain!

#include #include #include  #include  #include  #include  #define MAX 200 float coeff[MAX], coefftwo[MAX], coeffthree[MAX], coefffour[MAX]; int count; void main() { int n,i,j ; char ch; float x[MAX],y[MAX],fp2, coeff1, coeff2; printf("\n\nn = "); scanf("%i", &count); for(i=0; i < count; i++) { printf("\n\n The value of x%i= ", i); scanf("%f",&x[i]); printf("\n The value of f(x%i)= ", i); scanf("%f",&y[i]); } for(i=0;i<count;i++) { coeff1 = 1.0; coeff2 = 0.0; coeff3 = 0.0; coeff4 = 0.0; coeff5 = 0.0; coeff6 = 0.0; coeff7 = 0.0; coeff8 = 0.0; coeff9 = 0.0; for(j=0; j<count; j++) { if(i!=j) { coeff1 = coeff1 * (array[i]-array[j]); coeff2 -= array[j]; for (int k=j; k < count; k++) { if ((j!=k) && (k!=i)) { coeff3 += array[j] * array[k]; for(int l=k; l < count; l++) { if ((l!=j) && (l!=k) && (l!=i)) { coeff4 -= array[j] * array[k] * array[l]; for (int m = l; m < count; m++) { if ((m!=l) && (m!=k) && (m!=j) && (m!=i)) { coeff5 += array[j] * array[k] * array[l] * array[m]; for (int n = m; n < count; n++) { if ((n!=m) && (n!=l) && (n!=k) && (n!=j) && (n!=i)) { coeff6 -= array[j] * array[k] * array[l] * array[m] * array[n]; for (int o = n; o < count; o++) { if ((o!=n) && (o!=m) && (o!=l) && (o!=k) && (o!=j) && (o!=i)) { coeff7 += array[j] * array[k] * array[l] * array[m] * array[n] * array[o]; for (int p = o; p < count; p++) { if ((p!=o) && (p!=n) && (p!=m) && (p!=l) && (p!=k) && (p!=j) && (p!=i)) { coeff8 -= array[j] * array[k] * array[l] *array[m] *array[n] * array[o] * array[p]; for (int q = p; q < count; q++) { if ((q!=p) && (q!=o) && (q!=n) && (q!=m) && (q!=l) && (q!=k) && (q!=j) && (q!=i)) { coeff9 += array[j] * array[k] * array[l] * array[m] * array[n] * array[o] * array[p] * array[q]; } } } } } } } } } } } } } } } } coeff[i] = y[i] / coeff1; coefftwo[i] = y[i] * coeff2 / coeff1; coeffthree[i] = y[i] * coeff3 / coeff1; coefffour[i] = y[i] * coeff4 / coeff1; coefffive[i] = y[i] * coeff5 / coeff1; coeffsix[i] = y[i] * coeff6 / coeff1; coeffseven[i] = y[i] * coeff7 / coeff1; coeffeight[i] = y[i] * coeff8 / coeff1; coeffnine[i] = y[i] * coeff9 / coeff1; } float coefficientone = 0.0; float coefficienttwo = 0.0; float coefficientthree = 0.0; float coefficientfour = 0.0; float coefficientfive = 0.0; float coefficientsix = 0.0; float coefficientseven = 0.0; float coefficienteight = 0.0; float coefficientnine = 0.0; for (int i = 0; i< count; i++){ coefficientone = coefficientone + coeff[i]; coefficienttwo = coefficienttwo + coefftwo[i]; coefficientthree = coefficientthree + coeffthree[i]; coefficientfour = coefficientfour + coefffour[i]; coefficientfive = coefficientfive + coefffive[i]; coefficientsix = coefficientsix + coeffsix[i]; coefficientseven = coefficientseven + coeffseven[i]; coefficienteight = coefficienteight + coeffeight[i]; coefficientnine = coefficientnine + coeffnine[i]; } printf("coefficient 1 = %f\n", coefficientone); printf("coefficient 2 = %f\n", coefficienttwo); printf("coefficient 3 = %f\n", coefficientthree); printf("coefficient 4 = %f\n", coefficientfour); printf("coefficient 5 = %f\n", coefficientfive); printf("coefficient 6 = %f\n", coefficientsix); printf("coefficient 7 = %f\n", coefficientseven); printf("coefficient 8 = %f\n", coefficienteight); printf("coefficient 9 = %f\n", coefficientnine); 

}

Votre algèbre est tout simplement fausse, et ce fait est masqué par des noms de variables mal choisis.

Lorsque vous calculez la consortingbution du polynôme de base de i ème (peu importe y pour le moment), quelle variable représente le coefficient du terme x 2 ? C’est coeff3 . Et vous ne le calculez pas correctement.

Prenons un cas plus simple. Supposons que vous vouliez travailler sur (x + a) (x + b) (x + c) (x + d). Le premier terme est x 4 , facile. Le prochain est (a + b + c + d) x 3 , pas trop mal. Le prochain est (ab + ac + ad + bc + bd + cd) x 2 , et il est maintenant évident qu’une boucle unique ne fera pas le travail. Prenez le temps de vous assurer que vous pouvez écrire du code qui traite correctement le problème simple avant d’essayer le plus complexe. Vous avez besoin de quelque chose comme ça:

 for(unsigned int j=0 ; j 

Cela devrait être suffisant pour vous aider à démarrer.