确定特定范围内多项式的实根

时间:2014-02-19 02:24:16

标签: java root polynomial-math bisection

我是编码的初学者,特别是在java中,我已经尝试了很多次来确定如何在给定范围内找到多项式的真正根。该程序应该找到用户提供的给定多项式的所有真实根。例如,程序应运行如下: 输入学位:3 输入4个系数:-6 11 -6 1 输入左右端点:-10 10 根发现于:1.00000根发现于:2.00000根发现于:3.00000。 下面附有我的程序格式。

    import java.util.Scanner;
    class Roots{
    public static void main(String[] args){
            Scanner sc=new Scanner(System.in);
            double resolution=0.01;
            double tolerance=0.0000001;
            double threshold=0.001;
            double roots;
            System.out.print("Enter the degree: ");
            int degree =sc.nextInt();
            System.out.print("Enter "+(degree+1)+" coefficients: ");
            double[] C=new double[degree+1];
            for(int i=0; i<C.length;i++){
                    C[i]=sc.nextDouble();
            }
            System.out.print("Enter the left and right endpoints: ");
            double a=sc.nextInt();
            double b=sc.nextInt();
            if(poly(C,a)*poly(C,b)<0){
                    roots=findRoot(C,a,b,tolerance);
            }
    }
    }
    static double poly(double[] C, double x){
            int n=C.length-1;
            int K;
            double sum=0.0;
            for(int i=0;i<n;i++){
                    sum+=C[i]*(Math.pow((x-i),n));
            }
            return sum;
    }
    static double[] diff(double[] C){
            int n=C.length-1;
            int K;
            double[]D=new double[n];
            for(int i=0;i<n;i++){
                    D[i]=C[i]*(n-1);
            }
            return D;
    }
    static double findRoot(double[] C, double a, double b, double tolerance){
            //loops here
    }

}

2 个答案:

答案 0 :(得分:1)

您必须解决的一个问题是捕获区间为[-1,1]且多项式为x ^ 2 + a的场景。根据a的符号,您有两个,一个双重或没有解决方案。

如果你要通过在区间终点上要求交替的符号来拒绝这种情况,以便中间值定理保证一个根,那么第一个有效的根发现方法是伊利诺斯式的falsi方法。

请同时通过Horner方案查找多项式的求值,使用Math.pow仅建议使用像x^100-3*x^37+5x-1这样的稀疏多项式。


如果您真的想在任何情况下找到所有根,那么您可以做的最好的是细分间隔并使用内根半径估计排除所有不包含根的子区间。这被称为bisection-exclusion algorithm。最终,系数符号或Sturm序列将告诉您剩余的小间隔内是否有任何根。


二分 - 排除方法的细节:它们需要多项式的泰勒位移,即,将p(x+h)的系数评估为h中的多项式,这是O(n ^ 2)运算。原始排除算法通过将多项式移位到中点x =(a + b)/ 2并计算内根半径r来递归地扫描间隔[a,b]。然后将相同的值应用于区间[a,x-r]和[x + r,b]。

http://algo.inria.fr/seminars/sem92-93/yakoubsohn.ps)的排除算法的简单形式的描述(需要Postscript查看器)

答案 1 :(得分:0)

可能足够强大的变体可以捕获除极端情况之外的所有情况如下:

探索的时间间隔是[a,b]。多项式f(x)具有度数d。设置N=3+d*d。 (这可能需要进行实验)和h=(b-a)/N

迭代点x0=a+k*h,k = 0,1,...,N。使用此x=x0作为初始点,执行牛顿迭代dx=-f(x)/df(x), x=x+dx。除了通常的成功检查abs(dx)<eps1abs(f(x))<eps2*scale_f之外,如果迭代距离初始点的移动距离超过h / 2,则会对失败执行检查2*abs(x-x0)>h,因此如果有的话,只找到附近的根。