(1)迭代法:迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法,即一次性解决问题。迭代法又分为精确迭代和近似迭代。“二分法”和“牛顿迭代法”属于近似迭代法。迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。
其中牛顿迭代法:
例子:
//牛顿迭代法求根问题
//a*x*x*x+b*x*x+c*x+d=0#include<stdio.h>
#include<math.h>
int main()
{
double Handler(double ,double,double,double); //函数声明
double a,b,c,d,x;
printf("请输入a,b,c,d的值:\n");
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
printf("%10.7f\n",Handler(a,b,c,d));
return 0;
}
double Handler(double a,double b,double c,double d)
{
double x0,x=1.5,f,f1;
do{
x0=x;
f=a*x*x*x+b*x*x+c*x+d;
f1=3*a*x*x+b*2*x+c;
x=x0-f/f1;
}while(fabs(x-x0)>1e-6); //精度为1e-6
return x;
}
(2)二分法求根
<1>如果要求已知函数 f(x) = 0 的根 (x 的解),那么先要找出一个区间 [a, b],使得f(a)与f(b)异号。根据介值定理,这个区间内一定包含着方程式的根。
<2>求该区间的中点m=(a+b)/2,并找出 f(m) 的值。
<3>若f(m)与 f(a) 正负号相同,则取 [m, b] 为新的区间, 否则取 [a, m]。重复第3步和第4步,直到得到理想的精确度为止。
//a*x*x*x+b*x*x+c*x+d=0
#include<stdio.h>
#include<math.h>
double a,b,c,d;
double fun(double);
int main()
{
double m,n,i;
int flag=0; //零值标志位
printf("请输入a,b,c,d的值:\n");
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
printf("请输入m,n的值:\n");
scanf("%lf %lf",&m,&n); //区间[m,n]
if(fun(m)*fun(n)<0)
{
while(fabs(n-m)>1e-6)
{
i=(n+m)/2.0;
printf("[%lf,%lf]\n",m,n);
if(fabs(fun(i))<=1e-6) //如果取值的函数可以认为是零点,跳出
{
flag=1;
break;
}
else if(fun(i)*fun(m)<0)
n=i;
else if(fun(i)*fun(n)<0)
m=i;
else
printf("此函数不是单调函数,无法进行二分法求解\n");
}
}
else
printf("此函数在[m,n]区间内不是单调函数,无法进行二分法求解\n");
if(flag==1)
i=i;
else
i=(m+n)/2.0;
printf("%lf,%lf\n",m,n);
printf("函数近似值为:%10.7f\n",i);
return 0;
}
double fun(double x)
{
double value;
value=a*x*x*x+b*x*x+c*x+d;
return value;
}