2014-02-19 19 views
1

我是一個初學者,特別是在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 
    } 

}你必須解決

+0

您能否詳細介紹一下問題的由來?有沒有提供任何測試用例?對學位的限制?允許「作弊」,即通過Laguerres方法和通貨膨脹計算包括複數根在內的所有根,然後過濾出間隔內的那些根? – LutzL

回答

1

的一個問題是捕獲場景,其中所述間隔是[-1,1]和多項式爲x^2 +α。根據a的符號,你有兩個或兩個解決方案。

如果你打算通過間隔端點上的交替符號來拒絕這種情況,以便中間值定理保證一個根,那麼第一個有效的根發現方法是regula falsi方法的伊利諾伊變體。

請同時查閱通過Horner方案對多項式的評估,只有當您有像x^100-3*x^37+5x-1這樣的稀疏多項式時,才推薦使用Math.pow。


如果你真的想找到在任何情況下所有的根,那麼你可以做的最好的是細分區間,並排除包含使用內根半徑估計無根的所有子區間。這被稱爲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)(必需後記觀察者)

+0

所以我知道如何編程對分方法,但是,我需要使用該方法細分間隔的幫助。 – user3312298

+0

我指的是不同的二分法,而不是用作中間值定理的建設性證明的原始方法。 – LutzL

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。除了通常的成功檢查之外,如果迭代距離初始點移動超過h/2,則觸發失敗時執行檢查abs(dx)<eps1,abs(f(x))<eps2*scale_f,以便僅發現附近的根,如果存在任何。