计算机数值方法实验报告.docx
- 文档编号:8219252
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:38
- 大小:521.11KB
计算机数值方法实验报告.docx
《计算机数值方法实验报告.docx》由会员分享,可在线阅读,更多相关《计算机数值方法实验报告.docx(38页珍藏版)》请在冰豆网上搜索。
计算机数值方法实验报告
2011级4班雷小慧(2011060115)计算机数值方法
实验报告成绩册
姓名:
雷小慧
学号:
201106115
成绩:
实验编号
实验名称
实验学时
实验成绩
实验一
Lagrange插值
2
实验二
Newton插值
2
实验三
分段插值
2
实验四
龙贝格算法
2
实验五
二分法求根
2
实验六
牛顿迭代法求根
2
实验七
Courant分解法
2
实验八
R-K方法求解初值问题
2
数值计算方法与算法实验报告
学期:
2012至2013_第2学期时间:
2013年5月22日
课程名称:
_数值计算方法与算法专业:
数学与应用数学班级:
2011级4班
实验编号:
1实验项目:
lagrange插值多项式指导教师_孙峪怀
姓名:
雷小慧学号:
2011060115实验成绩:
一、实验目的及要求
实验目的:
体会使用Lagrange插值基函数构造插值多项式的特点,熟悉使用一次或二次Lagrange插值多项式近似函数y=f(x)的算法。
掌握Lagrange插值多项式近似函数f(x)的误差表达式,并会熟练应用。
实验要求:
1.给出一次、二次Lagrange插值算法
2.用C语言实现算法
二、实验内容
用下列插值节点数据,构造一次和二次Lagrange插值多项式,并计算f(11.5),f(12.5)的值。
(f(x)=sinx)
x
11
12
13
F(x)
0.190809
0.207912
0.224951
要求:
所需数据都从键盘读入,最后输出结果.
三、实验步骤(该部分不够填写.请填写附页)
1.算法分析:
下面用伪码描述Lagrange插值多项式的算法:
Step1输入:
插值节点控制数n,插值点序列(xi,yi),i=0,1,……n,,要计算的函数
点x.
Step2fori=0ton/*控制Lagrange基函数序列*/
{{
forj=0ton
/*对于给定x,计算Lagrange函数li(x)=
*/
if(j<>i)li(x)=li(x)*(x-xj)/(xi-xj);
}
Ln(x)=Ln(x)+li(x)*yi/*计算Ln(x)=
*/
}
2.用C语言实现算法的程序代码
#include
#defineMAX_N20/*定义点的最大个数为20*/
typedefstructtagPOINT/*对点的结构化定义,一个点包括x和y*/
{
doublex;
doubley;
}POINT;
intmain(void)
{
intn;/*n表示输入的点的个数,大于0小于20*/
inti,j,k;
POINTpoints[MAX_N+1];
doublex,temp,Lagrange=0;
clrscr();
printf("\nPleaseinputnvalue:
");
scanf("%d",&n);
if(n>MAX_N)
{
printf("TheinputnislargerthanMAX_N,pleaseredfinetheMAX_N.\n");
return1;
}
if(n<=0)
{
printf("Pleaseinputanumberbetween1and%d.\n",MAX_N);
return1;
}
printf("Nowinputthe(x_i,y_i),i=0,...,%d:
\n",n);/*输入每个点的x和y*/
for(i=0;i { scanf("%lf,%lf",&points[i].x,&points[i].y); } printf("Nowinputthexvalue: ");/*输入要求的x值*/ scanf("%lf",&x); for(k=0;k { temp=1; for(j=0;j { if(k! =j) { temp=temp*(x-points[j].x)/(points[k].x-points[j].x); } } Lagrange=Lagrange+temp*points[k].y; } printf("Lagrange(%lf)=%lf\n",x,Lagrange);/*输出结果*/ return0; } 3.在TC环境中运行如下: 4.运行结果: F(11.5)的结果是: F(12.5)的结果是: 数值计算方法与算法实验报告 学期: 2012至2013_第2学期时间: 2013年5月22日 课程名称: _数值计算方法与算法专业: 数学与应用数学班级: 2011级4班 实验编号: 2实验项目: Newton插值多项式指导教师__孙峪怀 姓名: 雷小慧学号: 2011060115实验成绩: 1、实验目的及要求 实验目的: 掌握Newton插值多项式的算法,理解Newton插值多项式构造过程中基函数的继承特点,掌握差商表的计算特点。 实验要求: 1.给出Newton插值算法 2.用C语言实现算法 二、实验内容 1.用下列插值节点数据,构造Newton插值多项式,并计算N2(0.9),N3(0.9)的值。 x -2 0 1 2 f(x) 17 1 2 19 要求: 所需数据都从键盘读入,最后输出结果. 2.用下列插值节点数据,构造一个三次Newton插值多项式,并计算f(1.2)的值。 x -1.00 2.00 3.00 4.00 f(x) 3.00 5.00 7.00 5.00 三、实验步骤(该部分不够填写.请填写附页) 1.算法分析: 下面用伪码描述Lagrange插值多项式的算法: Step1输入插值节点数n,插值点序列{x(i),f(i)},i=1,2,……,n,要计算的插值点x. Step2形成差商表 fori=0ton forj=ntoif(j)=((f(j)-f(j-1)/(x(j)-x(j-1-i)); Step3置初始值temp=1,newton=f(0) Step4fori=1ton temp=(x-x(i-1))*temp/*由temp(k)=(x-x(k-1))*temp(k-1)形成(x-x(0).....(x-x(i-1)*/ Newton=newton+temp*f(i); Step5输出f(x)的近似数值newton(x)=newton. 5.用C语言实现算法的程序代码 #include #defineMAX_N20/*点的最大个数为20*/ typedefstructtagPOINT/*结构化定义点包括x和y*/ { doublex; doubley; }POINT; intmain(void) { intn,n1,i,j; POINTpoints[MAX_N+1]; doublex,tmp,newton=0; clrscr(); printf("\nPleaseinputnvalue: "); scanf("%d",&n); printf("\nPleaseinputthetimeofnewton: ");/*输入牛顿插值的阶数*/ scanf("%d",&n1); if(n>MAX_N) { printf("TheinputnislargerthanMAX_N,pleaseredefinetheMAX_N.\n"); return1; } if(n<=0) { printf("Pleaseinputanumberbetween1and%d.\n",MAX_N); return1; } printf("Nowinputthe(xi,yi),i=0,...,%d: \n",n); for(i=0;i { scanf("%lf,%lf",&points[i].x,&points[i].y); } printf("Nowinputthexvalue: "); scanf("%lf",&x); for(i=0;i { for(j=n-1;j>i;j--) { points[j].y=((points[j].y-points[j-1].y)/(points[j].x-points[j-1-i].x)); } } tmp=1; newton=points[0].y; for(i=0;i { tmp=tmp*(x-points[i].x); newton=newton+tmp*points[i+1].y; } printf("newton(%lf)=%lf\n",x,newton); return0; } 6.在TC环境中运行如下: 7.运行结果 1.N2(0.9)的运行结果是: N3(0.9)的运行结果是: 2.f(1.2)的运行结果是: 数值计算方法与算法实验报告 学期: 2012至2013_第2学期时间: 2013年5月22日 课程名称: _数值计算方法与算法专业: 数学与应用数学班级: 2011级4班 实验编号: 3实验项目: 分段插值多项式指导教师__孙峪怀 姓名: 雷小慧学号: 2011060115实验成绩: 一、实验目的及要求 实验目的: 1.体会分段低次插值在不增加结点的情况下,提高插值精度的思想和这种用低代价换取高回报的手段。 2.熟练掌握分段一次、分段二次插值多项式公式; 3.掌握分段插值多项式算法设计的特点。 实验要求: 1.给出分段一次、二次插值算法; 2.用C语言实现算法 二、实验内容 用下列插值节点数据,构造分段线性插值多项式,并计算f(1.075),f(1.175)的值。 x 1.05 1.10 1.15 1.20 F(x) 2.12 2.20 2.17 2.32 三、实验步骤(该部分不够填写.请填写附页) 1.算法分析: 下面用伪码描述分段插值多项式的算法: Step1输入插值节点数n,插值点序列{x(i),f(i)},i=1,2,……,n,要计算的插 值点x. Step2将输入的插值点x与每一个点对应的x作比较,比较出比它大的时完成。 fori=0ton if(x { a=points[i-1].x; f1=points[i-1].y; b=points[i].x; f2=points[i].y; break; } Step3输出值 2.用C语言实现算法的程序代码 #include #defineMAX_N20/*定义的点的最大个数为20*/ typedefstructtagPOINT/*结构化定义点,包括x和y*/ { doublex; doubley; }POINT; intmain(void) { intn,i,j; POINTpoints[MAX_N+1]; doublex,a,b,P,f1,f2; clrscr(); printf("Pleaseinputnvalue: \n"); scanf("%d",&n); if(n>MAX_N) { printf("TheinputnislargerthanMAX_N,pleaseredefinetheMAX_N.\n"); return1; } if(n<=0) { printf("Pleaseinputanumberbetween1and%d.\n",MAX_N); return1; } printf("Nowinputthe(xi,yi),i=0,...,%d: \n",n); for(i=0;i { scanf("%lf,%lf",&points[i].x,&points[i].y); } printf("Nowinputthexvalue: "); scanf("%lf",&x); if(x 最后一个点的x大时*/ { printf("Inputxvalueerror! "); exit(0); } for(i=0;i { if(x { b=points[i].x; f2=points[i].y; a=points[i-1].x; f1=points[i-1].y; break; } } P=((x-b)/(a-b))*f1+((x-a)/(b-a))*f2;/*插值函数*/ printf("\nShowtheresult: %f",P); } 3.用C语在TC环境中运行如下: 3.运行结果 f(1.075)的运行结果是: f(1.175)的运行结果是: 数值计算方法与算法实验报告 学期: 2012至2013_第2学期时间: 2013年5月29日 课程名称: _数值计算方法与算法专业: 数学与应用数学班级: 2011级4班 实验编号: 4实验项目: romberg算法指导教师__孙峪怀 姓名: 雷小慧学号: 2011060115实验成绩: 一、实验目的及要求 实验目的: 熟练掌握数值积分的基本思想和动手推导积分公式的能力,并写出自己设计的变步长算法,用此算法解决实际问题。 主要锻炼分析问题及对数值方法产生的误差在实际执行算法中的变化,体会事前误差和事后误差的不同之处。 实验要求: 写出Romberg算法的描述,并用次算法计算下列定积分的值,要求满足给定误差。 二、实验内容。 (1)用变步长的Romberg方法计算定积分: 给定误差限为 三、实验步骤(该部分不够填写.请填写附页) 1.算法分析: 下面用伪码描述Romberg的算法: Sstep1输入区间端点a,b,精度控制值e,循环次数M,定义函数f(x),取n=1, h=b-a; Step2R1,1=(f(a)+f(b))*h/2; Step3fork=2toM {Rk,1=(R(k-1),1+h(k-1)* /* */ forj=2tok { } if 退出循环 } Step4输出 . 2.用C语言实现算法的程序代码 #include #include #definef(x)(sin(x))/*定义的函数sin(x)*/ #defineN_H20 #defineMAXREPT10/*循环的最大次数*/ #definea0.0/*积分的下线*/ #defineb1.0/*积分的下线*/ #defineepsilon0.0005/*误差值*/ doublecomputeT(doubleaa,doublebb,longintn)/*复化梯形公式*/ inti; doublesum=0,h=(bb-aa)/n; for(i=1;i sum+=f(aa+i*h); sum+=(f(aa)+f(bb))/2; return(h*sum); } intmain(void) { inti; longintn=N_H,m=0; doubleT[MAXREPT+1][2]; clrscr(); T[0][1]=computeT(a,b,n); n*=2; for(m=1;m { for(i=0;i { T[i][0]=T[i][1]; } T[0][1]=computeT(a,b,n);/*计算T^{m-1}(h/2)*/ n*=2; for(i=1;i<=m;i++) { T[i][1]=T[i-1][1]+(T[i-1][1]-T[i-1][0])/(pow(2,2*m)-1); if((T[m-1][1] { printf("TheIntegrateis%lf\n",T[m][1]); return; } } } printf("Returnnosolved...\n"); } 3.在TC环境中运行如下: 4.运行结果: 数值计算方法与算法实验报告 学期: 2012至2013_第2学期时间: 2013年5月29日 课程名称: _数值计算方法与算法专业: 数学与应用数学班级: 2011级4班 实验编号: 5实验项目: 二分法求根指导教师__孙峪怀 姓名: 雷小慧学号: 2011060115实验成绩: 一、实验目的及要求 实验目的: 熟练掌握使用对分法求解非线性方程的根 实验要求: 写出二分法的算法描述并使用C语言实现二分法。 二、实验内容 已知 ,用二分法求f(x)在[0,1]上的根。 三、实验步骤(该部分不够填写.请填写附页) 1.算法分析: 计算f(x)=0的一般计算步骤: Step1输入求根区间[a,b]和误差控制量 ,定义函数f(x), if(f(a)f(b)<0then做step2 else选用其他求根方法 Step2while|a-b|> 时 计算中点x=(a+b)/2以及f(x)的值。 分情况处理 |(f(x)|< : 停止计算x*=x,转向step4 f(a)*f(x)<0: 修正区间[a,x]->[a,b] f(x)*f(b)<0: 修正区间[x,b]->[a,b] Endwhile Step3x*=(a+b)/2 Step4输出近似根x* 2.用C语言实现算法的程序代码 #include #include #definef(x)(x*x*x+x*x-1)/*f(x)函数*/ #defineepsilon0.001/*求解精度*/ intmain(void) { doublex,a=0,b=1; clrscr(); if(f(a)*f(b)<0)/*用二分法求解根*/ { while(a-b>epsilon||a-b<-epsilon) { x=(a+b)/2; if(f(x) { printf("\nThe%fvalueis%f",x,f(x));/*输出根和根对应的函数值*/ break; } if(f(a)*f(x)<0)/*修正区间*/ { printf("\na=%fb=%ff(x)=%f",a,b,f(x));/*输出修正前的区间*/ b=x; } if(f(x)*f(b)<0)/*修正区间*/ { printf("\na=%fb=%ff(x)=%f",a,b,f(x)); a=x; } } } else { printf("Don'tcanclution! "); } return0; } 3.在TC环境中运行如下: 4.运行结果: 当a=0,b=1时的结果: 数值计算方法与算法实验报告 学期: 2012至2013_第2学期时间: 2013年5月29日 课程名称: _数值计算方法与算法专业: 数学与应用数学班级: 2011级4班 实验编号: 6实验项目: newton迭代指导教师__孙峪怀 姓名: 雷小慧学号: 2011060115实验成绩: 一、实验目的及要求 实验目的: 熟练掌握使用牛顿迭代法求解非线性方程的根 实验要求: 写出牛顿迭代的算法描述并使用C语言实现牛顿迭代法。 二、实验内容 已知方程x^2-11=0,在x0=4附近的根。 三、实验步骤(该部分不够填写.请填写附页) 1.算法描述: Step1定义函数f(x),g(x),输入迭代初始值x0和控制精度epsilon Step2fork=1toMAXREPT x1=g(x0)/*g(x)=x-f(x)/f'(x)*/ if(|x1-x0| then{输出满足给定精度的近似解x1,结束} x0=x1; endfor Step3输出: 在x0附近f(x)无根 3.用C语言实现算法的程序代码 #include #include #definef(x)(x*x-11) #defineg(x)(0.5*(x+11/x))/*g(x)=x-f(x)/f'(x)*/ #defineMAXREPT1000/*循环的最大次数*/ #defineepsilon0.0001/*精度为0.0001*/ #definex04/*迭代初始值为4*/ intmain(void) { inti; doublex_k1,x_k0=x0; clrscr(); for(i=1;i { x_k1=g(x_k0); if(x_k1-x_k0 { printf("\nThevalueis%f",x_k1);/*输出在4附近的近似根*/ break; } else { printf("\nx_k1=%f",x_k1); x_k0=x_k1; x_k1=g(x_k0); } } return0; } 5.在TC环境中运行如下: 数值计算方法与算法实验报告 学期: 2012至2013_第2学期时间: 2013年5月29日 课程名称: _数值计算方法与算法专业: 数学与应用数学班
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 数值 方法 实验 报告