数值分析计算方法Word文件下载.docx

上传人:b****6 文档编号:20550791 上传时间:2023-01-24 格式:DOCX 页数:16 大小:61.03KB
下载 相关 举报
数值分析计算方法Word文件下载.docx_第1页
第1页 / 共16页
数值分析计算方法Word文件下载.docx_第2页
第2页 / 共16页
数值分析计算方法Word文件下载.docx_第3页
第3页 / 共16页
数值分析计算方法Word文件下载.docx_第4页
第4页 / 共16页
数值分析计算方法Word文件下载.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

数值分析计算方法Word文件下载.docx

《数值分析计算方法Word文件下载.docx》由会员分享,可在线阅读,更多相关《数值分析计算方法Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。

数值分析计算方法Word文件下载.docx

for(n=10000;

n>

=1;

n--)

s+=1.0/(n*n);

反序求和结果是:

}

#单精度型#

floats=0;

%f\n"

 

4.运行结果:

双精度型运行结果:

单精度型运行结果:

5.对算法的理解与分析:

舍入误差在计算机中会引起熟知的不稳定,算法不同,肯结果也会不同,因此选取稳定的算法很重要。

选取双精度型数据正反序求和时结果一致,但选用单精度型数据时,求和结果不一致,明显正序求和结果有误差,所以第一个算法较为稳定可靠。

二.实验二:

1、拉格朗日插值

按下列数据

x

-3.0

-1.0

1.0

2.0

3.0

y

1.5

作二次插值,并求x

=-2,x

=0,x

=2.75时的函数近似值

2牛顿插值

0.30

0.42

0.50

0.58

0.66

0.72

1.04403

1.08462

1.11803

1.15603

1.19817

1.23223

作五次插值,并求x

=0.46,x

=0.55,x

=0.60时的函数近似值.

通过拉格朗日插值和牛顿插值的实例,了解两种求解方法,并分析各自的优缺点。

拉格朗日插值:

#definek2

doubleL,Y,a;

doublex[3];

doubley[3];

for(intp=0;

p<

=2;

p++)

scanf("

%lf%lf"

&

x[p],&

y[p]);

for(intq=0;

q<

q++)

{

Y=0;

%lf"

a);

for(intj=0;

j<

=k;

j++)

L=1;

for(inti=0;

i<

i++)

if(i!

=j)

L*=(a-x[i])/(x[j]-x[i]);

Y+=L*y[j];

}

x=%lf的函数值是:

a,Y);

牛顿插值:

inti,j;

doublea[6][6],y,s,x;

for(j=0;

for(i=0;

6;

scanf("

a[i][j]);

for(j=2;

=5;

for(i=j-1;

a[i][j]=(a[i][j-1]-a[i-1][j-1])/(a[i][0]-a[i-j+1][0]);

for(intk=0;

k<

3;

k++)

x);

y=0;

5;

{

s=a[i][i+1];

for(j=i-1;

j>

=0;

j--)

s*=x-a[j][0];

y+=s;

}

printf("

结果是:

y);

拉格朗日运行结果:

牛顿插值运行结果:

(1)拉格朗日插值:

该公式是对一系列点加权求和。

内插通常优于外推。

选择的区间包括x,插值效果越好,高次插值通常优于低次插值,但并不是意味着插值次数越高越好。

优点:

编程容易实现。

缺点:

如果发现当前的插值方法不够精确,就要增加插值节点的个数。

拉格朗日基函数每一个都要重新计算,效率低。

(2)牛顿插值:

如果当前插值方法不稳定,需要增加插值节点个数,只需要计算新家节点所增加的差商即可,之前的计算结果可以被复用,比拉格朗日插值节省计算量,效率高,精度高,更为稳定。

三.实验三:

分别用复化梯形公式和复化辛卜生公式计算f(x)=sin(x)/x的积分,并与准确值比较判断精度。

通过实例体会各种算法的精度。

熟练掌握复化梯形,复化辛普森,复化柯特斯求积方法的程序。

复化梯形:

fc(x)=sinx/x,N等分,a,b是积分区间;

令s=fc(a)+fc(b),

对于i=a+1.0/N,a+2.0/N,.....(i<

b)

s+=2*fc(i);

s*=double(b-a)/(2*N);

输出s;

复化辛普森:

对于i=a+0.5/N,a+1.5/N,.....(i<

s+=4*fc(i);

s*=double(b-a)/(6*N);

输出s;

复化柯特斯:

对于i=a+1.0/(4*N),a+2.0/(4*N),.....(i<

s+=32*fc(i);

对于i=a+2.0/(4*N),a+6.0/(4*N),.....(i<

s+=12*fc(i);

s+=14*fc(i);

s*=double(b-a)/(90*N);

math.h>

#defineN8

#definea0

#defineb1

doublefc(doublex)

doubley;

y=sin(x)/x;

returny;

voidtx()

doubles,i;

s=fc(a)+fc(b);

for(i=a+1.0/N;

b;

i+=1.0/N)

s+=2*fc(i);

s*=double(b-a)/(2*N);

复合梯形8等分求积结果是:

voidxps()

for(i=a+0.5/N;

s+=4*fc(i);

s*=double(b-a)/(6*N);

复合辛普森8等分求积结果是:

voidkts()

for(i=a+1.0/(4*N);

i+=2.0/(4*N))

s+=32*fc(i);

for(i=a+2.0/(4*N);

s+=12*fc(i);

s+=14*fc(i);

s*=double(b-a)/(90*N);

复合柯特思斯8等分求积结果是:

chard;

scanf("

%c"

d);

if(d=='

t'

tx();

x'

xps();

k'

kts();

他们都适用于求数值积分,而且都能提高计算的精度,他们都是在每个小区间上在使用梯形,辛普森,柯特斯求积公式,其中复化辛普森和复化柯特斯的收敛速度较快。

四.实验四:

用改进欧拉方法解初值问题y’=x+y;

y(0)=1。

0<

x<

1,取步长h=0.1计算,并与准确值y=-x-1-2ex相比较。

(p141习题第二题2)

熟悉常微分方程初值问题的求解方法;

熟悉其算法;

5.实验五:

分别用下列方法求f(x)=x3-3x-1=0在x0=2附近的根。

根的准确值为x*=1.87938524…,要求准确到四位有效数字,并对比各种算法的计算量。

(1)二分法;

(2)简单迭代法;

(3)牛顿迭代法

通过对二分法,简单迭代法和牛顿迭代法的编程和上机实验,进一步体会他们在方程求根中的不同特点;

比较三者的计算速度和计算精度。

二分法:

给定区间[a,b],e=pow(10,-4)*0.5

(1)令c=(a+b)/2,保持b-a<

e;

(2)如果f(c)*f(a)=0,输出c;

如果f(c)*f(a)<

0,b=c,执行

(1)

否则a=c,执行

(1)

简单迭代法:

y=x*x*x-3*x-1;

voidmain(void)

doublefa=fc

(1),fb=fc(3),a=1,b=3,f,x0;

intk=0;

for(;

b>

a&

&

b-a>

=pow(10,-4)*0.5;

f=fc((a+b)/2);

if(f==0)

x0=(a+b)/2;

break;

else

if(fa*f<

0)

b=(a+b)/2;

else

a=(a+b)/2;

k++;

x0=(a+b)/2;

近似根是:

%lf准确根是:

1.87938524\n"

x0);

迭代次数是:

%d\n"

k);

}

doubleIterate1(doublex)

y=pow((3*x+1),1.0/3);

doubleDerivative1(doublex)

y=pow((3*x+1),-2.0/3);

doubleIterate2(doublex)

y=(1-x*x*x)/3.0;

doubleDerivative2(doublex)

y=-x*x;

doubleIterate3(doublex)

y=(3*x+1)/(x*x);

doubleDerivative3(doublex)

y=(-3*x-2)/(x*x*x);

doublex2=2.0,x1;

doublea1=Derivative1(x2);

if(fabs(a1)<

1)

迭代公式是x=pow((3*x+1),1.0/3);

\n"

);

do

{

x1=x2;

x2=Iterate1(x1);

k++;

}while(fabs(x2-x1)>

=pow(10,-4)*0.5);

x1);

doublea2=Derivative2(x2);

if(fabs(a2)<

迭代公式是x=(1-x*x*x)/3.0;

x1=x2;

x2=Iterate2(x1);

doublea3=Derivative3(x2);

if(fabs(a3)<

迭代公式是x=(3*x+1)/(x*x);

x2=Iterate3(x1);

}

牛顿迭代法:

doubleIterate(doublex)

doubleDerivative(doublex)

y=3*x*x-3;

doublex0=2.0,x1;

doublef0,f01,f1,f11;

f0=Iterate(x0);

f01=Derivative(x0);

x1=x0-f0/f01;

fabs(x0-x1)>

f0=f1,f01=f11)

x0=x1;

x1=x0-f0/f01;

f1=Iterate(x1);

f11=Derivative(x1);

k++;

if(f11==0)

printf("

牛顿迭代法失效\n"

二分法运行结果:

简单迭代法运行结果:

牛顿迭代法运行结果:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1