西安电子科技大学出版社计算方法上机答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安电子科技大学出版社《计算方法》任传祥等编著第九章计算方法上机参考答案
实验一,算法一
#include <stdio.h>
#include <math.h>
double I0=log(6)/log(5),I1;
int n=1;
main ()
{
while(1)
{
I1=1.0/(n)-I0*5.0;
printf("%d %lf\n", n,I1);
if(n>=20)
break;
else
I0=I1;
n++;
}
}
实验一,算法二
#include <stdio.h>
#include <math.h>
double I0=(1/105.0+1/126.0)/2,I1;
int n=20;
main ()
{
printf("%d %lf\n", n,I0);
while(1)
{
I1=1.0/(5.0*n)-I0/5.0;
printf("%d %lf\n", n-1,I1);
if(n<2)
break;
else
I0=I1;
n--;
}
}
实验二,二分法
#include <stdio.h>
#include <math.h>
#define esp 1e-3
double f(double x);
main ()
{
double a=1,b=2,x;
while(fabs(b-a)>esp)
{
x=(a+b)/2;
printf("x=%lf\n",x);
if(f(x)==0)
break;
else
if(f(x)*f(a)<0)b=x;
else
a=x;
}
}
double f(double x)
{
return pow(x,3)-x-1;
}
实验二,牛顿迭代法
#include<stdio.h>
#include<math.h>
double f(double x);
double f1(double x);
#define esp 1e-3
void main()
{double x0 = 1.5, x1;
x1 = x0 - f(x0) / f1(x0);
printf("x=%lf\n", x1);
x0 = x1;
x1 = x0 - f(x0) / f1(x0);
printf("x=%lf\n", x1);
while (fabs(x1 - x0)>esp){
x0 = x1;
x1 = x0 - f(x0) / f1(x0);
printf("x=%lf\n", x1);} }
double f(double x)
{return pow(x, 3) - x - 1;} double f1(double x)
{return 3 * x*x - 1;}
弦割法
#include<stdio.h>
#include<math.h>
double f(double x);
#define esp 1e-3
void main()
{double x0 = 1.5, x1=2.0,x2;
do
{ x2=x1 - (x1-x0)*f(x1) /(f(x1)-f(x0));
x0=x1;
x1=x2;
printf("x=%lf\n", x1);
}
while (fabs(x1 - x0)>esp);
{
printf("x=%lf\n", x1);
}
}
double f(double x)
{return pow(x, 3) - x - 1;}
实验3
#include <stdio.h>/*列主元高斯消去法*/
#include <math.h>
float x[3],temp,max;
float A[3][4]={10,-2,-1,3,-2,10,-1,15,-1,-2,5,10},c[3][4]={10,-2,-1,3,-2,10,-1,15,-1,-2,5,10}; int n=3,i,k,j,m;
void main()
{
for(i=0;i<n;i++)
{
max=A[i][i];
k=i;
for(j=j+1;j<n;j++)
{
{
max=fabs(A[j][i]);
k=j;
}
}
if(k!=i)
{
for(j=i+1;j<=n;j++)
{
temp=A[i][j];
A[i][j]=A[k][j];
A[k][j]=temp;
}
}
for(j=i+1;j<n;j++)
for(m=i+1;m<=n;m++)
{
c[j][m]=c[j][m]+(-c[j][i]/c[i][i])*c[i][m];
}
}
for(i=n-1;i>=0;i--)
{
temp=0.0;
for(j=n-1;j>=i+1;j--)
temp=temp+c[i][j]*x[j];
x[i]=(c[i][n]-temp)/c[i][i];
}
printf("x[1]=%f\nx[2]=%f\nx[3]=%f\n",x[0],x[1],x[2]);
实验四,拉格朗日插值
#include<stdio.h>
int n=5,i,j;
double l,L=0,X=0.5;
main(){
double x[5]={0.4,0.55,0.65,0.8,0.9};
double
y[5]={0.41075,0.57815,0.69675,0.88811,1.02652}; for(i=0;i<n;i++)
{l=y[i];
for(j=0;j<n;j++)
{
if(j!=i)
l=l*(X-x[j])/(x[i]-x[j]); } L=L+l;
}
printf("%lf\n",L);
return 0;
} X=0.5 X=0.7 X=0.85
牛顿插值法
#include<stdio.h>
#include<math.h>
main(){
double x[5]={0.4,0.55,0.65,0.8,0.9};
double
y[5]={0.41075,0.57815,0.69675,0.88811,1.02652};
int n=5,i,j;
double z;
printf("input z\n");
scanf("%lf",&z);
double a[5][5];
for(i=0;i<5;i++)
a[i][0]=y[i];
for(i=1;i<5;i++)
for(j=i;j<5;j++)
a[j][i]=(a[j][i-1]-a[j-1][i-1])/(x[j]-x[j-i]);
double N=a[0][0],temp=1.0;
for(i=1;i<n;i++)
{
temp=temp*(z-x[i-1]);
N=N+a[i][i]*temp;
}
printf("N=%lf\n",N);
return 0;
}
实验五曲线拟合
#include <stdio.h>
#include <math.h>
float x[5]={1,2,3,4,5};
float y[5]={7,11,17,27,40};
float A[2][3],c[2][3];
float z[2],temp,max;
int i,j,k,m;
int n=2;
void main()
{
for(i=0;i<5;i++)
{
c[0][0]=A[0][0]+=1;
c[0][1]=A[0][1]+=x[i];
c[0][2]=A[0][2]+=y[i];
c[1][0]=A[1][0]+=x[i];
c[1][1]=A[1][1]+=x[i]*x[i];
c[1][2]=A[1][2]+=x[i]*y[i];
}
/* for(i=0;i<2;i++)
{
printf(" %lf %lf %lf\n",A[i][0],A[i][1],A[i ][2]);
}*/
for(i=0;i<n;i++)
{
max=A[i][i];
k=i;
for(j=j+1;j<n;j++)
{
if(fabs(A[j][i])>max)
{
max=fabs(A[j][i]);
k=j;
}
} if(k!=i)
{
for(j=i+1;j<=n;j++)
{
temp=A[i][j];
A[i][j]=A[k][j];
A[k][j]=temp;
}
}
for(j=i+1;j<n;j++)
for(m=i+1;m<=n;m++)
{
c[j][m]=c[j][m]+(-c[j][i]/c[i][i])*c[i][m];
}
}
for(i=n-1;i>=0;i--)
{
temp=0.0;
for(j=n-1;j>=i+1;j--)
temp=temp+c[i][j]*z[j];
z[i]=(c[i][n]-temp)/c[i][i];
}
printf("a=%f\nxb=%f\n",z[0],z[1]); }
实验六数值积分
/*梯形*/
#include<stdio.h>
#include<math.h> double f(double x); main()
{
double x[10],y[10];
double h,b=1,a=0,I;
int n,i;
printf("n\n");
scanf("%d",&n);
h=(b-a)/n;
for(i=0;i<=n;i++)
{
x[i]=a+(i*h);
y[i]=f(x[i]);
}
I=f(a)+f(b);
for(i=1;i<=n-1;i++)
{
I=I+2*y[i];
}
I=(h/2)*I;
printf("%lf",I);
}
double f(double x)
{
double f;
f=1.0/(1.0+(x*x));
return(f);
}
/*辛普森*/
#include<stdio.h>
#include<math.h>
double f(double x);
main()
{
double x[30],y[30];
double h,b=1,a=0,I;
int n,i;
printf("n\n");
scanf("%d",&n);//点乘
2扩展
h=(b-a)/n;
x[10]=1;
y[10]=f(x[10]);
for(i=0;i<n;i++)
{
x[2*i]=a+(i*h);
y[2*i]=f(x[2*i]);
x[2*i+1]=a+(i+(1.0/2.0
))*h;
y[(2*i)+1]=f(x[(2*i)+1]
);
}
I=f(a)+f(b);
for(i=0;i<n;i++)
{
I=I+4*y[(2*i)+1];
}
for(i=1;i<n;i++)
{
I=I+2*y[2*i];
}
I=(h/6)*I;
printf("%lf\n",I);
}
double f(double x)
{
double f;
f=1.0/(1.0+(x*x));
return(f);
}
/*梯形*/
/*辛普森*/。