例1.
求平方根
/* 迭代法求一个数的平方根 */
#define Epsilon 1.0E-6
/*控制解的精度 10的-6次方 */
#include<stdio.h>
#include <math.h>
int main()
{
double a,x0,x1;
scanf("%lf",&a);
x0=a/2;
x1=(x0+a/x0)/2; /*算法*/
while(fabs(x1-x0)>=Epsilon)
{
x0=x1;
x1=(x0+a/x0)/2;
}
printf("%f的平方根:%.5f\n",a,x1);
}
#define Epsilon 1.0E-6
/*控制解的精度 10的-6次方 */
#include<stdio.h>
#include <math.h>
int main()
{
double a,x0,x1;
scanf("%lf",&a);
x0=a/2;
x1=(x0+a/x0)/2; /*算法*/
while(fabs(x1-x0)>=Epsilon)
{
x0=x1;
x1=(x0+a/x0)/2;
}
printf("%f的平方根:%.5f\n",a,x1);
}
例2.
编写一个程序,用迭代法求方程x3-x-1=0在区间[0,2]中的根。
二分迭代法的原理:先取方程f(x)=0的两个粗略解 x1和x2,若f(x1)与f(x2)的正负符号相反,则表明区间(x1,x2)中至少有方程的一个解。
如果f(x)在区间(x1,x2)内单调递增或单调递减,则(x1,x2)内只有方程的一个解。
具体做法:取x1,x2的中点x3,计算f(x3)的值。
在x1,x2中去掉函数值与f(x3)同号者(假设f(x2)和f(x3)同号),得到一个由x1和x3构成的区间,这个区间是原来的一半,并且包含精确解。
不断重复(不是无穷多次)上述步骤,可以得到一个序列:x1,x2,x3,…,xn+1,xn,…这个序列的极限便是方程的精确值。
#include <stdio.h>
#include <math.h>
int main()
{
double x1,x2,x3 ;
x1 = 0; x2 = 2 ; // 初始区间
do
{
x3 = (x1 + x2) / 2;
if ((x1 * x1 * x1 - x1 - 1) * (x3 * x3*x3 - x3 - 1) > 0 )
x1 = x3 ; // 改变区间
else
x2 = x3 ; // 改变区间
}
while (fabs(x2-x1)>1e-6); // 判断是否满足精度要求
printf("%.6f",x1); // 输出结果
return 0 ;
}
#include <math.h>
int main()
{
double x1,x2,x3 ;
x1 = 0; x2 = 2 ; // 初始区间
do
{
x3 = (x1 + x2) / 2;
if ((x1 * x1 * x1 - x1 - 1) * (x3 * x3*x3 - x3 - 1) > 0 )
x1 = x3 ; // 改变区间
else
x2 = x3 ; // 改变区间
}
while (fabs(x2-x1)>1e-6); // 判断是否满足精度要求
printf("%.6f",x1); // 输出结果
return 0 ;
}