在计算方法里有一种求一元非线性方程的解法,叫做二分法。
简单介绍如下:
函数F(x)在区间[a,b] 上连续,假定在区间内有唯一实根,计为x*
二分法的思想为:首先确定有根区间,将区间二等分,通过判断F(x)的符号,逐步将有根区间缩小,直至有根区间足够小,便可求出满足精度要求的近似根。
然后给出一例题和C#的编程解法:
 //用二分法求方程f(x)=x^4-x-10.27=0在(1,2)上的根。精确到10^(-2)
//用二分法求方程f(x)=x^4-x-10.27=0在(1,2)上的根。精确到10^(-2) using System;
using System;
 class Dichotomy
class Dichotomy {
{     static void Main()
    static void Main() {
    { int k = -1;    //记录循环索引
        int k = -1;    //记录循环索引 double a = 1;    //下限
        double a = 1;    //下限 double b = 2;    //上限
        double b = 2;    //上限 double x = 0;    //所求的根
        double x = 0;    //所求的根 
         Console.Write("k   a \t         b \t      x \t   F(x) \t       a-b\n");
        Console.Write("k   a \t         b \t      x \t   F(x) \t       a-b\n"); 
         //第一次计算
        //第一次计算 x = (a+b)/2;
        x = (a+b)/2; k++;
        k++; 
             Console.Write("{0,-4}{1,-13}{2,-13}{3,-13}{4,-20}{5}\n",k,a,b,x,F(x),a-b);
        Console.Write("{0,-4}{1,-13}{2,-13}{3,-13}{4,-20}{5}\n",k,a,b,x,F(x),a-b); 
         while(true)
        while(true) {
        { 
             k++;
            k++; double f = F(x);
            double f = F(x); 
             if(f < 0)
            if(f < 0) {
            { a = x;
                a = x; }
            } else if(f > 0)
            else if(f > 0) {
            { b = x;
                b = x; }
            } x = (a+b)/2;
            x = (a+b)/2; if((b - a) < 0.01)
            if((b - a) < 0.01) {
            { Console.Write("{0,-4}{1,-13}{2,-13}{3,-13}{4,-20}{5}\n",k,a,b,x,f,a-b);
                Console.Write("{0,-4}{1,-13}{2,-13}{3,-13}{4,-20}{5}\n",k,a,b,x,f,a-b); break;
                break; }
            } 
             Console.Write("{0,-4}{1,-13}{2,-13}{3,-13}{4,-20}{5}\n",k,a,b,x,f,a-b);
            Console.Write("{0,-4}{1,-13}{2,-13}{3,-13}{4,-20}{5}\n",k,a,b,x,f,a-b); 
             }
        } Console.ReadLine();
        Console.ReadLine();             }
    } 
     private static double F(double x)
    private static double F(double x) {
    { return Math.Pow(x,4) - x - 10.27;
        return Math.Pow(x,4) - x - 10.27; }
    }  }
}输出结果为:
k   a            b            x            F(x)                a-b
0   1            2            1.5          -6.7075             -1
1   1.5          2            1.75         -6.7075             -0.5
2   1.75         2            1.875        -2.64109375         -0.25
3   1.75         1.875        1.8125       0.214619140625      -0.125
4   1.8125       1.875        1.84375      -1.29024841308594   -0.0625
5   1.84375      1.875        1.859375     -0.557734031677246  -0.03125
6   1.859375     1.875        1.8671875    -0.176621873378753  -0.015625
7   1.859375     1.8671875    1.86328125   0.0177218760550026  -0.0078125
可见b7 - a7 约等于0.0078<10^(-2),从而|x*-x7|<=0.5*(b7 - a7 )<=0.5*10^(-2),也就是满足题目的精度要求,所以满足要求的根为:x*约等于1.863
 
                    
                 
                
 


 
     
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号