计算方法实验指导书.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算方法
实
验
指
导
书
彭彬
计算机技术实验中心
2012年3月
· 实验环境: VC++ 6.0
· 实验要求:在机房做实验只是对准备好的实验方案进行验证,因此上机前要检查实验准备情况,通过
检查后方可上机。没有认真准备的学生不能上机,本次实验没有分数。实验中要注意考察和体会数值计算中出现的一些问题和现象:误差的估计,算法的稳定性、收敛性、收敛速度以及迭代初值对收敛的影响等。
· 关于计算精度:如果没有特别说明,在计算的过程中,小数点后保留5位数字,最后四舍五入到小数
点后四位数字。迭代运算的结束条件统一为
51
102
-⨯。在VC++ 6.0中,可使用setprecision 在流的输出中控制浮点数的显示(缺省显示6位)。演示如下: # include
//输出6位精度,输出左对齐
cout< · 关于图形绘制 本课程个别实验要求画出函数的曲线,所有画图题目均要求用MFC 完成。 利用VC++6.0的MFC 画图,先要建立一个工程,然后在***View 中加入自定义变量、自定义函数等,最后在OnDraw ()方法中调用自定义函数。也可以把代码直接写入OnDraw ()方法中。 画曲线有两种方法,(一)一句坐标逐个打点(用SetPixel()函数),(二)先把当前光标移动 (MoveTo ()函数)到曲线的始点,再用LineTo ()函数画线。线的样式由画笔决定。对封闭区域可以填充,填充的样式由画刷决定。 在VC++6.0中,先新建一个MFC AppWizard(exe)类型的工程(建立工程时,“应用程序类型”选择“单文档”;“是否包含数据库”选择“不包含数据库”;其它选择缺省),然后在“ClassView ”中选择XXView 类文件加以操作。图1是一个名为test 的工程,在CtestView 节点,点击右键,用户可以增加自定义变量,自定义函数。 图1 MFC工程 图2是一个自定义函数的例子,代码如下: void CTestView::drawOldLine(int N, CDC *pDC) //N—画线所用点的数目{ pDC->TextOut(250,10,"龙格现象");//文本输出 //设置画笔,将影响画线的样式 CPen *pnewPen,*poldPen; pnewPen=new CPen(); pnewPen->CreatePen(PS_SOLID,10,RGB(0,0,0)); poldPen=pDC->SelectObject(pnewPen); //画坐标系 pDC->MoveTo(0,380); pDC->LineTo(640,380); pDC->MoveTo(320,0); pDC->LineTo(320,480); //画曲线,先移动到本曲线的第一个点 pDC->MoveTo(20,380); for(int i=0;i<=N;i++){ //原始坐标 float x0=-1+2.0/N*i;float y0=1.0/(1+4*x0*x0); //坐标放大 x0=x0*300;y0=-y0*300; //坐标转化为整型 int x1=(int)(320+x0);int y1=(int)(440+y0); pDC->LineTo(x1,y1); } //重置画笔 pDC->SelectObject(poldPen); } 图 2 自定义函数画函数2 1 ()14f x x = +的图形 图3是一个根据Lagrange 插值多项式求函数值的自定义函数Lagrange(float x, int n, float x1[], float y1[]),其中n 是插值节点的个数,数组X1,y1存放插值节点的坐标,x 是待求点的x 坐标,函数根据插值多项式返回对应的y 坐标。 float CTestView::Lagrange(float x, int n, float x1[], float y1[]) { float y=0;//存放函数值 int k=0;//控制变量,求lagrange 基函数的值 for( k=0;k return y; } 图3 自定义函数,根据插值多项式求值 图4是onDraw 函数,这是MFC 画图的主要部分。相关代码如下: void CTestView::OnDraw(CDC* pDC) { CTestDoc* pDoc = GetDocument(); //画原始图形 drawOldLine(2000,pDC); float px[11],py[11]; 图4 OnDraw()函数的内容 //N--N等分 for(int N=2;N<=10;N=N+2) { //求插值节点 for(int i=0;i<=N;i++) { px[i]=-1+2.0/N*i; py[i]=1.0/(1+4*px[i]*px[i]); } //移动到第一个点 pDC->MoveTo(20,380); //设置画笔 CPen *pnewPen,*poldPen; pnewPen=new CPen(); pnewPen->CreatePen(PS_DASHDOT,1+N/2,RGB(255-20*N,0+10*N,20*N)); poldPen=pDC->SelectObject(pnewPen); //按照插值节点求插值多项式的值,并描点 for(int k=0;k<=2000;k++) { float x=-1+2.0/2000*k; float y=Lagrange(x,N+1,px,py);//注意N+1个节点 //坐标变换 x=x*300;