C語言二分法求方程根

2021-09-12 13:44:57 字數 1785 閱讀 4854

對於二分法求根,其實和弦截法思想很像,甚至更簡單。

原理:先看如下的圖

a,b兩個點為跟的乙個邊界,通過一直縮小跟的邊界,從而獲取跟的值。

(1)知道函式(即方程的式子),這個好說,題上都有

(2)迴圈的輸入a,b的橫座標的值,即x1,x2的初值,直到f(x1)與f(x2)的乘積為負數才停止。(必須保證方程的跟在(x1,x2)區間)這樣的x1,x2的初值才有意義。

(3)令xx=(x1+x2)/2;(即中值),若f(xx)*f(x1)>0此刻證明了x1要被xx替代了,即區間變成了(xx,x2);。若f(xx)*f(x2)>0此刻證明了x2要被xx替代了,即區間變成了(x1,xx);大家可以用上面的圖試一下就知道了,很好理解的。

(4)那麼什麼時候結束呢,這就是乙個精度的問題了,看你把精度設成什麼樣子,最精準的方程跟的函式值是0,那麼就用f(xx)與0比較,相差在自己設定的精度(一般是10的-6次方,c語言中寫作:1e-6)以內,則可以把xx近似當做是方程的跟。

下面用**實現:

第一種是直接的,第二種是可移植性的(即使方程改變需要修改的地方很少,而前者則需要修改很多),第二種用函式指標實現。

第一種:

#

include

#include

#include

#include

using

namespace std;

doublef(

double x)

intmain()

while(f

(x1)*f

(x2)

>0)

;//保證f(x1)和f(x2)是異號,這樣才可以進行下一步的精準區間,否則,重新輸入x1,x2的值

dowhile

(fabs(f

(xx)

)>=

1e-7);

//le-6代表1*10的-6次方,它的值將影響到跟的準確度的問題

printf

("%.2lf\n"

,xx)

;return0;

}

第二種:

#

include

#include

#include

#include

using

namespace std;

doublef(

double x)

double

erfen

(double x1,

double x2,

double

(*p)

(double))

//double (*p)(double)為形參,相當於函式別名

while

(fabs((

*p)(xx)

)>=

1e-7);

//le-7代表1*10的-6次方,它的值將影響到跟的準確度的問題

return xx;

}int

main()

while((

*p)(x1)*(

*p)(x2)

>0)

;//保證f(x1)和f(x2)是異號,這樣才可以進行下一步的精準區間,否則,重新輸入x1,x2的值

printf

("%.2lf\n"

,erfen

(x1,x2,f));

return0;

}

求方程根 (二分法)

二分法求方程的根 求下面方程的乙個根 f x x3 5x2 10x 80 0 若求出的根是a,則要求 f a 10 6 解法 對f x 求導,得f x 3x2 10x 10。由一元二次方程求根公式知方呈f x 0 無解,因此f x 恆大於0。故f x 是單調遞增的。易知f 0 0且f 100 0,所...

二分法求方程根

二分法是計算機上的一種常用演算法,下面列出計算步驟 step1 計算 step2 計算 step3 若 0,則若若 如下 erfen.m 有根區間 a,b 函式 y x 2 2 呼叫了erfenhanshu a 1 b 6 e 10 cnt 0 while e 0.1 cnt cnt 1 fa er...

二分法求方程的根

求下面乙個方程的根 f x x 3 5x 2 10x 80f x x3 5x2 10x 80如果a是方程的根,則要求f a 1e 6f a 1e 6 通過對公式的求導可以發現,導函式開口向上,與x軸沒有交點,那麼導函式的值就是始終大於0的,所以原函式單調遞增 而且已知f 0 0 f 0 0,f 10...