标签:
多项式求值
一、一维多项式求值:
P(x)=3x^6+7x^5+3x^4+3x^3+8x^2+5x+23
一个通用的计算多项式的值的算法可以采用递推的方式。首先可以将上面多项式变形为如下的等价方式:
P(x)=(...((an-1x+an-2)x+an-3)x+...+a1)x+a0
通过以上表达式可以看出,只要从里往外逐层按照如下的方式递推,便可以计算得到一个一维多项式的值:
Rk=Rk+1*x+ak
具体示例代码如下:
1 /* 2 * @author 3 * 一维多项式求值,从最高一项开始迭代计算 4 */ 5 void polynomialSingle(double x, double coefficient[], int len) { 6 double temp; 7 int i; 8 temp = coefficient[0]; 9 for (i = 1; i < len; i++) { 10 temp = temp * x + coefficient[i]; 11 } 12 printf("The result of the polynomial is %f\n", temp); 13 } 14 15 void initialization() { 16 double coefficient[7]={3.0,7.0,-3.0,2.0,7.0,-7.0,-15.0}; 17 double x=-2.0; 18 polynomialSingle(x,coefficient,7); 19 }
二、二维多项式求值
与一维多项式求值的思想一致。具体示例如下:
1、将含x,y二维多项式看成是两个一维多项式:
1 /* 2 * @author 3 * 二维多项式求值 4 * 以下方法以一维多项式求值的为基础,将二维转化成一维的形式 5 * (16+17y+18y^2+19y^3+20y^4)x^3+(11+12y+13y^2+14y^3+15y^4)x^2+ 6 * (6+7y+8y^2+9y^3+10y^4)x+(1+2y+3y^2+4y^3+5y^4) 7 * 这样将含y的部分看成是x的系数部分,x的系数部分又可以看出是含y的一维多项式求值,故多次利用一维 8 * 多项式求值的方法 9 * 10 * 注意在求x的一维多项式时,每一次循环都乘了一个x,而多项式中含有常数项,所以要除以一个x 11 */ 12 void polynomialDouble(double coefficientMatrix[], double x, double y, int m, 13 int n) { 14 int i, j; 15 double s, temp = 0, k; 16 for (i = 0; i < m; i++) { 17 s = coefficientMatrix[i * n]; 18 // printf("\nco[%d*%d]=%f ",i,n,coefficientMatrix[i*n]); 19 for (j = 1; j < n; j++) { 20 s = s * y + coefficientMatrix[i * n + j]; 21 // printf("co[%d*%d+%d]=%f ",i,n,j,coefficientMatrix[i*n+j]); 22 } 23 k = temp + s; 24 temp = k * x; 25 } 26 printf("The result of polynomialDouble is %f\n", temp / x); 27 } 28 29 void initialization() { 30 //polynomialDouble 31 double coefficient[4][5] = { { 20.0, 19.0, 18.0, 17.0, 16.0 }, { 15.0, 14.0, 32 13.0, 12.0, 11.0 }, { 10.0, 9.0, 8.0, 7.0, 6.0 }, { 5.0, 4.0, 3.0, 33 2.0, 1.0 } }; 34 double x = 0.5, y = -2.0; 35 polynomialDoubleTwo(*coefficient, x, y, 4, 5); 36 }
2、将含x看成是一个常变量,这样二维多项式变成含y的一维多项式:
/* * @author * 二维多项式求值 * 与第一种方法不同的是,将二维多项式看成是一个含y的一维多项式求值,x看成是一常量 * 即多项式变形为1+2y+3y^2+4y^3+5y^4+6x+7xy+8xy^2+9xy^3+10xy^4+ * 11x^2+12x^2y+13x^2y^2+14x^2y^3+15x^2y^4+16x^3+17x^3y+18x^3y^2+19x^3y^3+20x^3y^4 * 这样每一次循环x相当于是y的系数常量 * 注意:系数矩阵的变化 */ void polynomialDoubleTwo(double coefficientMatrix[], double x, double y, int m, int n) { int i, j; double s, temp = 0, k = 1.0; for (i = 0; i < m; i++) { s = coefficientMatrix[i * n] * k; // printf("\nco[%d*%d]=%f ",i,n,coefficientMatrix[i*n]); for (j = 1; j < n; j++) { s = s * y + coefficientMatrix[i * n + j] * k; // printf("co[%d*%d+%d]=%f ",i,n,j,coefficientMatrix[i*n+j]); } k = k * x; temp = temp + s; } printf("The result of polynomialDouble is %f\n", temp); } void initialization() { double coefficient[4][5] = { { 5.0, 4.0, 3.0, 2.0, 1.0 }, { 10.0, 9.0, 8.0, 7.0, 6.0 }, { 15.0, 14.0, 13.0, 12.0, 11.0 }, { 20.0, 19.0, 18.0, 17.0, 16.0 } }; double x = 0.5, y = -2.0; polynomialDoubleTwo(*coefficient, x, y, 4, 5); }
标签:
原文地址:http://www.cnblogs.com/hoojjack/p/5018703.html