【C#】 迴圈小練習_非線性方程式求解 II

非線性方程式求解(二分法)

二分法也稱為對分法,是逐次把有根區間分半,直到找到根或是有根區間的長度小於指定精度為止。
對於函數f(x),假如 x= c,f(c) = 0 , 把 x = c 稱之為函數f(x) 的零點。
假設非線性方程式f(x)在區間(x,y)上面連續。如果存在兩個實數a和b屬於區間(x,y),使得滿足以下式
f(a)*f(b) <0
也就是f(a)和f(b)異號,那就說明區間(a,b)內一定有零點,也就是至少包含方程式的一個解。
我們就可以根據 f [(a+b)/2]的值來判斷方程式解的位置。

  • f [( a + b ) / 2] = 0,表示該點為零點。
  • f [( a + b ) / 2] < 0,表示在區間(( a + b ) / 2 , b )內有零點,( a + b ) / 2 => a ,重複步驟判斷。
  • f [( a + b ) / 2] > 0,表示在區間(a , ( a + b ) / 2 )內有零點,( a + b ) / 2 <= b ,重複步驟判斷。

透過這種每次把f(x)的零點所在區間收縮一半的方法,進而逐步逼進函數的零點,求的近似值的方法,就是二分法。

 class Program
    {
        static double func(double x)
        {
            return 2 * x * x * x - 5 * x - 1;
        }
        static double erfen(double a, double b, double err)
        {
            double c;
            c = (a + b) / 2.0; //中間值

            while (Math.Abs(func(c)) > err && func(a - b) > err)
            {
                if (func(c) * func(b) < 0)  //確定新的區間
                {
                    a = c;
                }
                if (func(a) * func(c) < 0) //確定新區間
                {
                    b = c;
                }
                c = (a + b) / 2; //二分法確定新區間
            }

            return c; //傳回結果
        }

        static void Main(string[] args)
        {
            //線性方程式2分法
            //二分法求解
            double a = 1.0, b = 2.0; //初始區間
            double err = 1e-5; //絕對誤差'
            double result;

            result = erfen(a, b, err); //呼叫二分方法

            Console.WriteLine(string.Format("二分法方程式: 2 * x * x * x - 5 * x - 1 \n結果x = {0}\n", result)); //輸出解
            Console.ReadLine();
        }

    }

 

水滴可成涓流,涓流可成湖泊大海。
汲取累積知識,將知識堆積成常識;將常識探究成學識;將學識簡化為知識;授人自省。