x 的平方根

工程优化 牛顿迭代法

牛顿迭代法是用来求一个函数的极小值点

即一阶导等于0

将f(x)在x0处泰勒展开

$$ f(x)=f(x0)+f'(x0)(x-x0)+\frac{1}{2} f''(x0)(x-x0)^2+o(x-x0) $$

$$ f'(x) = f'(x0)+f''(x0)(x-x0) $$

解 $$ f'(x)=0 $$

即 $$ f'(x) = f'(x0)+f''(x0)(x-x0)=0 $$

$$ x=x0-\frac{f'(x0)}{f''(x0)} $$

这样不断迭代知道你想要的精度即可

题目:

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例 1:

输入:x = 4 输出:2 示例 2:

输入:x = 8 输出:2 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

提示:

0 <= x <= 2^31 - 1

思路:

可知题目是求下面的式子:

$$ x^2=C $$

即 $$ x^2-c=0 $$

牛顿迭代法是让一阶导等于0,那么我们不妨认为上式就是原目标函数的一阶导,那么原函数是

$$ f(x)=\frac{1}{3}x^3-cx+d $$

d 为常数

可知

$$ f'(x)=x^2-C $$

$$ f''(x)=2x $$

可知求解的公式是

$$ x=x0-\frac{f'(x0)}{f''(x0)}=x0-\frac{x^2-C}{2x} $$

我们为了要求那个整数,那么我们终止条件就是接近目标位置的距离小于1即可

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<string.h>
#include<map>
using namespace std;

class Solution {
public:
    int mySqrt(int x) {
        double ans = 1, t=1;
        while (abs(t) > 0.1)
        {
            t = (ans * ans - x) / (2 * ans);
            ans = ans - t;
        }
        return int(ans);
    }
};

int main()
{
    //freopen("D:/c++/dev-data/in.txt", "r", stdin);
    /*int nums[] = { 1,0,1 };
    vector<int> v_nums;
    for (int i = 0; i != 3; i++)v_nums.push_back(nums[i]);*/
    int x = 4;
    Solution s;
    int ans=s.mySqrt(x);
    cout << ans << endl;
    return 0;
}
文章目录