迭代法求平方根 c 迭代法求平方根

用迭代法求某数a的平方根。已知求平方根的迭代公式为:x n+1 = (xn + a / xn) / 2

要求前后两次求出的差的绝对值小于10-5。

算法如下:

① 设定一个x的初值x0 ; (在如下程序中取x0=a/2, 通过迭代公式求出x1,可以肯定与真正的平方根相比,误差很大。)

② 用上述公式求出x的下一个值 x1 ;

③ 如此继续下去,直到前后两次求出的x值(x n+1和xn)满足以下关系:|x n+1-xn|<10-5 .

#include <stdio.h>

#include <math.h>

int main()

{

float a; /* 被开方数 */

float x0, x1; /* 分别代表前一项和后一项 */

printf("Input a positive number:n");

scanf("%f", &a);

x0 = a / 2; /* 任取初值 */

x1 = (x0 + a / x0) / 2;

while (fabs(x1 - x0) >= 1e-5)

{

x0 = x1;

x1 = (x0 + a / x0) / 2;

}

printf("The square root of %5.2f is %8.5fn", a, x1);

return 0;

}

运行结果:

=====================================

Input a positive number:

2↙

The square root of 2.00 is 1.41421

=====================================

★ 其中初值是任取的(这里取的a/2) , 试将x0初值换为任意数均可得到如上结果。只是迭代的次数有差异。

★ 另外,考虑到while与do-while的差别,此程序用while结构,那是否会出现第一次判断条件时就不成立呢,即不会执行循环体。验证如下:设被开方数a为4,x0 初值为2,则由迭代公式可得x1值为2,x1=x0 值应该为0, 此时应该不会执行循环体,那么结果是否还是正确的呢? 验证如下:

#include <stdio.h>

#include <math.h>

int main()

{

float a;

float x0, x1;

printf("Input a positive number:n");

scanf("%f", &a);

x0 = 2;

x1 = (x0 + a / x0) / 2;

printf("x0=%f x1=%f x1-x0=%fn", x0, x1, x1-x0);
迭代法求平方根 c  迭代法求平方根

while (fabs(x1 - x0) >= 1e-5)

{

x0 = x1;

x1 = (x0 + a / x0) / 2;

printf("x1=%fn", x1); /*若条件成立,则会循环输出 */

}

printf("The square root of %5.2f is %8.5fn", a, x1);

return 0;

}

运行结果: (没有输出循环体中的内容)

===============================================

Input a positive number:

4↙

x0=2.000000 x1=2.000000 x1-x0=0.000000

The square root of 4.00 is 2.00000

===============================================

★ 若被开方数 a 为9, 初值为3, 情况与以上类似, 都不满足条件, 没有进入循环体运行, 但结果都是正确的。原因(我猜)是在做如上假设时,x1经一次迭代后已经就是正确的结果了, 而不需要再做第二次迭代,那么是否执行循环体也就无所谓了。这应该和这种迭代方法的由来有点关系,我猜。

  

爱华网本文地址 » http://www.aihuau.com/a/25101012/137983.html

更多阅读

GBDTMART 迭代决策树入门教程|简介 mart gbdt

在网上看到一篇对从代码层面理解gbdt比较好的文章,转载记录一下: GBDT(GradientBoostingDecisionTree)又叫MART(MultipleAdditiveRegressionTree),是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的结论累加起来做最终答案。它

转载 用SOR方法解方程组计算方法matlab matlab中sor迭代法

原文地址:用SOR方法解方程组计算方法matlab作者:不再彷徨function [Lw,f]=fifth1(A,b)%输入方程左端系数和右端向量,输出SOR方法的迭代矩阵,%及另一个系数s=size(A);%方程组左端系数矩阵的大小ss=size(b);f=zeros(ss(1),ss(2));%定义一

Struts迭代器iterator 遍历List常用的4种例子 struts2迭代器

【摘要】本文主要介绍及演示了Struts迭代器(iterator)遍历List常用的4种例子,基于MyEclipse开发环境,重点关注前后端代码的实现,给出后端java代码、前段struts标签代码,主要有如下4个例子:1.遍历List<String>2.遍历List<List<String>>3.遍

声明:《迭代法求平方根 c 迭代法求平方根》为网友男人必须傲分享!如侵犯到您的合法权益请联系我们删除