【问题标题】:Algorithm in C to calculate coefficients of polynomial using Lagrange interpolation使用拉格朗日插值计算多项式系数的 C 算法
【发布时间】:2013-08-04 23:39:57
【问题描述】:

我已经坚持了一段时间了。我正在用 C 语言编写一个算法,使用拉格朗日插值法提取多项式的系数。

我的代码部分有效,例如,如果我们在这里执行第一个示例 http://en.wikipedia.org/wiki/Lagrange_polynomial#Example_1,那么代码可以打印出前 2 个系数(0 和 4.834848)

与那篇文章中的示例 3 类似,它将打印 2 个系数 6 和 -11。

我需要能够准确地从任何一组点中获取所有系数。请告知代码所需的更改。

提前致谢!

8 月 5 日格林威治标准时间晚上 7:57 更新为最新代码。 9 个系数现在工作,变得难看。明天研究n度的迭代过程!

#include<ncursesw/ncurses.h>
#include<math.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#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);

}

【问题讨论】:

  • 你能举个例子说明它失败了吗?
  • 当然 - 使用以下输入,count = 4,array[] = 维基百科文章示例 1 中的“x”值,y[] =“f(x)”值;我们得到以下输出,系数 1 = 0.000000,系数 2 = 4.834848,系数 3 = 4.834848,系数 4 = 10.576050。前两个系数是正确的,第三个和第四个不是(正确值参见示例)
  • count 以什么值开头?您的使用建议它以1 开头,在这种情况下,您的数组索引可能已关闭。也许您的循环旨在达到&lt; count。
  • 我无法重现您的结果,但问题可能是我不得不对您没有向我们展示的代码做出很多猜测。也有变量命名例如coeff2、coefftwo 和 coefficienttwo 是非常糟糕的做法。
  • count 这个名字不好用,它应该更像是索引。它由键盘输入定义,告诉程序要输入多少点,如 count = input - 1;执行示例 1,它将从 0 变为 4,即 5 分。我知道它看起来很愚蠢,我会清理它。

标签: c algorithm math computer-science polynomial-math


【解决方案1】:

你的代数完全是错误的,而且这个事实被选择不当的变量名所掩盖。

当您计算第 ith 基多项式的贡献时(暂时不要介意 y)什么变量代表 x2 术语?这是coeff3。而且你计算不正确。

举一个更简单的例子。假设你想计算 (x+a)(x+b)(x+c)(x+d)。第一项是 x4,很简单。接下来是(a+b+c+d)x3,还不错。接下来是 (ab + ac + ad + bc + bd + cd)x2,现在很明显,单个循环无法完成这项工作。 在尝试更复杂的问题之前,花时间确保您可以编写正确处理简单问题的代码是值得的。您需要这样的东西:

for(unsigned int j=0 ; j<count ; ++j)
{
  ...
  coeff2 -= x[j];
  for(unsigned int k=j ; k<count ; ++k)
  {
    if(j!=k && k!=i)
      coeff3 += x[j] * x[k];
    ...
  }
}

这应该足以让你开始。

【讨论】:

  • 好的,在您的帮助下,我已经在上面进行了更新。在 coeffthree[] 计算中我该怎么做?
  • 你的代数正确吗?你为什么要除以coeff2?应该是coeffthree[i] = y[i] * coeff3 / coeff1;。
  • 我按照你的说法编码了 coeff3 并且我有 coeffthree[i] = y[i] * coeff3 / coeff1; 我已经尝试了以下几点 {1, 3], {2, 9}, {3, 27} 这应该会给coefficientthree 为 9,但在这段代码中它给出了 75。
  • @JaboJG:是的,我的代码不太正确。我会纠正它,但你必须自己开始计算代数,否则你会遇到更多问题。
  • 感谢@Beta,我现在取得了一些进展
猜你喜欢
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
相关资源
最近更新 更多