数值计算方法实验1
实验报告
学院(系)名称:
1
附录(源程序及运行结果): 一.二分法 #include #include double f(double x){ return x*x-x-1;
}
void main(){ float a=0,b=0,x=1,m,e; int k;
while(f(a)*f(b)>0){
printf("请输入区间a,b 的值。以及精度e\n"); scanf("%f,%f,%f",&a,&b,&e); } k=0;
if(f(a)*f(b)==0){ if(f(a)==0) printf("使用二分法输出:a=%f,k=%d\n",a,k);
else
printf("使用二分法输出:b=%f,k=%d\n",b,k); } else{ while(f(a)*f(b)!=0){ m=(a+b)/2; if(fabs(a-b)/2
}
else {if(f(a)*f(m)>0)
a=m; else b=m; k=k+1; }
}
}
}
运行结果:
二.迭代法与牛顿迭代法 #include #include
double f(double x){return exp(-x);} double f1(double x){return (x*exp(x)-1);} double ff(double x){return (exp(x)+x*exp(x));} void diedaifa(double x0,double e,int N){ double x1; int k=1; while(k!=N){ x1=f(x0);
if(fabs(x1-x0)>=e){ k++; if(k==N)
printf("迭代失败!\n"); x0=x1;
} else{ printf("使用迭代法输出结果:%lf\n",x1);break; } }
}
void NDdiedaifa(double x0,double e,int N){ int k=1; double x1; while(k!=N){ if(ff(x0)==0) printf("公式f(x)奇异!\n");
else{
3
x1=x0-f1(x0)/ff(x0); if(fabs(x1-x0)>=e){ k++; if(k==N)
printf("迭代失败!\n"); x0=x1;
} else{ printf("使用牛顿迭代法输出结果:%lf\n",x1);break; }
}
} }
void main(){ double x0,e; int N;
printf("请输入初值:"); scanf("%lf",&x0); printf("精度:"); scanf("%lf",&e);
printf("以及判定迭代失败的最大次数N :"); scanf("%d",&N); diedaifa(x0,e,N); NDdiedaifa(x0,e,N); }
运行结果:
四. 双点弦截法 #include #include
double f(double x){return (x*x*x+3*x*x-x-9);} void main(){ double x0,x1,x2,e; int N; int k=1;
printf("请输入初值x0和x1:"); scanf("%lf,%lf",&x0,&x1); printf("精度:"); scanf("%lf",&e);
printf("以及判定迭代失败的最大次数N :"); scanf("%d",&N); while(k!=N){ x2=x1-f(x1)*(x1-x0)/(f(x1)-f(x0)); if(fabs(f(x2))>=e){ k++; if(k==N)
printf("迭代失败!\n"); x0=x1; x1=x2;
} else{ printf("使用双点弦截法输出结果:%lf\n",x2);break; } }
}
运行结果:
4