在計算方法裡有一種求一元非線性方程的解法,叫做二分法。
簡單介紹如下:
函數F(x)在區間[a,b] 上連續,假定在區間內有唯一實根,計為x*
二分法的思想為:首先確定有根區間,將區間二等分,通過判斷F(x)的符號,逐步將有根區間縮小,直至有根區間足夠小,便可求出滿足精度要求的近似根。
然後給出一例題和C#的編程解法:
//用二分法求方程f(x)=x^4-x-10.27=0在(1,2)上的根。精確到10^(-2)
using System;
class Dichotomy
{
static void Main()
{
int k = -1; //記錄迴圈索引
double a = 1; //下限
double b = 2; //上限
double x = 0; //所求的根
Console.Write("k a \t b \t x \t F(x) \t a-b\n");
//第一次計算
x = (a+b)/2;
k++;
Console.Write("{0,-4}{1,-13}{2,-13}{3,-13}{4,-20}{5}\n",k,a,b,x,F(x),a-b);
while(true)
{
k++;
double f = F(x);
if(f < 0)
{
a = x;
}
else if(f > 0)
{
b = x;
}
x = (a+b)/2;
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);
break;
}
Console.Write("{0,-4}{1,-13}{2,-13}{3,-13}{4,-20}{5}\n",k,a,b,x,f,a-b);
}
Console.ReadLine();
}
private static double F(double x)
{
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