对于给定的正整数 c,应用牛顿法解二次方程
x 2 − c = 0 x^{2} - c = 0 x2−c=0
可导出求开方值 c \sqrt{c} c 的计算公式
x k + 1 = 1 2 ( x k + c x k ) x_{k+1}=\frac{1}{2} (x_{k}+\frac{c}{x_{k}}) xk+1=21(xk+xkc)
设 xk 是 c \sqrt{c} c 的某个近似值,则 c x k \frac{c}{x_{k}} xkc 自然也是一个近似值,计算公式表明,它们两者的算术平均值将是更好的近似值。
例:应用牛顿法求根号 115 \sqrt{115} 115 的值。取迭代初值 x₀ = 10,精度要求为 10-6。
运行示例:
程序源码:
#include <iostream>
#include <cmath>
using namespace std;
/**
* f(x) = x^2 - c
*/
double f(double x, int c)
{
return pow(x, 2) - c;
}
/**
* f1(x) = f(x)' = 2x,即 f(x) 的一阶导数
*/
double f1(double x)
{
return 2 * x;
}
int main(void)
{
double x0;
cout << "请输入迭代初值:";
cin >> x0;
int c;
cout << "请输入常数项 c:";
cin >> c;
c = abs(c);
double accuracy;
cout << "请输入精度:";
cin >> accuracy;
int N;
cout << "请输入最大迭代次数:";
cin >> N;
// 迭代次数
int count = 0;
// x0 的下一次迭代值
double x1;
do
{
count++;
if (count > N)
{
cout << "达到允许的最大迭代次数!迭代结束!" << endl;
break;
}
if (f1(x0) == 0)
{
cout << "在 x0 附近 f(x) 的一阶导数值为 0,不适用牛顿法求方程的根!" << endl;
break;
}
x1 = x0 - f(x0, c) / f1(x0);
cout << "第 " << count << " 次迭代,方程的近似根为:" << x1 << endl;
// 交换 x0 与 x1 的值,便于进行下一次迭代
double temp = x1;
x1 = x0;
x0 = temp;
} while (abs(x1 - x0) > accuracy);
return 0;
}