数值计算基础实验指导书及代码DOC.docx
- 文档编号:11294722
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:30
- 大小:167.65KB
数值计算基础实验指导书及代码DOC.docx
《数值计算基础实验指导书及代码DOC.docx》由会员分享,可在线阅读,更多相关《数值计算基础实验指导书及代码DOC.docx(30页珍藏版)》请在冰豆网上搜索。
数值计算基础实验指导书及代码DOC
数值计算基础
实验指导书
2013年
目录
实验一直接法解线性方程组的1
实验二插值方法4
实验三数值积分6
实验四常微分方程的数值解8
实验五迭代法解线性方程组与非线性方程10
实验一直接法解线性方程组
一、实验目的
掌握列选主元消去法与追赶法解线性方程组。
二、实验内容
分别写出Guass列选主元消去法与追赶法的算法,编写程序上机调试出结果,要求所编程序适用于任何一解线性方程组问题,即能解决这一类问题,而不是某一个问题。
实验中以下列数据验证程序的正确性。
1、用Guass列选主元消去法求解方程组
2、用追赶法求解方程组
三、实验仪器设备与材料
主流微型计算机
四、实验原理
1、Guass列选主元消去法
对于AX=B
1)、消元过程:
将(A|B)进行变换为
,其中
是上三角矩阵。
即:
k从1到n-1
a、列选主元
选取第k列中绝对值最大元素
作为主元。
b、换行
c、归一化
d、消元
2)、回代过程:
由
解出
。
#include
#include
#include
#include
#defineN3
#defineEPS1.0e-4
doublea[N][N],b[N],c[N][N],d[N][N];
voidswap(double&a,double&b)//换行
{
doubletemp;
temp=a;
a=b;
a=temp;
}
voidgauss(doublea[][N],doubleb[N])//gauss求解
{
inti,j,k,l;
doubletemp,m;
for(k=0;k<=N-2;k++)
{
temp=fabs(a[k][k]);//选主元
l=k;
for(i=k+1;i { if(fabs(a[i][k]>temp))//fabs为取绝对值函数。 包含在头文件math.h中 { temp=fabs(a[i][k]); l=i; } } if(fabs(a[l][k]) { printf("方程有无数组解! "); exit(0); } if(l! =k)//换行 { for(j=k;j<=N-1;j++) swap(a[l][j],a[k][j]); swap(b[l],b[k]); } for(i=k+1;i { m=a[i][k]/a[k][k];//行乘数 for(j=k;j a[i][j]-=m*a[k][j]; b[i]-=m*b[k]; } } if(a[N-1][N-1]==0)//矩阵行列式值为0 { printf("矩阵的行列式为0! \n"); exit(-1); } b[N-1]/=a[N-1][N-1]; for(i=N-2;i>=0;i--) { for(j=N-1;j>i;j--) b[i]-=a[i][j]*b[j]; b[i]/=a[i][i]; } } voidmain() { inti; doublea[][N]={{2.5,2.3,-5.1},{5.3,9.6,1.5},{8.1,1.7,-4.3}}; doubleb[]={3.7,3.8,5.5}; gauss(a,b);//高斯求解法 for(i=0;i printf("X%d=%.4f\n",i+1,b[i]); } 2、追赶法 线性方程组为: 做LU分解为: 分解公式: 则 回代公式: #include #defineN5 doublea[N][N],f[N],u[N][N],l[N][N],y[N]; voidzhuigan(doublea[][N],doublef[N]){ inti;doublex[N]={0,0,0,0}; l[0][0]=a[0][0]; for(i=0;i if(l[i][i]! =0) break; else printf("无解! "); } for(i=1;i<=N-1;i++){ l[i][i-1]=a[i][i-1]; l[i][i]=a[i][i]-l[i][i-1]*u[i-1][i]; u[i-1][i]=a[i-1][i]/l[i-1][i-1]; } y[0]=f[0]/l[0][0]; for(i=1;i<=N-1;i++) y[i]=(f[i]-l[i][i-1]*y[i-1])/l[i][i]; x[N-1]=y[N-1]; for(i=N-2;i>=0;i--) x[i]=y[i]-u[i][i+1]*x[i+1]; for(i=0;i<=N-1;i++) printf("%.5lf\n",x[i]); } voidmain(){ doublea[][N]={{-2,0,0,0,0},{1,-2,0,0,0},{0,1,-2,0,0},{0,0,1,-2,0},{0,0,0,1,-2}}; doublef[]={-10,0,0,0,0}; printf("x的值依次为: \n"); zhuigan(a,f); } 五、实验步骤 1、理解并掌握列选主元消去法与追赶法; 2、画出列选主元消去法与追赶法的流程图 3、使用C语言编写出相应的程序并调试验证通过 六、实验报告要求 1、统一使用《武汉科技大学实验报告》本书写,实验报告的内容要求有: 实验目的、实验内容、程序流程图、源程序、运行结果及实验小结六个部分。 2、源程序需打印后粘贴在实验报告册内; 3、运行结果以屏幕截图形式保存并打印后粘贴在实验报告册内。 七、实验注意事项 注意如何定义数据结构以保存矩阵和解以降低算法的复杂性。 八、思考题 若使用全主元消去法,在编程中应如何记录保存对于未知数的调换。 实验二插值方法 一、实验目的 掌握拉格郎日插值法与牛顿插值法构造插值多项式。 二、实验内容 分别写出拉格郎日插值法与牛顿插值法的算法,编写程序上机调试出结果,要求所编程序适用于任何一组插值节点,即能解决这一类问题,而不是某一个问题。 实验中以下列数据验证程序的正确性。 已知下列函数表 xi 0.56160 0.56280 0.56401 0.56521 yi 0.82741 0.82659 0.82577 0.82495 求x=0.5635时的函数值。 三、实验仪器设备与材料 主流微型计算机 四、实验原理 已知n个插值节点的函数值,则可由拉格郎日插值公式与牛顿插值公式构造出插值多项式,从而由该插值多项式求出所要求点的函数值。 拉格郎日插值公式与牛顿插值公式如下: 1、Lagrange插值公式 #include #include #defineN20 doublex[N],y[N],l[N],sum=0; voidLagrange(doublex[],doubley[],doublex1,intn){ intk,j; doubleproduct=1.0; for(k=0;k product=1.0; for(j=0;j if(j! =k) product*=(x1-x[j])/(x[k]-x[j]); //continue; } l[k]=product; sum+=y[k]*l[k]; } } intshu(){ intj=0,i,n=0; doublez[N]; for(j=0;j z[j]=0; FILE*fp=fopen("e: \\2.txt","rt"); for(i=0;i fscanf(fp,"%lf",&z[i]); if(z[i]! =0) n++; } j=n/2; returnj; } voidmain(){ inti,n=0,h=0; doublex[N],y[N],x1; FILE*fp=fopen("e: \\2.txt","rt"); //printf("输入n的值: "); //scanf("%d",&n); printf("输入x的值: "); scanf("%lf",&x1); h=shu(); for(i=0;i fscanf(fp,"%lf",&x[i]); for(i=0;i fscanf(fp,"%lf",&y[i]); Lagrange(x,y,x1,h); printf("%.5lf\n",sum); } 2、Newton插值公式 #include"stdio.h" #defineNUM6 //不能用constintNUM=6; doublenewton(constunsignedintN,constdoublex[], constdoubley[],constdoublet){ unsignedinti,j; doublesum=0.0,muly=1.0; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(j! =i) muly=muly*(t-x[j])/(x[i]-x[j]); continue; } sum+=muly*y[i]; muly=1.0; } returnsum; } intmain() { inti;charj; unsignedintn; doublea[NUM],b[NUM],t,clu; printf("Howmanynodesisthefunction? \n"); scanf("%d",&n); for(i=0;i printf("enterNo.%dvalueofx",i); scanf("%lf",&a[i]); } for(i=0;i printf("enterNo.%dvalueofy",i); scanf("%lf",&b[i]); } printf("what'sthevalueoft? \n"); scanf("%lf",&t); clu=newton(n,a,b,t); printf("theconclusionis%lf\n",clu); getchar(); j=getchar(); return0; } 五、实验步骤 1、理解并掌握拉格郎日插值法与牛顿插值法的公式; 2、画出拉格郎日插值法与牛顿插值法算法的流程图; 3、使用C语言编写出相应的程序并调试验证通过。 六、实验报告要求 1、统一使用《武汉科技大学实验报告》本书写,实验报告的内容要求有: 实验目的、实验内容、程序流程图、源程序、运行结果及实验小结六个部分。 2、源程序需打印后粘贴在实验报告册内; 3、运行结果以屏幕截图形式保存并打印后粘贴在实验报告册内。 七、实验注意事项 Newton插值法在编程时应注意定义何种数据结构以保存差商。 八、思考题 比较Lagrange插值法与Newton插值法的异同。 实验三数值积分 一、实验目的 掌握复化梯形法与龙贝格法计算定积分。 二、实验内容 分别写出变步长梯形法与Romberge法计算定积分的算法,编写程序上机调试出结果,要求所编程序适用于任何类型的定积分,即能解决这一类问题,而不是某一个问题。 实验中以下列数据验证程序的正确性。 求 。 三、实验仪器设备与材料 主流微型计算机 四、实验原理 通过变步长梯形法与龙贝格法,我们只要知道已知n个求积节点的函数值,则可由相应的公式求出该函数的积分值,从而不需要求该函数的原函数。 变步长梯形法与龙贝格法公式如下: 1、变步长梯形法 用 来控制精度 #include #include #include #include #include #include #include #include #include #include #include usingnamespacestd; //精度<=0.00001 constdoubleeps=1e-5; doublea=0,b=1,h; doublef(doublex) { if(x==0)//防止除数为0 return1; returnsin(x)/x; } voidxiaohao() { doubleT1,T2; T1=h/2*(f(a)+f(b)); T2=h/4*(f(a)+2*f(0.5)+f(b)); intn=2; while(fabs(T2-T1)>eps) { n=n<<1; T1=T2; h=(b-a)/n; doubletemp=0,k=a; for(inti=1;i { k+=h; temp+=f(k); } T2=T1/2+h/2*temp; } printf("%f\n",T2); } intmain() { h=b-a; xiaohao(); return0; } 2、龙贝格法 梯形法则 二阶公式 四阶公式 六阶公式 八阶公式 用 来控制精度 #include #include #include #include #include #include #include #include #include #include #include usingnamespacestd; constdoubleeps=1e-5; doublea,b; doubleT[100][100]; doublefi(doublex) { if((x-0)<1e-8) return1; returnsin(x)/x; } voidxiaohao() { intn,l,k,m; doubleh,ff; h=b-a; T[0][0]=h*(fi(a)+fi(b))/2; l=1; while (1) { h=b-a; n=1<<(l-1); h=h/n; ff=0; for(k=0;k<=n-1;k++) ff=ff+fi(a+(2*k+1)*h/2.0); T[0][l]=(T[0][l-1]+h*ff)/2; for(m=1;m<=l;m++) T[m][l-m]=((1<<(2*m))*T[m-1][l-m+1]-T[m-1][l-m])/((1<<(2*m))-1); if(fabs(T[l][0]-T[l-1][0])<=eps) break; else l++; } printf("%f\n",T[l][0]);//0.946083 } intmain() { scanf("%lf%lf",&a,&b); xiaohao(); return0; } 五、实验步骤 1、理解并掌握变步长梯形法与龙贝格法的公式; 2、画出变步长梯形法与龙贝格法的流程图 3、使用C语言编写出相应的程序并调试验证通过 六、实验报告要求 1、统一使用《武汉科技大学实验报告》本书写,实验报告的内容要求有: 实验目的、实验内容、程序流程图、源程序、运行结果及实验小结六个部分。 2、源程序需打印后粘贴在实验报告册内; 3、运行结果以屏幕截图形式保存并打印后粘贴在实验报告册内。 七、实验注意事项 在 积分中,被积函数在x=0点函数值为1,对该点在程序设计中应注意对其的定义。 八、思考题 使用复化梯形法与复化Simpson法来计算该问题有何缺点? 实验四常微分方程的数值解 一、实验目的 掌握改进欧拉法与四阶龙格-库塔求解一阶常微分方程的初值问题。 二、实验内容 分别写出改进欧拉法与四阶龙格-库塔求解的算法,编写程序上机调试出结果,要求所编程序适用于任何一阶常微分方程的数值解问题,即能解决这一类问题,而不是某一个问题。 实验中以下列数据验证程序的正确性。 求 步长h=0.25。 三、实验仪器设备与材料 主流微型计算机 四、实验原理 常微分方程的数值解主要采用“步进式”,即求解过程顺着节点排列次序一步一步向前推进,在单步法中改进欧拉法和四阶龙格-库塔法公式如下: 1、改进欧拉法 #include floatfunc(floatx,floaty){ return(-x*y*y); } voideuler(floatx0,floatxn,floaty0,intN){ floatx,y,yp,yc,h=0.25; inti; x=x0; y=y0; for(i=1;i<=N;i++){ yp=y+h*func(x,y); x=x0+i*h; yc=y+h*func(x,yp); y=(yp+yc)/2; printf("y(%d)=%6.4f\n",i,y); } } voidmain(){ floatx0,xn,y0; intn; printf("inputn: \n"); scanf("%d",&n); printf("inputx0,xn: \n"); scanf("%f%f",&x0,&xn); printf("inputy0: \n"); scanf("%f",&y0); euler(x0,xn,y0,n); } 2、四阶龙格-库塔法 #include"stdio.h" #include"conio.h" floatfunc(floatx,floaty){ return(-x*y*y); } voidrunge_kutta(floatx0,floatxn,floaty0,intn){ floatx,y,h,xh; floatd1,d2,d3,d4; inti; x=x0; y=y0; h=0.25; for(i=1;i<=n;i++) { xh=x+h/2; d1=func(x,y); d2=func(xh,y+h*d1/2); d3=func(xh,y+h*d2/2); d4=func(xh+h/2,y+h*d3); y=y+h*(d1+2*d2+2*d3+d4)/6; x=x0+i*h; //a[i-1]=y; printf("y(%d)=%.4f\n",i,y); } } voidmain(){ floatx0,xn,y0; intn; printf("\ninputn: \n"); scanf("%d",&n); printf("inputx0,xn: \n"); scanf("%f%f",&x0,&xn); printf("inputy0: \n"); scanf("%f",&y0); runge_kutta(x0,xn,y0,n); } 五、实验步骤 1、理解并掌握改进欧拉法与四阶龙格-库塔法的公式; 2、画出改进欧拉法与四阶龙格-库塔法的流程图 3、使用C语言编写出相应的程序并调试验证通过 六、实验报告要求 1、统一使用《武汉科技大学实验报告》本书写,实验报告的内容要求有: 实验目的、实验内容、程序流程图、源程序、运行结果及实验小结六个部分。 2、源程序需打印后粘贴在实验报告册内; 3、运行结果以屏幕截图形式保存并打印后粘贴在实验报告册内。 七、实验注意事项 的精确解为 ,通过调整步长,观察结果的精度的变化 八、思考题 如何对四阶龙格-库塔法进行改进,以保证结果的精度。 实验五迭代法解线性方程组与非线性方程 一、实验目的 掌握高斯-塞德尔迭代法求解线性方程组与牛顿迭代法求方程根。 二、实验内容 分别写出高斯-塞德尔迭代法与牛顿迭代法的算法,编写程序上机调试出结果,要求所编程序适用于任何一个方程的求根,即能解决这一类问题,而不是某一个问题。 实验中以下列数据验证程序的正确性。 1、高斯-塞德尔迭代法求解线性方程组 2、用牛顿迭代法求方程 的近似根, ,牛顿法的初始值为1。 三、实验仪器设备与材料 主流微型计算机 四、实验原理 二分法通过将含根区间逐步二分,从而将根的区间缩小到容许误差范围。 牛顿通过迭代的方法逐步趋进于精确解,该两种方法的公式如下: 1、高斯-塞德尔迭代法 1)判断线性方程组是否主对角占优 2)直接分离xi,即 建立高斯-塞德尔迭代格式为: 3)取初值迭代求解至所要求的精度为止。 #include #include #defineN4 staticdoubleA[N][N]={7,2,1,-2,9,15,3,-2,-2,-2,11,5,1,3,2,13}; staticdoubleB[N]={4,7,-1,0}; staticdoubleY[N]; staticdouble
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 计算 基础 实验 指导书 代码 DOC