算法學習——枚舉之超級方程

算法描述


求區間(2,3)的一個解,精確到小數點後8位算法

算法思路

  1. 首先是要判斷該區間是否有解,這裏使用數學中的定義,f(a)\*f(b)<0,則在a與b之間有解,咱們從2開始,逐漸加0.1,與f(3)相乘,判斷二者之積是否爲0,便可知道是否有解code

  2. 有解的話咱們就能夠繼續下一步了,先設置一個數值min,從f(2)開始,一次加上0.1,尋找f(x)最小數值時候的x的值,以此x的值縮小範圍,繼續重複以前的步驟,通過屢次循環以後,便可找到精度較大的xorm

算法實現

double a,b;
    System.out.println("輸入上限");
    Scanner scanner = new Scanner(System.in);
    a = scanner.nextInt();
    System.out.println("輸入下限");
    b = scanner.nextInt();
    scanner.close();
    boolean isHave = false;//false無解
    for(double i = a;i<=b;i=i+0.1){
        if(fun(i)*fun(b)<=0){
            isHave = true;
            break;
        }
    }
    if(isHave){
        System.out.println("有解");
        int k = 1;
        double y,c = 0.1,min=100,x1=0;//min賦值一個較大的初值
        while(k<=8){
            for(double x=a;x<=b;x=x+c){
                //System.out.println(x);
                y = fun(x);
                
                if(Math.abs(y)<min){
                    min = Math.abs(y);
                    
                    x1 = x;
                }
            }
            c = c/10;
            //System.out.println(c);
            a = x1-5*c;
            b = x1+5*c;
            k++;
        }
        DecimalFormat fm = new DecimalFormat("0.00000000");
        System.out.println(fm.format(x1));
    }else{
        System.out.println("無解");
    }
    public static double fun(double x){
        return 2*Math.pow(x, 2)*Math.pow(Math.sin(x), 7)+3*Math.pow(x, 0.5)*Math.cos(x)-Math.exp(x)/5;
    }

結果

相關文章
相關標籤/搜索