牛顿迭代法求数的平方根

牛顿法最初由艾萨克·牛顿流数法Method of Fluxions,1671年完成,在牛顿死后的1736年公开发表)。约瑟夫·拉弗森也曾于1690年在Analysis Aequationum中提出此方法。

方法说明

蓝线表示方程 f而红线表示切线. 可以看出 x n+1x n更靠近 f所要求的根 x.

首先,选择一个接近函数f(x)零点x_0,计算相应的f(x_0)和切线斜率f'(x_0)(这里f'表示函数f导数)。然后我们计算穿过点(x_0, f(x_0))并且斜率为f'(x_0)的直线和x轴的交点的x坐标,也就是求如下方程的解:

f(x_0)= (x_0-x)\cdot f'(x_0)

我们将新求得的点的x坐标命名为x_1,通常x_1会比x_0更接近方程f(x)=0的解。因此我们现在可以利用x_1开始下一轮迭代。迭代公式可化简为如下所示:

x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}

已经证明,如果f'连续的,并且待求的零点x是孤立的,那么在零点x周围存在一个区域,只要初始值x_0位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果f'(x)不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。



设:  f(x)=x2-a=0,求  sqrt(a),使用牛顿迭代法。

 
#include "stdio.h"
#include "math.h"

int main(void)
{
            double n,y=1.0;
	    printf("请输入一个需要求其平方根的数:");
	    scanf("%lf",&n);
	 
	    // 反复代入 x(k+1) = 0.5[x(k)+n/x(k)]
	    while(fabs((1.0/2.0*(y+n/y))-y)>=1e-6)
	    {
	        y=1.0/2.0*(y+n/y);
	        printf( "y=%lf\n", y );
	    }
	    printf("平方根为%f\n",y);
	    return 0;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Penguinbupt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值