文档介绍:牛顿迭代法求√d
定理1 假设函数f (x)在有限区间[a , b]上有二阶导数,且满足条件:(1) f(a)f(b) < 0
(2) f’(x)≠0, x∈[a , b]
(3) f’’(x)在[a , b]上不变号
(4)∣f (a)/ f ’(a)∣< b-a , ∣f (b)/ f ’(b)∣< b-a
则Newton法x(k+1)=x(k)-f (x)/ f ’(x),k=0,1,2…产生的序列{x(n)}对任意的初始值x(0)∈[a , b]都收敛于方程f (x)=0在区间(a , b)内的唯一解p, 收敛阶数为2.
我们可以用Newton法计算平方根√d ,d > 0.
令f (x) = x ^ 2-d , x >0. 求平方根d的问题便化为求方程f (x) = 0的根。此时,Newton迭代公式为
x(k+1)= x(k)-( x ^ 2- d)/(2x(k))=1/2(x(k)+d/x(k)) ,
k=0, 1, 2 …(*)
例证明对于任意的初始值x(1)>0, 由迭代公式(*)产生的序列
{x(k)}都收敛于√d ,并且收敛阶为2.
证明取a, b使0< a <√d < b , 我们验证此定理的条件成立。
由于(b – a)^ 2 >0 ,因此有b^2 - 2ab + d > 0.
从而有-(b-a)< f (b)/ f ’(b) = (b^2-d)/(2b) < b – a.
显然f (a)/ f ’(a) = (a^2 - d)/(2a) < b – a.
为了使(a^2 -d)/(2a) >-(b -a)只需取b > 1/2( a + d/a).
而1/2( a + d/a)≥√d ,因此,取b > 1/2( a + d/a) 时,仍有b>√d .
这样,对于所选取的区间[a, b],其中0 < a <√d, b > 1/2( a + d/a).
定理1中的条件(4)成立。易知条件(1),(2)和(3)也成立。
根据定理1知,迭代法(*)对于任意的初始值x(0)∈[a, b]都收敛,且收敛阶数为2.
由于a可取得任意小,因此对任意的初始值x(0) > 0,由迭代公式(*)产生的序列{x(k)}都收敛于√d。
算法介绍:
输入x 的精度要求e。迭代初x1。迭代次数的i最大值maxi。
for(i=0;i<maxi)
把本次迭代初值x1暂存在x0中。
本次结果x1=x0-f(x0)/f’(x0).
判断|x1-x0|<e
是
否
判断i<maxi
是
否
输出方程f(x)=0的根。
迭代次数超过上限,异常退出。
计算平方根
#include<>
#include<>
main()
{
double e,x0,x1,d;
longi,maxi;
printf("\n请输入d的值(d>=0):");
scanf("%lf",&d);
getchar();
printf("\n请输入x的精度要求:");
scanf("%lf",&e);
getchar();
printf("\n请输入迭代初值:");
scanf("%lf",&x1);
getchar();
printf("\n请输入最大迭代次数: