迭代法求平方根

这篇博客介绍了如何使用迭代法求平方根,通过C++代码展示了迭代过程。首先设定初始值x0为a的一半,然后利用迭代公式x1 = (x0 + a/x0) / 2不断更新,直到x0和x1的差值小于1e-6。迭代法是求解方程近似根的一种有效方法,通过不断逼近来获取精确结果。
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
    double a,x0,x1;
    cin>>a;
    if(a<0)
        cout<<"错误"<<endl;
    else
    {
        x0=a/2;
        x1=(x0+a/x0)/2;
        do
        {
            x0=x1;
            x1=(x0+a/x0)/2;
        }
        while(fabs(x0-x1)>=1e-6);
    }
    cout<<x0<<endl;
    return 0;
}

求平方根的迭代公式:x1=1/2*(x0+a/x0)。
算法:1.先自定一个初值x0,作为a的平方根值,在我们的程序中取a/2作为a的初值;利用迭代公式求出一个x1。此值与真正的a的平方根值相比,误差很大。
⒉把新求得的x1代入x0中,准备用此新的x0再去求出一个新的x1.
⒊利用迭代公式再求出一个新的x1的值,也就是用新的x0又求出一个新的平方根值x1,此值将更趋近于真正的平方根值。
⒋比较前后两次求得的平方根值x0和x1,如果它们的差值小于我们指定的值,即达到我们要求的精度,则认为x1就是a的平方根值,去执行步骤5;否则执行步骤2,即循环进行迭代。
迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行:
⑴ 选一个方程的近似根,赋给变量x0;
⑵ 将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;
⑶ 当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤⑵的计算。
若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认
牛顿迭代法平方根的原理是不断用\((x,f(x))\)的切线来逼近方程\(x^2 - a = 0\)的根,其中根号\(a\)就是该方程的一个正实根,此函数导数为\(2x\),函数上任一点\((x,f(x))\)处切线斜率是\(2x\),更接近的近似值为\(x - f(x)/(2x)\),代入\(f(x)=x^2 - a\)可得\((x + a/x)/2\) [^2]。 以\(x^2 = m\)的平方根为例,令\(f(x)=x^2 - m\),则\(f'(x)=2x\),函数\(f(x)\)在\(x_0\)处的切线方程为\(g(x)=f'(x_0)(x - x_0)+f(x_0)\) [^1]。 以下是不同编程语言的实现示例: #### C++ 实现 ```cpp #include <iostream> #include <cmath> double sqrtByNewton(double m, double err = 1e-15) { if (m < 0) return NAN; double x = m; while (std::abs(x - m / x) > err * x) { x = (x + m / x) / 2; } return x; } int main() { double num = 6; std::cout << "The square root of " << num << " is " << sqrtByNewton(num) << std::endl; return 0; } ``` #### Python 实现 ```python def sqrt_by_newton(a, err=1e-15): if a < 0: return float('nan') x = a while abs(x - a / x) > err * x: x = (x + a / x) / 2 return x num = 6 print(f"The square root of {num} is {sqrt_by_newton(num)}") ``` #### Java 实现 ```java public class NewtonSqrt { public static double sqrt(double c) { if (c < 0) return Double.NaN; double err = 1e-15; double t = c; while (Math.abs(t - c / t) > err * t) { t = (c / t + t) / 2; } return t; } public static void main(String[] args) { double num = 6; System.out.println("The square root of " + num + " is " + sqrt(num)); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值