数值分析计算方法Word文件下载.docx
《数值分析计算方法Word文件下载.docx》由会员分享,可在线阅读,更多相关《数值分析计算方法Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
![数值分析计算方法Word文件下载.docx](https://file1.bdocx.com/fileroot1/2023-1/23/51791d56-2516-41c9-9ac2-a340c4b66871/51791d56-2516-41c9-9ac2-a340c4b668711.gif)
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"
二分法运行结果:
简单迭代法运行结果:
牛顿迭代法运行结果: