非線性方程式求解(二分法)
二分法也稱為對分法,是逐次把有根區間分半,直到找到根或是有根區間的長度小於指定精度為止。
對於函數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();
}
}
水滴可成涓流,涓流可成湖泊大海。
汲取累積知識,將知識堆積成常識;將常識探究成學識;將學識簡化為知識;授人自省。