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...