数学和计算机的结合——牛顿法求一个数的平方根
1. 数学真题:求2的平方根的近似值
题目来源:2017 北京市朝阳区初一(下)期末,第26题
(1) 下面是小李探索 的近似值的过程,请补充完整:
我们知道面积是2的正方形的边长是,且 .设 ,可画出如下示意图.
由面积公式,可得 .
略去,得方程 .
解得,即 .
(2)仿照上述方法,利用(1)的结论,再探究一次,使求得的 的近似值更加准确.(画出示意图,标明数据, 并写出求解过程)
2. 数学探索
继续探索,求通用公式,找到类似牛顿法的公式。
3. 牛顿迭代法
3.1 牛顿迭代法简介
备注:需要用到切线、导数知识,初中生仅供粗略知晓
牛顿迭代法(Newton’s method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。牛顿迭代法是求方程根的重要方法之一。另外该方法广泛用于计算机编程中。
设是的根,选取作为初始近似值,过点做曲线的切线,的方程为,求出L与x轴交点的横坐标 ,称为的一次近似值。
过点做曲线的切线,并求该切线与x轴交点的横坐标 ,称2为的二次近似值。重复以上过程,得r的近似值序列,其中
称为的次近似值,上式称为牛顿迭代公式。
3.2 牛顿迭代法在求平方根中的应用
对于一个数字的根式,我们可以表示成 ,即,对应的 。取导数得。
根据牛顿迭代的原理,可以得到以下的迭代公式:
3.3 求平方根的过程示例
求n的平方根,先随便取一个不是0的数作为迭代开始的,例如最简单的,然后反复代入求得下一个,代入次数越多解约精确。
例如,以下仅保留7位小数为例,5的平方根(2.2360680):
就这样,反复代入上式计算,得到的值越来越精确。
3.4 计算机编程:求平方根(牛顿法)
求num的平方根的c++示例:
#include <iostream>
#include <iomanip>
using namespace std;
double sqr(double num)
{
double k = 1.0;
while (abs(k * k - num) > 1e-9)
{
k = (k + num / k) / 2;
}
return k;
}
int main()
{
//2.2360680
cout << setiosflags(ios::fixed) << setprecision(7) << sqr(5) << endl;
return 0;
}
4. 计算机编程:求平方根(二分法)
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
double binary_search_sqrt(int num)
{
double left = 0, right = num;
double result = (left + right) / 2;
double diff = result * result - num;
while (abs(diff) > 1e-9)
{
if (diff > 0)
{
right = result;
}
else
{
left = result;
}
result = (left + right) / 2;
diff = result * result - num;
}
return result;
}
int main()
{
//num>1
int n;
cin >> n;
cout << "binary_search:" << setiosflags(ios::fixed) << setprecision(12) << binary_search_sqrt(n) << endl;
cout << "cmath :" << setiosflags(ios::fixed) << setprecision(12) << sqrt(n) << endl;
}
思考:形式上看,在求根式这个特例上,牛顿法和二分法是不是很相像?都是取两个数的平均值,但是牛顿法对于第二个数的取法更加巧妙,用来快速接近,同时不用考虑差异的符号。