数值计算方法实验1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学院(系)名称:
)
()
()()
(0101112x x x f x f x f x x ---
=
附录(源程序及运行结果):
一.二分法
#include<stdio.h>
#include<math.h>
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<e){
printf("使用二分法输出:m=%f,k=%d\n",m,k);break;
}
else {if(f(a)*f(m)>0)
a=m;
else b=m;
k=k+1;
}
}
}
}
运行结果:
二.迭代法与牛顿迭代法
#include<stdio.h>
#include<math.h>
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{
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<stdio.h>
#include<math.h>
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;
}
}
}
运行结果:。