这学期我们开了一门计算方法和人工智能算法的课程,其实就是数值分析,所以准备记录以下学过的内容。
计算方法
- 1.非线性方程的求解
(1)二分法,牛顿法,牛顿迭代法,牛顿下山
第一个方法就是二分法,二分法比较容易理解,就是再函数的一个端点异号的区间上多次进行对半分的操作,取中点,再根据中点的函数值确定下一个区间,不断进行,最后达到容差的要求,或者迭代的最大次数的要求。
二分法的特点就是对函数的要求比较低,只需要函数连续即可,不像后面提到的牛顿法对函数和他的一阶导数均有要求。但是二分法的一个显著的缺点就是他的收敛速度非常慢,所以一般用于求初值。精确值再通过其他方法解决即可。
#include<stdio.h>
#include<math.h>
int i=0; int n=0;
double eps=1e-6;
double f(double x){ return exp(x)-2; }
double root[50000];
double erfen(double down,double up)
{
double middle=(down+up)/2;
if(i==100)
{
printf("%lf",middle);
return middle;
}
if(f(down)*f(up)<0)
{
if(f(middle)*f(down)<0)
{
i++;
n++;
root[n]=middle;
return erfen(down,middle);
}
else if(f(up)*f(middle)<0)
{
i++;
n++;
root[n]=middle;
return erfen(middle,up);
}
else if(f(middle)<1e-6)
{
printf("%.18lf",middle);
return middle;
}
}
}
int main(){
FILE*fp;
fp=fopen("out.txt","w");
int a,b;
int p=0;
int y;
scanf("%d%d",&a,&b);
erfen(a,b);
int j=0;
for(j=0;j<i;j++){
fprintf(fp,"%.18lf ",root[j]);
p++;
if(p==5)
{
p=0;
fprintf(fp,"\n");
}
}
return 0;
}
二分法肯定是满足不了需求的所以我们又介绍了定点法
定点法就像生成一个数列,数列的后一项总是前一项的为自变量的函数值
如果这个数列收敛的话,那么函数就一定有零点的。
操作方法就是,把目标函数等于0的式子两边加上x,这样就生成了一个不动点的方程,然后令x为an+1,另一边令为f(an);于是就生成了数列,然后就不断迭代即可。
下面给出核心思想即可
while(fabs(xk-xk+1)<e)
{
xk=xk+1;
xk+1=f(xk);
}
下一篇是牛顿法和牛顿下山法。