圖解- 牛頓迭代法求平方根

import matplotlib.pyplot as plt
import numpy as np
x1 = np.linspace(-32, 32, 256)
fx = 2 * x1  # 函數(shù)定義
y1 = 0 * x1 # x軸

# f(x) = f(xi) + f'(xi)(x - xi) 其實(shí)f'為導(dǎo)函數(shù)
f2 = (x1 * x1)-16
xi = 7.8 #第一次迭代隨機(jī)7.8位置
t1 = ((xi * xi) - 16) + 2 * xi * (x1 - xi)

xi=4.9 #第二次迭代為前一次切線與x軸交點(diǎn)
t2 = ((xi * xi) - 16) + 2 * xi * (x1 - xi)

xi=4.1 #第三次迭代為第二次切線與x軸交點(diǎn)
t3 = ((xi * xi) - 16) + 2 * xi * (x1 - xi)

xi=4 #第四次迭代為第三次切線與x軸承交點(diǎn)
t4 = ((xi * xi) - 16) + 2 * xi * (x1 - xi)

plt.figure()
plt.title('y=pow(x,2)')
plt.xlabel('x')
x_ticks = np.arange(-16, 16, 2)
x_label_ticks = [('{}'.format(x)) for x in x_ticks]
plt.xticks(x_ticks, x_label_ticks)
y_ticks = np.arange(-16, 16, 2)
y_label_ticks = [('{}'.format(y)) for y in y_ticks]
plt.yticks(y_ticks, y_label_ticks)
plt.ylabel('y')
plt.plot(x1, fx, label="line f'(x)")
plt.plot(x1, t1, label="line 7.8")
plt.plot(x1, t2, label="line 4.9")
plt.plot(x1, t3, label="line 4.1")
plt.plot(x1, t4, label="line 4.0")
plt.plot(x1, y1, label="y=0")
plt.plot(x1, f2, label="f(x)")

plt.grid(True)
plt.legend(loc="upper left")
plt.axis([-16, 16, -16, 16])
plt.show()
image.png

https://leetcode-cn.com/problems/sqrtx/submissions/

二分查找實(shí)現(xiàn)大于平方根的最小值

  public int mySqrt(int x) {
                //為提高性能特殊判斷 x/2    
                if(x==1){
                    return 1;
                }

                int l = 0, r = x/2,mid=-1;
                //int 相乖可能溢出
                long sqrt=0;
                while (l <= r) {
                    //mid 計(jì)算邏輯一致
                    mid = l + (r - l) / 2;
                    sqrt=(long)mid*mid;
                    if(sqrt==x){
                        //如果找到直接返回
                        return mid;
                    }
                    if (sqrt < x) {
                        //這里是mid -1
                        l = mid + 1;
                    } else {
                        r = mid - 1;
                    }
                }
                //取比當(dāng)前值小的最大平方根
                return sqrt<x?mid:mid-1;
    }

牛頓迭代法

  1. 原函數(shù)為f(x)=pow(x,2)
  2. 導(dǎo)函數(shù)為f'(x)=2x
  3. 在原函數(shù)隨機(jī)采點(diǎn)(x0,y0) ,在該點(diǎn)求導(dǎo)炕横,即過該點(diǎn)斜率,并導(dǎo)出該點(diǎn)的切線方程
  4. 已知切線為一條直線,根據(jù)切線定義與原函數(shù)曲線有且只有一個(gè)交點(diǎn)椿肩,即(x0,y0), 由導(dǎo)數(shù)定義可知,過該點(diǎn)的切線斜率為導(dǎo)數(shù)
    f'x=2x=2x_0
    5.在直接線任取一點(diǎn)(x,y) 玩讳,由(4)導(dǎo)出切線方程為
    f'(x) =(y-y_0)/(x-x_0) \Rightarrow \\ y-y_0=f'(x)*(x-x_0) \Rightarrow \\ y=f'(x)*(x-x_0)+y_0\\

6.求出切線方程與x軸交點(diǎn)输枯,即y=0時(shí)
\because f'(x)=2x=2x_0; y_0=x_0^2-n \\ \therefore y=2x_0*(x-x_0)+(x_0^2-n) \\令y=0時(shí)有\(zhòng)\ 2x_0*(x-x_0)+(x_0^2-n)=0\Rightarrow\\ 2x_0x-2x_0^2+x_0^2-n=0 \Rightarrow\\ 2x_0x-x_0^2-n=0 \Rightarrow\\ 2x_0x=x_0^2+n \Rightarrow\\ x= \frac{(x_0^2+n)}{2x_0} \Rightarrow\\ x= \frac{x_0^2}{2x_0}+\frac{n}{2x_0}\Rightarrow\\ x= \frac{1}{2}*(x_0+\frac{n}{x_0})

  1. 求出切線與x軸交點(diǎn)后,代入原函數(shù)求y 生成新的(x0,y0),過該點(diǎn)求新的切線方程券坞,反復(fù)迭代直至收斂鬓催,即
    x-x_0 < \epsilon


class Solution {
        public int mySqrt(int n) {
                if(n==0){
                    return 0;
                }
                double x0 = n / 2F;
                double x;
                while (true) {
                    x = x0;
                    //x0= (x0*x0+n)/(2*x0) //注意 (x0*x0+n)/2*x0 一定要加()
                    x0 = 0.5 * (x0 + n / x0);
                    //x0 = -(x0 * x0 - n) / (2 * x0) + x0;
                    if (x - x0 <1e-7) {
                        break;
                    }
                }
                return (int)x0;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市恨锚,隨后出現(xiàn)的幾起案子宇驾,更是在濱河造成了極大的恐慌,老刑警劉巖猴伶,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件课舍,死亡現(xiàn)場離奇詭異,居然都是意外死亡他挎,警方通過查閱死者的電腦和手機(jī)筝尾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來办桨,“玉大人筹淫,你說我怎么就攤上這事∧刈玻” “怎么了损姜?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長殊霞。 經(jīng)常有香客問我摧阅,道長,這世上最難降的妖魔是什么脓鹃? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任逸尖,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘娇跟。我一直安慰自己岩齿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布苞俘。 她就那樣靜靜地躺著盹沈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吃谣。 梳的紋絲不亂的頭發(fā)上乞封,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機(jī)與錄音岗憋,去河邊找鬼肃晚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仔戈,可吹牛的內(nèi)容都是我干的关串。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼监徘,長吁一口氣:“原來是場噩夢啊……” “哼晋修!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凰盔,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤墓卦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后户敬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體落剪,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年山叮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了著榴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屁倔,死狀恐怖脑又,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锐借,我是刑警寧澤问麸,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站钞翔,受9級特大地震影響严卖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜布轿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一哮笆、第九天 我趴在偏房一處隱蔽的房頂上張望来颤。 院中可真熱鬧,春花似錦稠肘、人聲如沸福铅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滑黔。三九已至,卻和暖如春环揽,著一層夾襖步出監(jiān)牢的瞬間略荡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工歉胶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汛兜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓通今,卻偏偏與公主長得像序无,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子衡创,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容