数值计算方法实验报告.docx
- 文档编号:23081785
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:15
- 大小:314.47KB
数值计算方法实验报告.docx
《数值计算方法实验报告.docx》由会员分享,可在线阅读,更多相关《数值计算方法实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
数值计算方法实验报告
重庆交通大学
学生实验报告
实验课程名称数值计算方法
开课实验室理学院实验室
学院理学院
专业班级09级测绘工程专业1班
学生姓名学号
开课时间2010至2011学年第二学期
评分细则
评分
考勤(10分)
排版格式(10分)
实验程序代码的正确性、完整性(40分)
实验结果及分析(30分)
实验创新(10分)
总成绩
教师签名
张文忠
目录
实验一误差——定积分2
实验二非线性方程求根4
(一)牛顿迭代法4
(二)牛顿下山法5
实验三解线性代数方程组——列主元消元法7
实验四解线性代数方程组——追赶法9
实验五插值与拟合——三次样条差值11
实验一误差——定积分
实验内容:
求解以下积分:
初值
实验过程:
1.利用C语言编程求解,程序如下:
#include
#include
voidmain()
{doubleI=100;
intn=50;
printf("%d,%lf\n",n,I);
while(n>0)
{I=(1-I)/n;
n--;
printf("%d,%lf\n",n,I);
}
}
2.命令窗口中程序结果如下:
实验结果分析:
1.用分部积分法得到递推关系式
,利用初值
,依次算出
的近似值。
2.计算的原理简单,并且程序也不复杂。
3.结果检验分析,将计算结果
与
比较相等,说明程序正确,计算结果可靠,误差在范围内。
实验二非线性方程求根
实验内容:
用牛顿迭代法和牛顿下山法求解方程f(x)=
,取近似值
。
1.牛顿迭代法:
,直到
。
2.牛顿下山法:
,(λ=1
至合适),且直到
|
实验过程:
1.用牛顿迭代法求解
1.1利用C语言编程求解,程序如下:
#include
#include
voidmain()
{doublex=-0.99,y;
intk=0;
printf("%d,%lf\n",k,x);
do
{y=x;
x=x-(x*x*x/3-x)/(x*x-1);
k++;
printf("%d,%lf\n",k,x);
}while(fabs(y-x)>0.00001);
}
1.2.命令窗口结果截屏如下:
2.用牛顿下山法求解
2.1利用C语言编程求解,程序如下:
#include
#include
doublef(doublex)
{
doubles;
s=x*x*x/3-x;
returnfabs(s);
}
voidmain()
{doublex=-0.99,y;
intk=0;
printf("%d,%lf\n",k,x);
do
{y=x;
intn=0;
do{
x=y;
x=x-pow(0.5,n)*(x*x*x/3-x)/(x*x-1);
n++;
}while(f(x)>=f(y));
k++;
printf("%d,%d,%lf\n",k,n-1,x);
}while(fabs(x-y)>0.00001);
}
2.2.命令窗口结果截屏如下:
实验结果分析:
实验中分别用了牛顿迭代、牛顿下山法求根。
迭代法是一种逐次逼近的方法,原理简单、编制程序方便,但是具有是否收敛和收敛速度等问题,不能盲目使用,牛顿法是一种特殊的迭代法,用于求方程单根时具有二阶的收敛速度,但是却对初值有苛刻的要求。
牛顿下山法相对于牛顿下山法要复杂些,但是迭代次数少于牛顿迭代,收敛速度大于牛顿迭代。
∙实验三解线性代数方程组——列主元消元法
实验内容:
用列主元法解线性方程组
=
实验过程:
1.利用C语言编程求解,程序如下:
#include
#include
voidmain()
{doubleb,e,g,h,k,p,d[5],a[4][5];/*a={1.1348,3.8326,1.1651,3.4017,9.5342,0.5301,1.7875,2.5330,1.5435.6.3941,3.4129,4.9317,8.7643,1.3142,18.4231,1.2371,4.9998,10.6721,0.0147,16.9237};*/
inti1,j1,c,i,j,f,q,r,s;
for(i1=0;i1<4;i1++)
for(j1=0;j1<5;j1++)
scanf("%lf",&a[i1][j1]);
for(j=0;j<4;j++)
{for(i=j,b=a[i][j],c=j;i<3;i++)
{if(fabs(b)<=fabs(a[i+1][j]))
b=a[i+1][j];
c=i+1;}
for(q=0;q<5;q++)
d[q]=a[c][q];
for(r=0;r<5;r++)
a[c][r]=a[j][r];
for(s=0;s<5;s++)
a[j][s]=d[s];
for(i=j+1,e=a[i][j]/a[j][j];i<4;i++)
{for(f=j;f<5;f++)
{a[i][f]=a[i][f]-e*a[i-1][f];};};}
g=a[3][4]/a[3][3];
h=(a[2][4]-g*a[2][3])/a[2][2];
k=(a[1][4]-g*a[1][3]-h*a[1][2])/a[1][1];
p=(a[0][4]-g*a[0][3]-h*a[0][2]-k*a[0][1])/a[0][0];
printf("x1=%lf\nx2=%lf\nx3=%lf\nx4=%lf\n",p,k,h,g);
}
2.命令窗口结果截屏如下:
实验结果分析:
1.列主元消元法实质上是一种允许行交换的消元法,它与顺序消元法相比较,主要的特点是在进行第k次消元计算前,不管对角线上的值
是否为0,均在子块的第一列中选一个元
,使|
|=
。
2.列主元选择绝对值尽可能大的元作约化的主元,减少了计算过程中的舍入误差对解的影响。
3.把计算结果和精确解比较,所得计算是比较准确的。
实验四解线性代数方程组——追赶法
实验内容:
,
用追赶法解三角方程组Ax=d,
,d=
实验过程:
1.利用C语言编程求解,程序如下:
#include
voidmain()
{doublea[4],b[5],t[4],d[5],g[4],y[5],x[5];
inti;
for(i=0;i<4;i++)
scanf("%lf",&t[i]);
for(i=0;i<5;i++)
scanf("%lf",&b[i]);
for(i=1;i<5;i++)
scanf("%lf",&a[i]);
for(i=0;i<5;i++)
scanf("%lf",&d[i]);
g[0]=t[0]/b[0];
for(i=1;i<=3;i++)g[i]=t[i]/(b[i]-a[i]*g[i-1]);
y[0]=d[0]/b[0];
for(i=1;i<=4;i++)y[i]=(d[i]-a[i]*y[i-1])/(b[i]-a[i]*g[i-1]);
x[4]=y[4];
for(i=3;i>=0;i--)x[i]=y[i]-g[i]*x[i+1];
for(i=0;i<=4;i++)printf("x[%d]=%lf\n",i+1,x[i]);
}
2.命令窗口结果截屏如下:
实验结果分析:
追赶法实现A=LU分解,解出L,U。
然后解方程组LY=f,解出Y,再根据UX=Y,解出根。
用追赶法解方程组仅需要5n-4次乘除法运算,且计算过程稳定,在编程程序计算时,只需五个一维数组分别存储初始数据
,算得的
可放在
对应的位置上,
可存放在
对应的位置上。
实验五插值与拟合——三次样条差值
实验内容:
已知直升机旋转机翼外形曲线轮廓线上的某些点及端点处的一阶导数值,是S0=1.8648,S19=-0.046115
试计算该曲线的横坐标为
2,4,6,12,16,30,60,110,180,280,400,515
该点处的纵坐标(要求该曲线具有二阶光滑度)。
k
0
1
2
3
4
5
6
0.52
3.1
8.0
17.95
28.65
39.62
50.65
5.28794
9.4
13.84
20.2
24.9
28.44
31.1
k
7
8
9
10
11
12
78
104.6
156.6
208.6
260.7
312.5
35
36.5
36.6
34.6
31.6
31.0
k
13
14
15
16
17
18
364.4
416.3
468
494
507
520
20.9
14.8
7.8
3.7
1.5
0.2
实验过程:
1.利用C语言编程求解,程序如下:
#include
#include
voidmain()
{doubleS0,S19,x[19],y[19],h[18],u[17],t[17],g[19],a[19],k[19],c[19],j[18],n[18],m[19],r,s;
inti,t1;
scanf("%lf",&S0);
scanf("%lf",&S19);
for(i=0;i<19;i++)scanf("%lf\n",&x[i]);
for(i=0;i<19;i++)scanf("%lf\n",&y[i]);
for(i=0;i<=17;i++)h[i]=x[i+1]-x[i];
for(i=0;i<=17;i++)u[i]=h[i]/(h[i]+h[i+1]);
for(i=0;i<=16;i++)t[i]=1-u[i];
for(i=1;i<=16;i++)g[i]=6/(h[i-1]+h[i])*((y[i+1]-y[i])/h[i]-(y[i]-y[i-1])/h[i-1]);
g[0]=6/h[0]*((y[1]-y[0])-S0);
g[18]=6/h[18]*(S19-(y[18]-y[17])/h[17]);
a[0]=0.0;
for(i=1;i<=17;i++)a[i]=u[i-1];a[i]=1.0;
for(i=0;i<19;i++)k[i]=2.0;
c[0]=1.0;
for(i=1;i<=17;i++)c[i]=t[i-1];
j[0]=c[0]/k[0];
for(i=1;i<=17;i++)j[i]=c[i]/(k[i]-a[i]*j[i-1]);
n[0]=g[0]/k[0];
for(i=1;i<=18;i++)n[i]=(g[i]-a[i]*n[i-1])/(k[i]-a[i]*j[i-1]);
m[18]=n[18];
for(i=17;i>=0;i--)m[i]=n[i]-j[i]*n[i+1];
for(i=0;i<=18;i++)printf("m[%d]=%lf\n",i,m[i]);
for(t1=1;;t1++)
{scanf("%lf",&r);
for(i=0;i<=17;i++)
{if(r>=x[i]&&r<=x[i+1])
{s=m[i]*pow(x[i+1]-r,3)/6*h[i]+m[i+1]*pow(r-x[i],3)/6*h[i]+(y[i]-m[i]*pow(h[i],2)/6)*(x[i+1]-r)/h[i]+(y[i+1]-m[i+1]*pow(h[i],2)/6)*(r-x[i])/h[i];
printf("s%lf=%lf\n",r,s);}
}
}
}
2.命令窗口结果截屏如下:
实验结果分析:
1.三次样条差值不仅保留了分段低次插值的各种优点,具有计算简陋、收敛性有保证、数值稳定性好且易在计算机上实现等优点,而且还此基础上可以保证整条曲线的光滑性,在许多领域里得到越来越广泛的运用。
2.从结果来看,程序正确。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 计算方法 实验 报告