形如f(x)= a0+a1x+a2x+…+an-1x+anx,为一元多项式,当给定x后,求f(x)。系数矩阵为一维数组array[] ={a0,a1,a2,a3········,an}(顺序一定)
传统方式,先写一个x的n次幂的函数,然后主义与系数相乘,求和。代码如下:
//求x的N次幂
private static double power(double x,int times){
while(times>0){
x*=x;
times--;
}
return x;
}
//求一元多项式结果
public double polynomial_1(double x,int index,double[] coefficient){//参数分别是,x的值,项数,系数矩阵
//这是传统写法
double sum=0;
for(int i=index-1;i>=0;i--){
sum+=coefficient[i]*power(x, i);
}
return sum;
}
下面这种更为优秀,首先需要对原式进行变形:
public double polynomial_1(double x,int index,double[] coefficient){
//改进版
double sum=coefficient[index-1];//首先需要先获取第一个系数an-1.
for(int i=index-2;i>=0;i--){
sum=sum*x+coefficient[i];//每次求出的sum,都是下一次的系数
}
return sum;
}
这个从代码量和结构上都比第一个优秀。
二元多项式和一元基本一样,只是系数矩阵变成二维数组,行为x,列为y,
假设f(y)是一个一元多项式(m项),那么:
f(x,y)=x^0*f(y)1+x^1*f(y)2+x^2*f(y)3+····+x^n-1*f(y)n.所以可以看成一个一元多项式乘上x:
public static double polynomial_2(double x,double y,int n,int m,double[][] coefficient){//参数分别是x,y的值,系数矩阵的行和列,系数矩阵
//以x从0到n排序
double sum_y;//记录y多项式的和
double times_x=1.00;//x的n次幂,初始化为x^0=1
double sum_x=0;//记录x多项式的和,这个要依赖sum_y
for(int i=0;i<n;i++){//对x
sum_y=coefficient[i][m-1];//每次取每一行的最后一个系数,
for(int j=m-2;j>=0;j--){//对y,计算第i行的y多项式结果
sum_y=sum_y*y+coefficient[i][j];
}
sum_x+=sum_y*times_x;//y多多项式结果乘上x
times_x*=x;//每循环一次x的次数就升高
}
return sum_x;
}
只要理解了二维矩阵里每一行代表的是对应的x^k的y的多项式系数,k为行数。