1. 程式人生 > >sqrt函式實現——二分法、牛頓迭代法

sqrt函式實現——二分法、牛頓迭代法

在leetcode練習時,碰到一道經典的面試題,如何實現sqrt()開平方函式。當然,很簡單的是呼叫系統函式,但是難道不能自己實現這個函式的功能嗎?於是一番思索和查閱資料,看到下面的方法。

二分法求解

二分法這個應該很熟悉,在二分查詢演算法中就有具體的體現。應用在此題上,也是合適不過的。
首先分析一下這道題:
實現sqrt函式功能,求一個數的開平方,即求f(x)=x2Nf(x) = x^2 - N這個函式f(x)=0f(x) = 0的非負解。

  • 原理
    二分法的原理很簡單,就是通過縮減區間來確定解的位置。通過圖來說明:
    二分法
  • 實現步驟
    • 選擇區間[a, b],f(a)與f(b)異號。
    • 獲得區間中值mid,以及f(mid)值。
    • 若f(a) * f(mid) < 0,即f(a)與f(mid)異號,取新區間[a, mid]。相反,取區間[mid, b]。
    • 重複上兩步操作,直到達到型別精度停止。
  • 程式碼實現
int BisectionSqrt(int x)
{
	double low = 0, high = x + 0.25, mid = (low + high) / 2;
	while (mid - low > DBL_EPSILON && high - mid > DBL_EPSILON)  // 精度
	{
		if ((mid * mid - x) * (low * low - x) < 0)
			high = mid;
		else low = mid;
		mid = (high + low) / 2;
	}
	return int(mid);
}

注:

初始上界為x + 0.25,而非x。(這一點我不是很懂,希望大佬指點)

牛頓迭代法

看概念:
又稱為牛頓-拉弗森方法(英語:Newton-Raphson method),它是一種在實數域和複數域上近似求解方程的方法。方法使用函式f(x)f(x)的泰勒級數的前面幾項來尋找方程 f(y)=0f(y) = 0的根。
可以看出滿足上面的題目分析,可以求得根。

  • 原理步驟
    選擇一個接近函式f(x)f(x)零點的 x0x_0,計算相應的f(x0)f(x_0)和切線斜率 f(x0)f&#x27;(x_0)(這裡ff&#x27;表示函式 ff的導數)。然後我們計算穿過點 f(x0)f(x_0)並且斜率為f(x0)f&#x27;(x_0)的直線和xx軸的交點的x座標,也就是求如下方程的解:
    0=(xx0)f(x0)+f(x0)0 = (x - x_0) * f&#x27;(x_0) + f(x_0)
    我們將新求得的點的xx座標命名為 x1x_1,通常x1x_1會比 x0x_0更接近方程 f(x)=0f(x)=0的解。因此我們現在可以利用x1x_1開始下一輪迭代。迭代公式可化簡為如下所示:
    xn+1=xnf(xn)f(xn)x_{n+1} = x_n - \frac{f(x_n)}{f&#x27;(x_n)}
  • 圖示
    niudun
    將上述的迭代式進行化簡:
    因為要求的是開平方的解,所以f(xn)f&#x27;(x_n)2xn2x_n,同時將f(xn)=xn2Nf(x_n) =x_n^2 - N帶入公式xn+1=xnf(xn)f(xn)x_{n+1} = x_n - \frac{f(x_n)}{f&#x27;(x_n)}中,可以化簡得到:xn+1=(xn+N/xn)/2x_{n+1} = (x_n + N/x_n) / 2
  • 程式碼實現
int NewtonSqrt(int x) {
	if (x == 0) return 0;
	double result = 1, pre = 0;
	while (result != pre)
	{
		pre = result;
		result = (result + x / result) / 2;
	}
	return int(result);
}

相關推薦

sqrt函式實現——二分牛頓

在leetcode練習時,碰到一道經典的面試題,如何實現sqrt()開平方函式。當然,很簡單的是呼叫系統函式,但是難道不能自己實現這個函式的功能嗎?於是一番思索和查閱資料,看到下面的方法。 二分法求解 二分法這個應該很熟悉,在二分查詢演算法中就有具體的體現。應用

梯度下降座標下降牛頓

1 梯度下降法 2 座標下降法 1.首先給定一個初始點,如 X_0=(x1,x2,…,xn); 2.for x_i=1:n 固定除x_i以外的其他維度 以x_i為自變數,求取使得f取得最小值的

二分牛頓求平方根(Python實現)

求一個數的平方根函式sqrt(int num) ,在大多數語言中都提供實現。那麼要求一個數的平方根,是怎麼實現的呢? 實際上求平方根的演算法方法主要有兩種:二分法(binary search)和牛頓迭代法(Newton iteration) 1:二分法 求根號5 a:折半

方程求根(二分牛頓

一、實驗內容 以方程:x3-0.2x2-0.2x-1.2=0為例,編寫程式求方程的根 編寫二分法、迭代法、牛頓法程式,分析執行結果 二、程式碼(python) import matplotlib.pyplot as plt #計算原函式值 de

【數值分析】解方程:牛頓Jacobi

牛頓迭代公式 設已知方程f(x)=0的近似根x0 ,則在x0附近f(x)可用一階泰勒多項式近似代替.因此, 方程f(x)=0可近似地表示為p(x)=0。用x1表示p(x)=0的根,它與f(x)=0的根差異不大. 設 ,由於x1滿足解得 重複這一過程,得到迭代公式:  

快速求解方程的根——二分牛頓

本文始發於個人公眾號:**TechFlow**,原創不易,求個關注 今天是週四高等數學專題的第7篇文章。 之前的文章和大家聊了許多數學上的理論,今天和大家聊點有用的東西。 我們都知道,工業上的很多問題經過抽象和建模之後,本質還是數學問題。而說到數學問題就離不開方程,在數學上我們可以用各種推算、公式,但是

牛頓實現平方根函式sqrt

 給定一個正數a,不用庫函式求其平方根。        設其平方根為x,則有x2=a,即x2-a=0。設函式f(x)= x2-a,則可得圖示紅色的函式曲線。在曲線上任取一點(x0,f(x0)),其中x0≠0那麼曲線上該點的切線方程為                              (1-1)

【R語言-20行程式碼】牛頓求伽馬函式極大似然估計的引數估計

簡述 研究了下計算公式,簡化了一下,用r語言實現了。 演算法解釋 牛頓迭代法 x

c++ 牛頓求根原始碼(c++函式有多個不同型別返回值的處理方法)

#include <iostream> #include<cmath> using namespace std; struct result { double x;

牛頓解非線性方程matlab實現

1.功能本程式採用牛頓法,求實係數高次代數方程f(x)=a0xn+a1xn-1+…+an-1x+an=0 (an≠0)(1)的在初始值x0附近的一個根。2.使用說明(1)函式語句Y=NEWTON_1(A,N,X0,NN,EPS1) 呼叫M檔案newton_1.m。(2)引數

求解一元多次方程的兩種方法:牛頓二分

求解方程x*x*x-2*x-1=0,C語言實現 一:牛頓迭代法,牛頓迭代法是從泰勒公式中取前兩項構成線性近似方程,從x0開始,一步一步接近近似解,直到誤差在限定範圍內。 //牛頓迭代法求求解方程的根 #include <stdio.h> #include &l

求平方根(根號n)的兩種演算法——二分牛頓

面試阿里口碑的時候遇到了這個問題,這裡做個筆記1.二分法#define eps 0.00001 float SqrtByDichotomy(float n) { if (n < 0) { return -1.0; } else { float low,

@演算法 - [email protected] 牛頓的應用——多項式開方,對數,指數,三角與冪函式

目錄 @0 - 參考資料@ @0.5 - 多項式平方根@ @1 - 牛頓迭代法@ @數學上的定義@ @對於多項式的定義@ @2 - 牛頓迭代的應用@ @重新推導 - 多項式逆元@ @重新推導 - 多項式平方根@ @多項式對數函式@

梯度下降牛頓,高斯-牛頓,附程式碼實現

---------------------梯度下降法------------------- 梯度的一般解釋: f(x)在x0的梯度:就是f(x)變化最快的方向。梯度下降法是一個最優化演算法,通常也稱為最速下降法。 假設f(x)是一座山,站在半山腰,往x方向走1米,高度上

數位電路設計之牛頓計算除法的verilog實現

        牛頓迭代法(Newton's method)又稱為牛頓-拉夫遜(拉弗森)方法(Newton-Raphson method),它是牛頓在17世紀提出的一種在實數域和複數域上近似求解方程的方法。多數方程不存在求根公式,因此求精確根非常困難,甚至不可能,從而尋找

C語言實現牛頓解方程

利用迭代演算法解決問題,需要做好以下三個方面的工作: 一、確定迭代變數 在可以用迭代演算法解決的問題中,我們可以確定至少存在一個可直接或間接地不斷由舊值遞推出新值的變數,這個變數就是迭代變數。 二、建立迭代關係式 所謂迭代關係式,指如何從變數的前一個值推出其下一

多元函式牛頓

f(X)=f(X0)+f′(X0)ΔX+12(ΔX)Tf″(X0)ΔXf(X)=f(X0)+f′(X0)ΔX+12(ΔX)Tf″(X0)ΔX 於是 f′(X)=f′(X0)+f″(X0)ΔXf′(X)

牛頓求平方根立方根

牛頓迭代公式 平方根迭代公式:a(n+1)=( a(n) + num/a(n) )/2,a(0) 初始化為1; 立方根迭代公式:a(n+1)=( 2a(n) + num/( (a(n))^2 )

牛頓實現開根號

理解:實現:根據牛頓迭代的原理,可以得到以下的迭代公式:X(n+1)=[X(n)+p/Xn]/2一般性的程式設計方法如下:double sqr(double n) { double k=1.0; while(abs(k*k-n)>1e-9) { /

牛頓計算附息式國債的收益率(matlab函式版)

用牛頓迭代法計算附息式國債的收益率(matlab函式版) main函式 %main.m clear; a=155.45; b=11.83; d=100.0; k=6; e=0.85; f=1