求一元和二元多项式结果

来源:互联网 发布:linux系统分区详解 编辑:程序博客网 时间:2024/05/22 21:08

形如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为行数。

原创粉丝点击