C C 二分法實現開平方

2021-10-21 20:05:33 字數 1674 閱讀 5302

1.數學原理

求乙個數c的平方等價於求方程 x2=

cx^ = c

x2=c

的解,方程解的問題可以轉換為函式零點問題。即求函式 f(x

)=x2

−c

f(x) = x^-c

f(x)=x

2−c的零點。

零點定理:若f(a)f(b)<0則∃m∈

\in∈[a,b],有f(m) = 0

由零點定理可知,只需估計a,b的值,令m=(a+b)/2,然後不斷二分就可以得到更加小的區間[a,b]。使得f(m

)≃

0f(m) \simeq 0

f(m)≃0

,此時的m就是所求。

現在問題就是如何選取a,b的值,上述可知:

1.a,b,m必須滿足不等式 a≤m

≤b

a\le m \le b

a≤m≤

b2.由於開方的結果必然為正整數 (即m≥0

m\ge0

m≥0),因此可以取下界 a=0

,有f(

a)=−

c<

0a=0,有f(a) = -c<0

a=0,有f

(a)=

−c<

03.因為f(a)<0,則f(b)>0才有f(a)f(b)<0,所以考慮滿足f(b)>0的點。考慮b=c有,當 c≥1

時,f(

b)=c

2−

c>0可

取,當0

≤c

<1時

f(b)

<0不

符合

c\ge1 時,f(b) = c^-c>0可取,當0\le c<1時f(b) <0不符合

c≥1時,f

(b)=

c2−c

>0可

取,當0

≤c<1時

f(b)

<0不

符合。可見b要取乙個大於c的值,不妨令b = c+k(k>0) 使得 f(b

)=c2

−c+k

>0=

>(c

−12)

2+(k

−14)

>

0f(b) = c^-c+k>0 => (c-\frac) ^+(k-\frac)>0

f(b)=c

2−c+

k>0=

>(c

−21​

)2+(

k−41

​)>0=

>

k>14

=>k>\frac

=>

k>41

​不妨就令k = 0.25 故 b = c+k = c+0.25

2.**實現

#include

#include

#include

#include

#include

//控制精度,也可以直接使用double中定義的常量: dbl_epsilon

#define prescion 0.00001

using

namespace std;

//零點定理二分開平方

double

sqrt

(double c)

return m;

}int

main()

參考文章

基於牛頓法的開平方實現

牛頓法是求解最優問題的一種常用方法。本文主要在實現使用牛頓法進行開平方操作,使用python實現。在開平方求解中,更多的可以參考這篇文章。牛頓法是一種最優化求解方法,在迭代過程中求取到最接近解的值,類似的還有梯度下降等等。這裡主要講解我對該方法的推導,有錯誤之處麻煩指出。首先針對開根號求解,可用以下...

二分法做平方根

注意這裡的浮點數 不然的話程式會報錯 coding utf 8 二分法計算20的平方根 import math a 0.0 多次二分後會變成二分法,所以要設定成浮點數,python裡就是直接賦值成浮點數 b c float raw input enter a number n 100 while t...

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...