计算方法实验指导书.

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算方法

彭彬

计算机技术实验中心

2012年3月

· 实验环境: VC++ 6.0

· 实验要求:在机房做实验只是对准备好的实验方案进行验证,因此上机前要检查实验准备情况,通过

检查后方可上机。没有认真准备的学生不能上机,本次实验没有分数。实验中要注意考察和体会数值计算中出现的一些问题和现象:误差的估计,算法的稳定性、收敛性、收敛速度以及迭代初值对收敛的影响等。

· 关于计算精度:如果没有特别说明,在计算的过程中,小数点后保留5位数字,最后四舍五入到小数

点后四位数字。迭代运算的结束条件统一为

51

102

-⨯。在VC++ 6.0中,可使用setprecision 在流的输出中控制浮点数的显示(缺省显示6位)。演示如下: # include # include # 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;

相关文档
最新文档