📄
字号:
#include "stdio.h"
#include "math.h"
#define epsl (0.5*1e-2)
#define FUNC(x) (pow((x),3)-8*(x)-40)
#define _DATA_FILE "F:\\program\\result\\data.dat"
//对分法要用
double a=4.0,b=6.0;
//小光法要用:
double Ma=(3*6*6-8); // Ma*max>0且|Ma|>=|max|;max为函数导数的最值
//迭代法要用
double x0=5.0;
//加速迭代法要用
double q=0.14;
//牛顿迭代法要用
#define FUNp(x) (3*pow((x),2)-8)
//弦截法要用
double m=6.0,n=4.0;
//典型的对分法
void classicbisection(FILE *fp)
{
fprintf(fp,"典型对分法\n");
double x1,t1=a,t2=b;
while(fabs(t2-t1)>epsl)
{
x1=(t1+t2)/2.0;
if ( (FUNC(x1)*FUNC(t1))<0)
t2=x1;
else
t1=x1;
fprintf(fp,"%f\n",x1);
if(FUNC(x1)==0)
break;
}
fprintf(fp,"\n");
}
//改进型的对分法,适用于给定区间上的单调函数
//设计:诸葛小勇
//设计时间:2007-11-1,谑名"小光"法
//主要参考文献:王海涛、朱洪《改进的二分法查找》
void advancedbisection(FILE *fp)
{
fprintf(fp,"改进型的对分法\n");
double x1,t1=a,t2=b;
double temp1=0,temp2=0;
while(fabs(t2-t1)>epsl&&temp1>=0&&temp2>=0)
{
temp1=-FUNC(t1)/Ma;temp2=FUNC(t2)/Ma;
t1=t1+temp1;t2=t2-temp2;
x1=(t1+t2)/2.0;
if ( (FUNC(x1)*FUNC(t1))<0)
t2=x1;
else
t1=x1;
fprintf(fp,"%f\n",x1);
if(FUNC(x1)==0)
break;
}
fprintf(fp,"\n");
}
//迭代法
void iterative(FILE *fp)
{
fprintf(fp,"迭代法\n");
double xi=x0,xip;
fprintf(fp,"%f\n",xi);
while(true)
{
xip=pow((8*xi+40),(1.0/3.0));
fprintf(fp,"%f\n",xip);
if(fabs(xip-xi)<epsl)
break;
xi=xip;
}
fprintf(fp,"\n");
}
//加速迭代法
void speedupiterative(FILE *fp)
{
fprintf(fp,"加速迭代法\n");
double xi=x0,xip;
fprintf(fp,"%f\n",xi);
while(true)
{
xip=pow((8*xi+40),(1.0/3.0));
xip=xip+(xip-xi)*q/(1-q);
fprintf(fp,"%f\n",xip);
if(fabs(xip-xi)<epsl)
break;
xi=xip;
}
fprintf(fp,"\n");
}
//埃特金加速法
void aitkenspeedup(FILE *fp)
{
fprintf(fp,"埃特金加速法\n");
double xi=x0,xip,xip1,xip2;
fprintf(fp,"%f\n",xi);
while(true)
{
xip1=pow((8*xi+40),(1.0/3.0));
xip2=pow((8*xip1+40),(1.0/3.0));
xip=(xip2*xi-xip1*xip1)/(xip2-2*xip1+xi);
fprintf(fp,"%f\n",xip);
if(fabs(xip-xi)<epsl)
break;
xi=xip;
}
fprintf(fp,"\n");
}
//牛顿迭代法
void newtoniterative(FILE *fp)
{
fprintf(fp,"牛顿迭代法\n");
double xi=x0,xip;
fprintf(fp,"%f\n",xi);
while(true)
{
xip=xi-FUNC(xi)/FUNp(xi);
fprintf(fp,"%f\n",xip);
if(fabs(xip-xi)<epsl)
break;
xi=xip;
}
fprintf(fp,"\n");
}
//单迭代点弦截法
void singlesecant(FILE *fp)
{
fprintf(fp,"单迭代点弦截法\n");
double xiq=m,xi=n,xip;
fprintf(fp,"%f\n%f\n",xiq,xi);
while(true)
{
xip=xiq-FUNC(xiq)*(xi-xiq)/(FUNC(xi)-FUNC(xiq));
fprintf(fp,"%f\n",xip);
if(fabs(xip-xi)<epsl)
break;
xi=xip;
}
fprintf(fp,"\n");
}
//双迭代点弦截法
void doublesecant(FILE *fp)
{
fprintf(fp,"双迭代点弦截法\n");
double xiq=n,xi=m,xip;
fprintf(fp,"%f\n%f\n",xiq,xi);
while(true)
{
xip=xi-FUNC(xi)*(xi-xiq)/(FUNC(xi)-FUNC(xiq));
fprintf(fp,"%f\n",xip);
if(fabs(xip-xi)<epsl)
break;
xiq=xi;
xi=xip;
}
fprintf(fp,"\n");
}
void main()
{
FILE *fp=fopen(_DATA_FILE,"w");
classicbisection(fp);
advancedbisection(fp);
iterative(fp);
speedupiterative(fp);
aitkenspeedup(fp);
newtoniterative(fp);
singlesecant(fp);
doublesecant(fp);
fclose(fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -