西电计算方法上机实习题

西电计算方法上机实习题
西电计算方法上机实习题

计算方法实验报告

班级: 学号: 姓名: 成绩:

1 舍入误差及稳定性

一、实验目的

(1)通过上机编程,复习巩固以前所学程序设计语言及上机操作指令; (2)通过上机计算,了解舍入误差所引起的数值不稳定性

二、实验内容

1、用两种不同的顺序计算10000

2

1n n -=∑,分析其误差的变化

2、已知连分数()

1

01223//(.../)n n a f b b a b a a b =+

+++,利用下面的算法计算f :

1

1

,i n n i i i a d b d b d ++==+

(1,2,...,0i n n =-- 0f d = 写一程序,读入011,,,...,,,...,,n n n b b b a a 计算并打印f 3、给出一个有效的算法和一个无效的算法计算积分

1

041

n

n x y dx x =+? (0,1,...,1

n = 4、设2

2

11

N

N j S j ==

-∑

,已知其精确值为1311221N N ??

-- ?+?? (1)编制按从大到小的顺序计算N S 的程序 (2)编制按从小到大的顺序计算N S 的程序

(3)按两种顺序分别计算10001000030000,,,S S S 并指出有效位数

三、实验步骤、程序设计、实验结果及分析

1、用两种不同的顺序计算10000

2

1n n -=∑,分析其误差的变化

(1)实验步骤:

分别从1~10000和从10000~1两种顺序进行计算,应包含的头文件有stdio.h 和math.h (2)程序设计: a.顺序计算

#include

#include

void main()

{

double sum=0;

int n=1;

while(1)

{

sum=sum+(1/pow(n,2));

if(n%1000==0)printf("sun[%d]=%-30f",n,sum);

if(n>=10000)break;

n++;

}

printf("sum[%d]=%f\n",n,sum);

}

b.逆序计算

#include

#include

void main()

{

double sum=0;

int n=10000;

while(1)

{

sum=sum+(1/pow(n,2));

if(n%1000==0)

printf("sum[%d]=%-30f",n,sum);

if(n<=1)break;

n--;

}

printf("sum[%d]=%f\n",n,sum);

}

(3)实验结果及分析:

程序运行结果:

a.顺序计算

b.逆序计算

结果分析:两种不同顺序计算结果是一样的,顺序计算误差从一开始就很小,而逆序计算误差最开始十分大,后来结果正确。 2、已知连分数()

1

01223//(.../)n n a f b b a b a a b =++++,计算f :

(1)实验步骤:

利用 1

1

,i n n i i i a d b d b d ++==+

(1,2,...,0i n n =--,0f d =,计算f (2)程序设计 #include #include void main() { int i=0,n; float a[1024],b[1024],d[1024]; printf("please input n,n="); scanf("%d",&n); printf("\nplease input a[1] to a[n]:\n"); for(i=1;i<=n;i++) {

printf("a[%d]=",i); scanf("%f",&a[i]); } printf("\nplease input b[0] to b[n]:\n"); for(i=0;i<=n;i++) { printf("b[%d]=",i); scanf("%f",&b[i]); }

d[n]=b[n]; for(i=n-1;i>=0;i--) d[i]=b[i]+a[i+1]/d[i+1]; printf("\nf=%f\n",d[0]); }

(3)实验结果 程序运行结果:

3、给出一个有效的算法和一个无效的算法计算积分

1

041

n

n x y dx x =+? (0,1,...,1

n = (1)实验步骤

利用C 语言编写程序,分别使用数值稳定的和数值不稳定的计算公式所建立的递推公式进行计算。 (2)程序设计 #include #include main() { double y_0=(1/4.0)*log(5),y_1; double y_2=(1.0/55.0+1.0/11.0)/2,y_3; int n=1,m=10; printf("有效算法输出结果:\n"); printf("y[0]=%-20f",y_0); while(1) { y_1=1.0/(4*n)+y_0/(-4.0); printf("y[%d]=%-20f",n,y_1); if(n>=10) break; y_0=y_1; n++; if(n%3==0) printf("\n"); } printf("\n 无效算法的输出结果:\n"); printf("y[10]=%-20f",y_2);

while(1) { y_3=1.0/n-4.0*y_2; printf("y[%d]=%-20f",m-1,y_3); if(m<=1) break; y_2=y_3; m--; if(m%2==0) printf("\n"); } }

(3)实验结果及分析 程序运行结果:

结果分析:无效算法数值不稳定,误差造成的影响特别大 4、设22

11

N

N j S j ==

-∑

,已知其精确值为1311221N N ??

-- ?+??

(1)实验步骤

先编程按从大到小的顺序计算N S 的程序,再编程按从小到大的顺序计算N S 的程序,然后按两种顺序分别计算10001000030000,,S S S 。

(2)程序设计 #include main() { int N; double SN[30000]; SN[30000]=(3.0/2.0-1.0/30000.0-1/30001.0)/2.0; for(N=30000;N>=2;N--) SN[N-1]=SN[N]-1.0/(N*N-1); printf("从大到小顺序计算:

\nSN[1000]=%f\nSN[10000]=%f\nSN[30000]=%f\n",SN[1000],SN[10000],SN[30000]); SN[2]=(3.0/2-1.0/2.0-1/3.0)/2.0; for(N=3;N<=30000;N++) SN[N]=SN[N-1]+1.0/(N*N-1); printf("从小到大顺序计算:

\nSN[1000]=%f\nSN[10000]=%f\nSN[30000]=%f\n",SN[1000],SN[10000],SN[30000]); }

(3)实验结果及分析 程序运行结果:

结果分析:不同顺序计算所得结果是一样的。

四、总结

通过这次上机,学习了解了舍入误差在不同算法时对结果的影响不同,稳定的算法才能获得正确的结果。

2 方程求根

一、实验目的

(1)通过对二分法与牛顿迭代法做编程练习和上机运算,进一步体会二分法和牛顿法的不同。

(2)编写割线迭代法的程序,求非线性方程的解,并与牛顿迭代法作比较。

二、实验内容

1、用牛顿法求下列方程的根 (1)2

0x

x e -= (2)10x xe -= (3)lg 20x x +-=

2、编写割线法程序求解第一问的方程

三、实验步骤、程序设计、实验结果及分析

1、牛顿法

(1)实验步骤

通过定义牛顿法求方程的子函数,用main 函数调用子函数求根 (2)程序设计 #include #include

typedef float (*p)(float );

float ff1(float x) {

return x*x-exp(x);

}

float ff2(float x)

{

return x*exp(x)-1;

}

float ff3(float x)

{

return log(x)+x-2;

}

float answer(float(*p)(float))

{

int k=2;

float m=1,n=-1,x2,a,b,c;

if (p==ff3)n=2;

printf("x[0] = %.4f, x[1] = %.4f, ",m,n);

while (1)

{

if (fabs(m-n)<1e-4) break;

a=p(n)*(n-m);

b=p(n)-p(m);

c=a/b;

x2=n-c;

m = n;

n = x2;

printf("x[%d] = %.4f, ",k,x2);

k++;

if (k%3==0) printf("\n");

}

if (k%3!=0) printf("\n");

printf("iteration times: %d, roots: %.4f\n ",k-2,n);

return 0;

}

main()

{

printf("x*x-exp(x),\n");

answer(ff1);

printf("x*exp(x)-1,\n");

answer(ff2);

printf("lg(x)+x-2,\n");

answer(ff3);

return 0;

}

(3)实验结果及分析

2、割线法

(1)程序设计

#include

#include

float gexian(float,float);

float f(float);

main()

{

int i,j;

float x1=2.2;

float x2=2,x3;

scanf("%d",&i);

if(i==1) printf("%f",x1); else if(i==2) printf("%f",x2); else

{

for(j=3;j<=i;j++)

{

x3=gexian(x1,x2);

x1=x2;

x2=x3;

}

printf("%f",gexian(x1,x2)) ; }

}

float f(float x)

{

return (x*x-exp(x));

}

float gexian(float x1,float x2)

{

return (x2-(f(x2)/(f(x2)-f(x1)))*(x2-x1));

}

(3)实验结果及分析

四、总结

了解和学习了二分法和牛顿迭代法的思想以及程序设计的方法,比较了迭代法和牛顿法的特点:牛顿法收敛速度较快,但对初值选取要求较高;割线法计算量少。

3 线性方程组数值解法

一、实验目的

(1)熟悉求解线性方程组的有关理论和方法;

(2)会编制列主元消去法,LU分解法,雅可比及高斯-赛德尔迭代法的程序;

(3)通过实际计算,进一步了解各种方法的优缺点,选择合适的数值方法。

二、实验内容

1、用列主元消去法解方程组

2、用LU分解法解方程组

三、实验步骤、程序设计、实验结果及分析

1、用列主元消去法解方程组

(1)程序设计

#include

#include

void ColPivot(float*,int,float[]);

void ColPivot(float*c,int n,float x[])

{

int i,j,t,k;

float p;

for(i=0;i<=n-2;i++)

{

k=i;

for(j=i+1;j<=n-1;j++)

if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i))))

k=j;

if(k!=i)

for(j=i;j<=n;j++)

{

p=*(c+i*(n+1)+j);

*(c+i*(n+1)+j)=*(c+k*(n+1)+j);

*(c+k*(n+1)+j)=p;

}

for(j=i+1;j<=n-1;j++)

{

p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));

for(t=i;t<=n;t++)

*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));

}

}

for(i=n-1;i>=0;i--)

{

for(j=n-1;j>=i+1;j--)

(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j));

x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));

}

}

void main()

{

int i;

float x[4];

float c[4][5]={1,1,0,3,4,2,1,-1,1,1,3,-1,-1,3,-3,-1,2,3,-1,4};

ColPivot(c[0],4,x);

for(i=0;i<=3;i++)

printf("x[%d]=%f\n",i,x[i]);

}

(2)实验结果及分析

(1)题

(2)题

2、用LU分解法解方程组

(1)程序设计

#include

void main()

{

float x[4];

int i;

float a[4][5]={48,-24,0,-12,4,

-24,24,12,12,4,

0,6,20,2,-2,

-6,6,2,16,-2

};

void DirectLU(float*,int,float[]);

DirectLU(a[0],4,x);

for(i=0;i<=3;i++)printf("x[%d]=%f\n",i,x[i]);

}

void DirectLU(float*u,int n,float x[])

{

int i,r,k;

for(r=0;r<=n-1;r++)

{

for(i=r;r<=n;i++)

for(k=0;k<=r-1;k++)

*(u+r*(n+1)+i)-=*(u+r*(n+1)+k)*(*(u+k*(n+1)+i));

for(i=r+1;i<=n-1;i++)

{

for(k=0;k<=r-1;k++)

*(u+i*(n+1)+r)-=*(u+i*(n+1)+k)*(*(u+k*(n+1)+r));

*(u+i*(n+1)+r)/=*(u+r*(n+1)+r);

}

}

for(i=n-1;i>=0;i--)

{

for(r=n-1;r>=i+1;r--)

*(u+i*(n+1)+n)-=*(u+i*(n+1)+r)*x[r];

x[i]=*(u+i*(n+1)+n)/(*(u+i*(n+1)+i));

}

}

四、总结

掌握了用列主元消去法和LU分解法求解方程组程序编写的技巧。

4 插值法

一、实验目的

(1)熟悉拉格朗日插值法多项式和牛顿插值多项式,注意其不同点;(2)掌握三次样条插值解决一些实际问题。

二、实验内容

1、按所给数据做二次插值,并求给定点的函数值

2、按所给数据做五次插值,并求给定点的函数值

3、牛顿前插公式计算函数值

三、实验步骤、程序设计、实验结果及分析

1、二次插值

(1)程序设计

#include

float Lagrange(float x[],float y[],float xx,int n) //n为(n+1)次插值;{

int i,j;

float *a,yy=0;

a=new float[n];

for(i=0;i<=n-1;i++)

{

a[i]=y[i];

for(j=0;j<=n-1;j++)

if(j!=i)a[i]*=(xx-x[j])/(x[i]-x[j]);

yy+=a[i];

}

delete a;

return yy;

}

void main()

{

float x[5]={-3.0,-1.0,1.0,2.0,3.0};

float y[5]={1.0,1.5,2.0,2.0,1.0};

float xx1=-2,xx2=0,xx3=2.75,yy1,yy2,yy3;

yy1=Lagrange(x,y,xx1,3);

yy2=Lagrange(x,y,xx2,3);

yy3=Lagrange(x,y,xx3,3);

printf("x1=%-20f,y1=%f\n",xx1,yy1);

printf("x2=%-20f,y2=%f\n",xx2,yy2);

printf("x3=%-20f,y3=%f\n",xx3,yy3);

}

(2)实验结果

2、五次插值

(1)程序设计

#include

float Lagrange(float x[],float y[],float xx,int n) //n为(n+1)次插值;{

int i,j;

float *a,yy=0;

a=new float[n];

for(i=0;i<=n-1;i++)

{

a[i]=y[i];

for(j=0;j<=n-1;j++)

if(j!=i)a[i]*=(xx-x[j])/(x[i]-x[j]);

yy+=a[i];

}

delete a;

return yy;

}

int main()

{

float x[6]={0.30,0.42,0.50,0.58,0.66,0.72};

float y[6]={1.04403,1.08462,1.11803,1.15603,1.19817,1.23223};

float xx1=0.46,xx2=0.55,xx3=0.60,yy1,yy2,yy3;

yy1=Lagrange(x,y,xx1,6);

yy2=Lagrange(x,y,xx2,6);

yy3=Lagrange(x,y,xx3,6);

printf("x1=%-20f,y1=%f\n",xx1,yy1);

printf("x2=%-20f,y2=%f\n",xx2,yy2);

printf("x3=%-20f,y3=%f\n",xx3,yy3);

}

(2)实验结果

3、牛顿前插公式计算函数值

(1)程序设计

#include

#define N 3

void Difference(float y[],float f[4][4],int n)

{

int k,i;

f[0][0]=y[0];f[1][0]=y[1];f[2][0]=y[2];f[3][0]=y[3];

for(k=1;k<=n;k++)

for(i=0;i<=(N-k);i++)

f[i][k]=f[i+1][k-1]-f[i][k-1];

return;

}

int main()

{

int i,k=1;

float a,b=1,m=21.4,t=1.4,f[4][4]={0};

float x[5]={20,21,22,23,24};

float y[5]={1.30103,1.32222,1.34242,1.36173,1.38021};

Difference(y,f,N);

a=f[0][0];

for(i=1;i<=N;i++)

{

k=k*i;

b=b*(t-i+1);

a=a+b*f[0][i]/k;

}

printf("x(k)\n");

for (i=0;i<=4;i++)

printf( "%-20f",x[i]);

printf("\ny(k)\n");

for (i=0;i<=4;i++)

printf("%-20f",y[i]);

for(k=1;k<=3;k++)

{

printf("\nF(%d)\n ",k);

for(i=0;i<=(3-k);i++)

{

printf("%-20f",f[i][k]);

}

}

printf ("\n");

printf("f(%f)=%-20f",m,a);

printf ("\n");

}

(2)实验结果

四、总结

学习了插值法,学会了利用插值法编程求多项式的解,可以求解很多问题,让求解多项式解变得非常简单。

5 曲线拟合

一、实验目的

(1)了解最小二乘法的基本原理,通过计算机解决实际问题; (2)了解超定方程组的最小二乘解法。

二、实验内容

1、分别用抛物线2y a bx cx =++和指数曲线bx y ae =拟合所给数据,并比较这两个拟合函数的优劣。

2、按所给实验数据,用形如2y a bx =+的抛物线进行最小二乘拟合。 三、程序设计、结果分析

1、分别用抛物线2y a bx cx =++和指数曲线bx y ae =拟合所给数据

a.抛物线

(1)程序设计: #include #include int main() { int i; float a[3]; float x[15]={1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6.5,7,7.5,8}; float

y[15]={33.4,79.50,122.65,159.05,189.15,214.15,238.65,252.50,267.55,280.50,296.65,301.40,310.40,318.15,325.15}; void Approx(float[],float[],int,int,float[]); Approx(x,y,15,2,a); for(i=0;i<=2;i++) printf("a[%d]=%f\n",i,a[i]); }

void Approx(float x[],float y[],int m,int n,float a[]) { int i,j,t; float *c=new float[(n+1)*(n+2)]; float power(int,float); void ColPivot(float *,int,float[]); for(i=0;i<=n;i++) { for(j=0;j<=n;j++) {

*(c+i*(n+2)+j)=0;

for(t=0;t<=m-1;t++)

*(c+i*(n+2)+j)+=power(i+j,x[t]);

}

*(c+i*(n+2)+n+1)=0;

for(j=0;j<=m-1;j++)

*(c+i*(n+2)+n+1)+=y[j]*power(i,x[j]);

}

ColPivot(c,n+1,a);

delete c;

}

void ColPivot(float *c,int n,float x[])

{

int i,j,t,k;

float p;

for(i=0;i<=n-2;i++)

{

k=i;

for(j=i+1;j<=n-1;j++)

if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i))))

k=j;

if(k!=i)

for(j=i;j<=n;j++)

{

p=*(c+i*(n+1)+j);

*(c+i*(n+1)+j)=*(c+k*(n+1)+j);

*(c+k*(n+1)+j)=p;

}

for(j=i+1;j<=n-1;j++)

{

p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));

for(t=i;t<=n;t++)*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));

}

}

for(i=n-1;i>=0;i--)

{

for(j=n-1;j>=i+1;j--)

(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j));

x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));

}

}

float power(int i,float v)

{

float a=1;

while(i--)a*=v;

return a;

}

(2)实验结果

2、最小二乘拟合

(1)程序设计

#include

#include

void main()

{

int i,n;

float a[2];

float x[15]={1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6.5,7,7.5,8},z[15];

float

y[15]={33.4,79.50,122.65,159.05,189.15,214.15,238.65,252.50,267.55,280.50,296.65,301.40,310. 40,318.15,325.15};

for(n=0;n<=14;n++) //增加了数组z;

{z[n]=log(y[n]/x[n]);}

void Approx(float[],float[],int,int,float[]);

Approx(x,z,15,1,a); //变成一次拟合;

//for(i=0;i<=1;i++)

//printf("a[%d]=%f\n",i,a[i]);

printf("a=exp(a[0])=%f\n",exp(a[0]));

printf("b=-a[1]=%f\n",-a[1]);

}

void Approx(float x[],float y[],int m,int n,float a[])

{

int i,j,t;

float *c=new float[(n+1)*(n+2)];

float power(int,float);

void ColPivot(float *,int,float[]);

for(i=0;i<=n;i++)

{

for(j=0;j<=n;j++)

{

*(c+i*(n+2)+j)=0;

for(t=0;t<=m-1;t++)

*(c+i*(n+2)+j)+=power(i+j,x[t]);

}

*(c+i*(n+2)+n+1)=0;

for(j=0;j<=m-1;j++)

*(c+i*(n+2)+n+1)+=y[j]*power(i,x[j]);

}

ColPivot(c,n+1,a);

delete c;

}

void ColPivot(float *c,int n,float x[])

{

int i,j,t,k;

float p;

for(i=0;i<=n-2;i++)

{

k=i;

for(j=i+1;j<=n-1;j++)

if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i))))

k=j;

if(k!=i)

for(j=i;j<=n;j++)

{

p=*(c+i*(n+1)+j);

*(c+i*(n+1)+j)=*(c+k*(n+1)+j);

*(c+k*(n+1)+j)=p;

}

for(j=i+1;j<=n-1;j++)

{

p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));

for(t=i;t<=n;t++)*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));

}

}

for(i=n-1;i>=0;i--)

{

for(j=n-1;j>=i+1;j--)

(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j));

x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));

}

}

float power(int i,float v)

{

float a=1;

while(i--)a*=v;

return a;

}

(2)实验结果

四、总结

通过曲线拟合,最小二乘法的基本原理的学习,我学会了利用计算机解决现实实际问题中的曲线拟合。

6 数值积分

一、实验目的

(1)通过实际计算体会各种方法的精确度;

(2)会编写用龙贝格算法求定积分的程序。

二、实验内容

编写复化柯特斯求积分公式,并计算例题1例题2,观察n为多少时有6位有效数字。

三、程序设计、实验结果及分析

(1)程序设计

#include

#include

float Cotes(float(*f)(float),float a,float b,int n)

{

int k;

float c,c1=0,c2,c3,c4;

float h=(b-a)/n;

c2=(*f)(a+h/4);

c3=(*f)(a+h/2);

c4=(*f)(a+3*h/4);

最新上海电力学院数值计算方法上机实习题

2017数值计算方法上机实习报告 学院: 专业: 班级: 姓名: 学号:

数值计算方法上机实习题 1. 设?+=1 05dx x x I n n , (1) 由递推公式n I I n n 1 51+ -=-,从0=0.1823I ,1824.00=I 出发,计算20I ; (2) 20=0I ,20=10000I , 用n I I n n 51 5111+-=--,计算0I ; (3) 分析结果的可靠性及产生此现象的原因(重点分析原因)。 解:(1)分别令I 0的近似值为0.1823、0.1824,MATLAB 程序如下: I=0.1823; %题中的已知数据 for n=1:20; I=(-5)*I+1/n; %由递推公式所得 end fprintf('I20=%f\n',I) M=0.1824; %与I 的计算结果形成对比 for i=1:20; M=(-5)*M+1/i; %由递推公式所得 end fprintf('M20=%f\n',M) %% 输出结果 I20=-2055816073.851284 M20=7480927090.212283 (2)分别令I 20的近似值为0、10000,MATLAB 程序如下: I=0; %赋予I20的初始值 for n=0:19; I=(-1/5)*I+1/(5*(20-n)); %由递推公式所得 end fprintf('I0=%f\n',I) M=10000; for i=0:19; M=(-1/5)*M+1/(5*(20-i));%由递推公式所得 end fprintf('M0=%f\n',M) %% 输出结果 I0=0.182322 M0=0.182322 (3)分析: 由输出结果可看出第一种算法为不稳定算法,第二种算法为稳定算法。 由于误差 * 000I I e -= 02211*1*11*555)(5)15(15e e e I I n I n I I I e n n n n n n n n n n ===-=+--+ -=-=------

西电行政方法模拟题1(答案)

模拟题(一) 一、选择题(单选,14道小题,每题3分,共42分) 1. 设A X = 2.40315是真值T X =2.403147的近似值,则A X 有__C__位有效数字。 A 、4 B 、5 C 、6 D 、7 2. 上题中A X 的绝对误差限为 C 。 A 、30.510-? B 、40.510-? C 、50.510-? D 、60.510-? 3. 当计算公式的第n +1步的误差e n +1与第n 步的误差e n 满足__A__时,称此计算公式是绝对稳定的。 A 、 11n n e e +≤ B 、11n n e e +≥ C 、10n n e e +≤ D 、10n n e e +≥ 4. 数值x *的近似值x ,那么按定义x 的相对误差是__A_。 *** A B *C D * * x x x x x x x x x x x ----、 、、 、 5. 用列主元高斯消去法解线性方程组1231231 2231425427 x x x x x x x x -+=?? ++=??+=?,则第一次选取的列主元为 B 。 A 、2 B 、4 C 、1 D 、-1 6. 设?(x)=4x 4+4x 3-2x 2+3x +2,取x 1=0,x 2=0.2,x 3=0.5,x 4=1,x 5=2,x 6=2.4,x 7=4。在这些点上关于?(x)的插值多项式为6()P x ,则?(0.1)-6(0.1)P =_____D_____。 A 、0.01 B 、0.002 C 、0.003 D 、0 7. 以下方程求根的数值计算方法中,收敛速度最快的是: C 。 A 、二分法 B 、简单迭代法 C 、牛顿迭代法 D 、割线法 8. 要构造f (x )=e x 的4次拉格朗日多项式,至少需要已知f (x )上 C 个插值节点的取值。 A 、3 B 、4 C 、5 D 、6

计算方法上机题答案

2.用下列方法求方程e^x+10x-2=0的近似根,要求误差不超过5*10的负4次方,并比较计算量 (1)二分法 (局部,大图不太看得清,故后面两小题都用局部截图) (2)迭代法

(3)牛顿法 顺序消元法 #include #include #include int main() { int N=4,i,j,p,q,k; double m; double a[4][5]; double x1,x2,x3,x4; for (i=0;i

for(k=p+1;kmax1 max1=abs(A(i,k));r=i; end end

计算方法第三次上机实习报告

实验报告 课程名称: 计算方法 指导老师: 太英 成绩: 实验名称: 第三次上机作业 实验类型: matlab 同组学生: 一、实验目的和要求(必填) 二、实验容和原理(必填) 三、主要仪器设备(必填) 四、操作方法和实验步骤 五、实验数据记录和处理 六、实验结果与分析(必填) 七、讨论、心得 一、实验目的 用龙贝格算法计算积分I =∫ssss s ss 01 ,要求误差不超过ε=12 ×105 二、实验原理 龙贝格算法是由递推算法得来的。由梯形公式得出辛普森公式得出柯特斯公式最后得到龙贝格公式。设将求积区间[a ,b]分为n 个等分,则一共有n+1个等分点,k x a kh =+,0,1,b a h k n -= =,n 。这里用n T 表示复化梯形法求得的积分 值,其下标n 表示等分数。 先考察下一个字段[1,k k x x +],其中点()112 1 2 k k k x x x ++= +,在该子段上二分前后两个积分值 ()()112 k k h T f x f x += +???? ()()21124k k k h T f x f x f x ++? ??? =+ +?? ??????? 显然有下列关系 2112122k h T T f x +? ?=+ ??? 将关系式关于k 从0到n-1累加求和,即可得递推公式1 210 2122n n n k k h T T f x -+=?? =+ ??? ∑

需要强调指出的是,上式中的b a h n -= 代表二分前的步长,而12 12k x a k h +? ?=++ ??? 根据梯形法的误差公式,积分值n T 的截断误差大致与2h 成正比,因此步长减半后误差将减至四分之一,即有 211 14 n n T T -≈- 将上式移项整理,知 221 1()3 n n n T T T -≈- 按上式,积分值2n T 的误差大致等于21 ()3 n n T T -,如果用这个误差值作为2n T 的 一种补偿,可以期望,所得的()222141 333 n n n n n T T T T T T =+ -=-应当是更好的结果。 组合得到的近似值T 直接验证,用梯形二分前后的两个积分值n T 和2n T 按式组合, 结果得到辛普森法的积分值241 33 n n n S T T =- 再考察辛普森法。其截断误差与4h 成正比。因此,若将步长折半,则误差相应的减至十六分之一。既有 21 16n n I S I S -≈- 由此得 21611515 n n I S S ≈ - 不难验证,上式右端的值其实就等于n C ,就是说,用辛普森法二分前后的两个积分值n S 和2n S ,在按上式再做线性组合,结果得到柯特斯法的积分值n C ,既有 2161 1515n n n C S S ≈ - 重复同样的手续,依据斯科特法的误差公式可进一步导出龙贝格公式 2641 6363 n n n R C C ≈ - 在步长二分的过程中运用公式加工三次,就能将粗糙的积分值n T 逐步加工成精度较高的龙贝格n R ,或者说,将收敛缓慢的梯形值序列n T 加工成熟练迅速的龙贝 格 值序列n R ,这种加速方法称龙贝格算法。 三、实验过程 1.流程图

西电计算方法作业

习题1 1. x1=4.8675 x1有5位有效数字;x2=4.08675 x2有6位有效数字; X 3=0.08675 x3有4位有效数字;x4=96.4730 x4有6位有效数字; X 5=96×105 x5有2位有效数字;x6=0.00096 x6有2位有效数字。 8.解: y n =5y n-1-2 n=1,2, (1) y 0= 3 在计算y 0时有舍入误差,设为e 0,并设求得的y 0的近似值y 0,即e 0= y 0 -y 0,所以, y n = 5y n-1-2 n=1,2,… (2) y 0=y 0-e 0 由(1)-(2)得:y n - y n =5(y n-1- y n-1) 所以y n -y n =5n e 0 n=1,2,… 所以e 10=510 e 0=510 ( 3 -1.73)=20027.42 所以这个计算过程不稳定。 10.解:f(x)=8x 5-0.4x 4+4x 3 -9x+1 =(8x 4-0.4x 3+4x 2 -9)x+1 =((8x 3-0.4x 2 +4x)x-9)x+1 =(((8x 2 -0.4x+4)x-9)x+1 =((((8x-0.4)x+4)x-9)x+1 b 0=8; b 1=8x-0.4=8×3-0.4=23.6; b 2= b 1x+4=23.6×3+4=74.8; b 3= b 2x=74.8×3=224.4; b 4= b 3x-9=224.4×3-9=664.2; b 5= b 4x+1=664.2×3+1=1993.6; 所以f(3)= b 5=1993.6. 8 -0.4 4 0 -9 1 X=3 24 70.8 224.4 673.2 1992.6 8 23.6 74.8 224.4 664.2 1993.6 所以f(3)=1993.6. 习题2 1. 证明:令f(x)=1-x-sinx,则f ′(x)=-1-cosx>0, 所以f (x )在区间[0,1]中连续且严格单调递增。 又因为f(0)=1,f(1)=-sin1,即f(0)f(1)<0, 所以方程1-x-sinx=0在区间[0,1]中有且只有一个根。 由1/2k+1=12 ×10-3 得:k ≥3ln10ln2 ≥9.965 所以使用二分法求误差不大于12 ×10-3 的根需要二分10次。 2. 用简单迭代法求e x -4x=0的根,精确至四位有效数字 解:设f(x)= e x -4x,则f ′(x)= e x -4。 因为f(0.35)= e 0.35-4×0.35=0.019068,f(0.38)= e 0.38 -4×0.38=-0.057715, f(0.35)f(0.38)<0且当x ∈[0.35,0.38]时f ′(x)= e x -4<0即f(x)在[0.35,0.38] 上单调递减。 所以f(x) 在[0.35,0.38]上有且仅有一个根。

数值计算方法上机实习题

数值计算方法上机实习题 1. 设?+=1 05dx x x I n n , (1) 由递推公式n I I n n 1 51+ -=-,从I 0=0.1824, 0=0.1823I 出发,计算20I ; (2) 20=0I ,20=10000I , 用n I I n n 51 5111+- =--,计算0I ; (3) 分析结果的可靠性及产生此现象的原因(重点分析原因)。 答:第一个算法可得出 e 0=|I 0?I 0 ?| e n =|I n ?I n ?|=5n |e 0| 易知第一个算法每一步计算都把误差放大了5倍,n 次计算后更是放大了5n 倍,可靠性低。 第二个算法可得出 e n =|I n ?I n ?| e 0=(15 )n |e n | 可以看出第二个算法每一步计算就把误差缩小5倍,n 次后缩小了5n 倍,可靠性高。

2. 求方程0210=-+x e x 的近似根,要求41105-+?<-k k x x ,并比较计算量。 (1) 在[0,1]上用二分法; 计算根与步数程序: fplot(@(x) exp(x)+10*x-2,[0,1]); grid on; syms x; f=exp(x)+10*x-2; [root,n]=EFF3(f,0,1); fprintf('root=%6.8f ,n=%d \n',root,n); 计算结果显示: root=0.09057617 ,n=11 (2) 取初值00=x ,并用迭代10 21 x k e x -=+;

(3) 加速迭代的结果; (4) 取初值00 x ,并用牛顿迭代法;

计算方法上机实习题大作业(实验报告).

计算方法实验报告 班级: 学号: 姓名: 成绩: 1 舍入误差及稳定性 一、实验目的 (1)通过上机编程,复习巩固以前所学程序设计语言及上机操作指令; (2)通过上机计算,了解舍入误差所引起的数值不稳定性 二、实验内容 1、用两种不同的顺序计算10000 21n n -=∑,分析其误差的变化 2、已知连分数() 1 01223//(.../)n n a f b b a b a a b =+ +++,利用下面的算法计算f : 1 1 ,i n n i i i a d b d b d ++==+ (1,2,...,0 i n n =-- 0f d = 写一程序,读入011,,,...,,,...,,n n n b b b a a 计算并打印f 3、给出一个有效的算法和一个无效的算法计算积分 1 041 n n x y dx x =+? (0,1,...,1 n = 4、设2 2 11N N j S j == -∑ ,已知其精确值为1311221N N ?? -- ?+?? (1)编制按从大到小的顺序计算N S 的程序 (2)编制按从小到大的顺序计算N S 的程序 (3)按两种顺序分别计算10001000030000,,,S S S 并指出有效位数 三、实验步骤、程序设计、实验结果及分析 1、用两种不同的顺序计算10000 2 1n n -=∑,分析其误差的变化 (1)实验步骤: 分别从1~10000和从10000~1两种顺序进行计算,应包含的头文件有stdio.h 和math.h (2)程序设计: a.顺序计算

#include #include void main() { double sum=0; int n=1; while(1) { sum=sum+(1/pow(n,2)); if(n%1000==0)printf("sun[%d]=%-30f",n,sum); if(n>=10000)break; n++; } printf("sum[%d]=%f\n",n,sum); } b.逆序计算 #include #include void main() { double sum=0; int n=10000; while(1) { sum=sum+(1/pow(n,2)); if(n%1000==0) printf("sum[%d]=%-30f",n,sum); if(n<=1)break; n--; } printf("sum[%d]=%f\n",n,sum); } (3)实验结果及分析: 程序运行结果: a.顺序计算

《数值计算方法》上机实验报告

《数值计算方法》上机实验报告华北电力大学 实验名称数值il?算方法》上机实验课程名称数值计算方法专业班级:电力实08学生姓名:李超然学号:200801001008 成绩: 指导教师:郝育黔老师实验日期:2010年04月华北电力大学实验报告数值计算方法上机实验报吿一. 各算法的算法原理及计算机程序框图1、牛顿法求解非线性方程 *对于非线性方程,若已知根的一个近似值,将在处展开成一阶 xxfx ()0, fx ()xkk 泰勒公式 "f 0 / 2 八八,fxfxfxxxxx 0 0 0 0 0 kkkk2! 忽略高次项,有 ,fxfxfxxx 0 ()()(),,, kkk 右端是直线方程,用这个直线方程来近似非线性方程。将非线性方程的 **根代入,即fx ()0, X ,* fxfxxx 0 0 0 0, ,, kkk fx 0 fx 0 0,

解出 fX 0 *k XX,, k' fx 0 k 水将右端取为,则是比更接近于的近似值,即xxxxk, Ik, Ik fx ()k 八XX, Ikk* fx()k 这就是牛顿迭代公式。 ,2,计算机程序框图:,见, ,3,输入变量、输出变量说明: X输入变量:迭代初值,迭代精度,迭代最大次数,\0 输出变量:当前迭代次数,当前迭代值xkl ,4,具体算例及求解结果: 2/16 华北电力大学实验报吿 开始 读入 l>k /fx()0?,0 fx 0 Oxx,,01* fx ()0 XX,,,?10 kk, ,1,kN, ?xx, 10 输出迭代输出X输出奇异标志1失败标志

,3,输入变量、输出变量说明: 结束 例:导出计算的牛顿迭代公式,并il ?算。(课本P39例2-16) 115cc (0), 求解结果: 10. 750000 10.723837 10. 723805 10. 723805 2、列主元素消去法求解线性方程组,1,算法原理: 高斯消去法是利用现行方程组初等变换中的一种变换,即用一个不为零的数乘 -个 方程后加只另一个方程,使方程组变成同解的上三角方程组,然后再自下而上 对上三角 3/16 华北电力大学实验报告方程组求解。 列选主元是当高斯消元到第步时,从列的以下(包括)的各元素中选出绝 aakkkkkk 对值最大的,然后通过行交换将其交换到的位置上。交换系数矩阵中的 两行(包括常ekk 数项),只相当于两个方程的位置交换了,因此,列选主元不影响求解的结 ,2,计算机程序框图:,见下页, 输入变量:系数矩阵元素,常向量元素baiji 输出变量:解向量元素bbb,,12n

西电计算机图形学作业

1、结合个人的使用体会,谈谈显卡的主要技术指标 主要技术指标: 最大分辨率:当一个图像被显示在屏幕上时,它是由无数小点组成的,它们被称为像素(Pixel)。最大分辩率是指显示卡能在显示器上描绘点的最大数量,一般以“横向点数X 纵向点数”表示。 色深:像素描绘是的是屏幕上极小的一个点,每一个像素可以被设置为不同的颜色和亮度。像素的每一种状态都是三种颜:红、蓝、绿所控制,当它们都处于最大亮度时,像素就呈现为白色,;反之,像素为黑色。像素的颜色数称为色深,该指标用来描述显示卡能够显示多少种颜色,一般以多少色或多少bit色来表示,如8bit色深可以显示256种颜色,16bit色深可显示65536种颜色,称为增强色,24bit色深可以显示16M 种颜色,称为真颜色,所以色深的位数越高,所能看见的颜色就越多,屏幕上画面的质量就越好。但色深增加时,也增大了显示卡所要处理的数据量,这就要求显示卡配有更大显示内存并具有更高的转换速率。 刷新频率:刷新频率是指图像在显示器上更新的速度,也就是图像每秒在屏幕上出现的帧数,单位为Hz (赫兹)。刷新频率越高,屏幕上图像的闪烁感就越小,图像越稳定,视觉效果也越好。一般刷新频率在75Hz以上时,人眼对影像的闪烁才不易查觉。这个性能指标主要取决于显示卡上RAMDAC的转换速度。显存:如果说显存带宽决定了显卡的性能,那么显存位宽就决定了显存带宽,因为在相同频率下,64位显存的带宽只有128位显存的一半,当遇到大量像素渲染工作时,因为显存位宽的限制会造成显存带宽的不足,最直接的后果就是导致传输数据的拥塞,速度明显下降屏幕更新频率(Vertical刷新Rate)指显示器每秒能对整个画面重复更新的次数,若此数值为72Hz,表示显卡每秒将送出72张画面讯号给显示器。在显卡中的渲染管线包括很多,比如像素渲染管线、纹理渲染管线、顶点渲染管线等等,它们在显卡中起到各自的作用。 体会:同型号同容量的情况下,可以比较:1.显存位宽(越大越好)以及显存用料比如GDDR1/GDDR2/GDDR3;2.核心频率和显存频率(越高越好)如:256bit/256M与128bit/256M;3.显卡的速度,就是几点几纳秒(越小越好),一般显卡的速度只有查显卡的说明书才能得出。 2、举例说明中点画线法的基本原理并编程实现 基本原理: 直线y=k*x+b 可以写成y-k*x-b=0的形式;进而写成函数F(x,y)=y-k*x-b;注意在此要使得y的系数一定为正,这和我们以下讨论的直线和点的位置关系息息相关。只有y的系数是正的时候,以下关系式才成立;如果y的系数是负的话,下面的关系式是相反的; 当点在直线上方时,点的坐标带入函数,F(x,y)>0; 当点在直线下方时,点的坐标带入函数,F(x,y)<0; 当点在直线上时,点的坐标带入函数,F(x,y)=0; 已知点P1(x0,y0),P(x1,y1)并且都是整数坐标对。令dx=x1-x0;dy=y1-y0;并且x1>x0恒成立,那么dx恒大于0;且k=dy/dx;方程y-k*x-b=0改写成y-(dy/dx)*x-b=0; 最终函数F(x,y)=y*dx-x*dy-B;其中B=b*dx; 我们讨论 (1)00时,中点在直线的上方,我们选取中点下方的整数坐标对,即点(x0+1,y0),也就是x++,而y 的值不变。我们继续判断下一个中点(x0+2,y0+0.5),带入函数,d=2*F(x0+2,y0+0.5)=d0+(-2*dy);其中

(完整版)数值计算方法上机实习题答案

1. 设?+=1 05dx x x I n n , (1) 由递推公式n I I n n 1 51+-=-,从0I 的几个近似值出发,计算20I ; 解:易得:0I =ln6-ln5=0.1823, 程序为: I=0.182; for n=1:20 I=(-5)*I+1/n; end I 输出结果为:20I = -3.0666e+010 (2) 粗糙估计20I ,用n I I n n 51 5111+- =--,计算0I ; 因为 0095.05 6 0079.01020 201 020 ≈<<≈??dx x I dx x 所以取0087.0)0095.00079.0(2 1 20=+= I 程序为:I=0.0087; for n=1:20 I=(-1/5)*I+1/(5*n); end I 0I = 0.0083 (3) 分析结果的可靠性及产生此现象的原因(重点分析原因)。 首先分析两种递推式的误差;设第一递推式中开始时的误差为000I I E '-=,递推过程的舍入误差不计。并记n n n I I E '-=,则有01)5(5E E E n n n -==-=-Λ。因为=20E 20020)5(I E >>-,所此递推式不可靠。而在第二种递推式中n n E E E )5 1(5110-==-=Λ,误差在缩小, 所以此递推式是可靠的。出现以上运行结果的主要原因是在构造递推式过程中,考虑误差是否得到控制, 即算法是否数值稳定。 2. 求方程0210=-+x e x 的近似根,要求4 1105-+?<-k k x x ,并比较计算量。 (1) 在[0,1]上用二分法; 程序:a=0;b=1.0; while abs(b-a)>5*1e-4 c=(b+a)/2;

东南大学计算方法与实习上机实验一

东南大学计算方法与实习实验报告 学院:电子科学与工程学院 学号:06A12528 姓名:陈毓锋 指导老师:李元庆

实习题1 4、设S N=Σ (1)编制按从大到小的顺序计算S N的程序; (2)编制按从小到大的顺序计算S N的程序; (3)按两种顺序分别计算S1000,S10000,S30000,并指出有效位数。 解析:从大到小时,将S N分解成S N-1=S N-,在计算时根据想要得到的值取合适的最大的值作为首项;同理从小到大时,将S N=S N-1+ ,则取S2=1/3。则所得式子即为该算法的通项公式。 (1)从大到小算法的C++程序如下: /*从大到小的算法*/ #include #include #include using namespace std; const int max=34000; //根据第(3)问的问题,我选择了最大数为34000作为初值 void main(){ int num; char jus; double cor,sub; A: cout<<"请输入你想计算的值"<<'\t'; cin>>num; double smax=1.0/2.0*(3.0/2.0-1.0/max-1.0/(max+1)),temps; double S[max]; // cout<<"s["<num;){ temps=smax; S[n]=temps; n--; smax=smax-1.0/((n+1)*(n+1)-1.0); } cor=1.0/2.0*(3.0/2.0-1.0/num-1.0/(num+1.0)); //利用已知精确值公式计算精确值sub=fabs(cor-smax); //double型取误差的绝对值 cout<<"用递推公式算出来的s["<>jus; if ((int)jus==89||(int)jus==121) goto A; }

计算方法试题库讲解

计算方法 一、填空题 1.假定x ≤1,用泰勒多项式?+??+++=! !212n x x x e n x ,计算e x 的值,若要求截断误差不超过0.005,则n=_5___ 2. 解 方 程 03432 3=-+x -  x x 的牛顿迭代公式 )463/()343(121121311+--+--=------k k k k k k k x x x x x x x 3.一阶常微分方程初值问题 ?????= ='y x y y x f y 0 0)() ,(,其改进的欧拉方法格式为)],(),([21 1 1 y x y x y y i i i i i i f f h +++++= 4.解三对角线方程组的计算方法称为追赶法或回代法 5. 数值求解初值问题的四阶龙格——库塔公式的局部截断误差为o(h 5 ) 6.在ALGOL 中,简单算术表达式y x 3 + 的写法为x+y ↑3 7.循环语句分为离散型循环,步长型循环,当型循环. 8.函数)(x f 在[a,b]上的一次(线性)插值函数= )(x l )()(b f a b a x a f b a b x --+-- 9.在实际进行插值时插值时,将插值范围分为若干段,然后在每个分段上使用低阶插值————如线性插值和抛物插值,这就是所谓分段插值法 10、数值计算中,误差主要来源于模型误差、观测误差、截断误差和舍入误差。 11、电子计算机的结构大体上可分为输入设备 、 存储器、运算器、控制器、 输出设备 五个主要部分。 12、算式2 cos sin 2x x x +在ALGOL 中写为))2cos()(sin(2↑+↑x x x 。 13、ALGOL 算法语言的基本符号分为 字母 、 数字 、 逻辑值、 定义符四大

西安电子科技大学 研究生 电磁场数值分析期末考试题

西安电子科技大学何超 电磁场数值分析 考点1:矩量法的一般过程(算子方程、离散化过程、选配过程、矩阵方程求解)。 给定算子方程和基函数,采用伽略金法,计算阻抗矩阵和激励电压矩阵,从 而求得电流系数矩阵,即得到方程的近似解。(矩阵维数一般为2×2,或3×3, 便于计算)。 1

https://www.360docs.net/doc/b57754205.html,/link?url=oRwkn_6gajdEKC3YUFvvipOKLuZJXnVk43odUwyDWYRao nT1SlZLKEq9PCQba5xPYg_7mXpK8pZW0R-_RfT5EOXLvj0BKqKmQ6cfXMuW8P7 有3个矩量法例题 考点2:ScaLAPACK 的矩阵分布方式。

给定进程网格,矩阵分块大小,要求能写出按ScaLAPACK矩阵分布方式,每个进程对应的矩阵元素。? 1 并行矩阵填充在PC集群系统中MPI并行矩量法研究36 37 考点3:temporary block column 对active block column 分解产生的影响.对于当前活动列块(即正在进行LU分解的列块),要能够分析其左侧临时列块对其LU分解所产生的影响。?英文书写得很详细了啊45--55有 lu分解 将系数矩阵A转变成等价两个矩阵L和U的乘积,其中L和U分别是下三角和上三角矩阵。当A 的所有顺序主子式都不为0时,矩阵A可以分解为A=LU,且当L的对角元全为1时分解唯一。其中L是下三角矩阵,U是上三角矩阵。 4阶矩阵的LU分解[1] 高斯消元法见数值分析教材 考点4:积分方程的建立 要求掌握EFIE 、MFIF 、PMCHW(电场、磁场、表面积分方程)根据等效原理建立的过程,即对于给定的问题(PEC (理想导体)或介质)能根据等效原理建立积分方程(不要求写出场的位函数表达式,主要考察方程建立的思想)。看矩量法

计算方法与实习上机题答案

实习题1 1用两种不容的顺序计算644834.11000 12≈∑=-n n ,分析误差的变化 (1)顺序计算 源代码: #include #include void main() { double sum=0; int n=1; while(1) { sum=sum+(1/pow(n,2)); if(n%1000==0)printf("sun[%d]=%-30f",n,sum); if(n>=10000)break; n++; } printf("sum[%d]=%f\n",n,sum); } 结果: (2)逆序计算 源代码: #include #include void main() { double sum=0; int n=10000; while(1) { sum=sum+(1/pow(n,2));

if(n%1000==0) printf("sum[%d]=%-30f",n,sum); if(n<=1)break; n--; } printf("sum[%d]=%f\n",n,sum); } 结果: 2已知连分数 )) / /(... /( 3 2 2 1 1 n n b a a b a b a b f + + + + = 利用下面的方法计算f: 1 1)0 ,..., 2 ,1 ( , d f n n i d a b d b d i i i i n n = - - = + = = + + 写一个程序,读入n, n n b a,,计算并打印f 源代码: #include #include void main() { int i=0,n; float a[1024],b[1024],d[1024]; printf("please input n,n="); scanf("%d",&n); printf("\nplease input a[1] to a[n]:\n"); for(i=1;i<=n;i++) { printf("a[%d]=",i); scanf("%f",&a[i]);

西电数字信号处理大作业

第二章 2.25 已知线性时不变系统的差分方程为 若系统的输入序列x(x)={1,2,3,4,2,1}编写利用递推法计算系统零状态响应的MATLAB程序,并计算出结果。 代码及运行结果: >> A=[1,-0.5]; >> B=[1,0,2]; >> n=0:5; >> xn=[1,2,3,4,2,1]; >> zx=[0,0,0];zy=0; >> zi=filtic(B,A,zy,zx); >> yn=filter(B,A,xn,zi); >> figure(1) >> stem(n,yn,'.'); >> grid on;

2.28图所示系统是由四个子系统T1、T2、T3和T4组成的,分别用单位脉冲响应或差分方程描述为 T1: 其他 T2: 其他 T3: T4: 编写计算整个系统的单位脉冲响应h(n),0≤n≤99的MATLAB程序,并计算结果。 代码及结果如下: >> a=0.25;b=0.5;c=0.25; >> ys=0; >> xn=[1,zeros(1,99)]; >> B=[a,b,c]; >> A=1; >> xi=filtic(B,A,ys); >> yn1=filter(B,A,xn,xi); >> h1=[1,1/2,1/4,1/8,1/16,1/32]; >> h2=[1,1,1,1,1,1]; >> h3=conv(h1,h2); >> h31=[h3,zeros(1,89)]; >> yn2=yn1+h31; >> D=[1,1];C=[1,-0.9,0.81]; >> xi2=filtic(D,C,yn2,xi); >> xi2=filtic(D,C,ys); >> yn=filter(D,C,yn2,xi); >> n=0:99; >> figure(1) >> stem(n,yn,'.'); >> title('单位脉冲响应'); >> xlabel('n');ylabel('yn');

西安电子科技大学算法上机报告

西安电子科技大学 (2018年度) 算法分析 实 验 报 告 实验名称:渗透实验 班级:1603012 姓名:朱斌 学号:16030120032

实验一:渗透问题(Percolation) 一、实验题目 使用合并-查找(union-find)数据结构,编写程序通过蒙特卡罗模拟(Monte Carlo simulation)来估计渗透阈值的值。 给定由随机分布的绝缘材料和金属材料构成的组合系统:金属材料占多大比例才能使组合系统成为电导体?给定一个表面有水的多孔渗水地形(或下面有油),水将在什么条件下能够通过底部排出(或油渗透到表面)?科学家们已经定义了一个称为渗透(percolation)的抽象过程来模拟这种情况。 模型:我们使用N×N网格点来模型一个渗透系统。每个格点或是open格点或是blocked 格点。一个full site是一个open格点,它可以通过一连串的邻近(左,右,上,下)open格点连通到顶行的一个open格点。如果在底行中有一个full site格点,则称系统是渗透的。(对于绝缘/金属材料的例子,open格点对应于金属材料,渗透系统有一条从顶行到底行的金属路径,且full sites格点导电。对于多孔物质示例,open格点对应于空格,水可能流过,从而渗透系统使水充满open格点,自顶向下流动。) 问题:在一个著名的科学问题中,研究人员对以下问题感兴趣:如果将格点以空置概率p 独立地设置为open格点(因此以概率1-p被设置为blocked格点),系统渗透的概率是多少?当p = 0时,系统不会渗出; 当p=1时,系统渗透。下图显示了20×20随机网格和100×100随机网格的格点空置概率p与渗滤概率。 当N足够大时,存在阈值p*,使得当p p*时,随机N?N网格几乎总是渗透。尚未得出用于确定渗滤阈值p*的数学解。你的任务是编写一个计算机程序来估计p*。

计算方法上机答案

上海电力学院 数值分析上机实验报告 题目:数值分析上机实验报告 学生姓名:11111111111 学号:111111********* 专业:1111 2013年12月30日

数值计算方法上机实习题 1. 设?+=1 05dx x x I n n , (1) 由递推公式n I I n n 1 51+ -=-,从0I 的几个近似值出发,计算20I ; (2) 粗糙估计20I ,用n I I n n 51 511+-=-,计算0I ; (3) 分析结果的可靠性及产生此现象的原因(重点分析原因)。 (1) 解答:n=0, 0.1823)05ln()15ln()5(5151510101 0=+-+=++=+=+=???x d x dx x dx x x I n n 这里可以用for 循环,while 循环,根据个人喜好与习惯: for 循环程序: While 循环程序: I=0.1823; I=0.1823; for n=1:20 i=1; I=(-5)*I+1/n; while i<21 End I=(-5)*I+1/i; I i=i+1; fprintf('I20=%f',I) end I = -2.0558e+009 >> I I20=-2055816073.851284>> I = -2.0558e+009 (2) 粗略估计I 20: Mathcad 计算结果: for 循环程序: While 循环程序: >> I=0.007998; I=0.007998; >> for n=1:20 n=1; I=(-0.2)*I+1/(5*n); while n<21 End I=(-0.2)*I+1/(5*n); >> I n=n+1; I =0.0083 end >> I I =0.0083 (3) 算法误差分析: 计算在递推过程中传递截断误差和舍入误差 第一种算法:(从1——>20) * 000 e I I =- * **21111120 11 5(5)5()555n n n n n n n n n n e I I I I I I e e e n n ------=-=-+ --+=-=== 1 x x 205x +????? d 7.99810 3 -?=

计算方法上机作业集合

第一次&第二次上机作业 上机作业: 1.在Matlab上执行:>> 5.1-5-0.1和>> 1.5-1-0.5 给出执行结果,并简要分析一下产生现象的原因。 解:执行结果如下: 在Matlab中,小数值很难用二进制进行描述。由于计算精度的影响,相近两数相减会出现误差。 2.(课本181页第一题) 解:(1)n=0时,积分得I0=ln6-ln5,编写如下图代码

从以上代码显示的结果可以看出,I 20的近似值为0.7465 (2)I I =∫I I 5+I 10dx,可得∫I I 610dx ≤∫I I 5+I 10dx ≤∫I I 510dx,得 16(I +1)≤I I ≤15(I +1),则有1126≤I 20≤1105, 取I 20=1 105 ,以此逆序估算I 0。代码段及结果如下图所示

(3)从I20估计的过程更为可靠。首先根据积分得表达式是可知,被积函数随着n的增大,其所围面积应当是逐步减小的,即积分值应是随着n的递增二单调减小的,(1)中输出的值不满足这一条件,(2)满足。设I I表示I I的近似值,I I-I I=(?5)I(I0?I0)(根据递推公式可以导出此式),可以看出,随着n的增大,误差也在增大,所以顺序估计时,算法不稳定性逐渐增大,逆序估计情况则刚好相反,误差不断减小,算法逐渐趋于稳定。 2.(课本181页第二题)

(1)上机代码如图所示 求得近似根为0.09058 (2)上机代码如图所示 得近似根为0.09064;

(3)牛顿法上机代码如下 计算所得近似解为0.09091 第三次上机作业上机作业181页第四题 线性方程组为 [1.13483.8326 0.53011.7875 1.16513.4017 2.53301.5435 3.4129 4.9317 1.23714.9998 8.76431.3142 10.67210.0147 ][ I1 I2 I3 I4 ]=[ 9.5342 6.3941 18.4231 16.9237 ] (1)顺序消元法 A=[1.1348,3.8326,1.1651,3.4017;0.5301,1.7875,2.5330,1.5435; 3.4129, 4.9317,8.7643,1.3142;1.2371,4.9998,10.6721,0.0147]; b=[9.5342;6.3941;18.4231;16.9237]; 上机代码(函数部分)如下 function [b] = gaus( A,b )%用b返回方程组的解 B=[A,b]; n=length(b); RA=rank(A); RB=rank(B);

西安电子科技大学出版社计算方法上机答案

西安电子科技大学出版社《计算方法》任传祥等编著第九章计算方法上机参考答案 实验一,算法一 #include #include 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 #include 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 #include #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 #include 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;}

相关文档
最新文档