计算方法实验指导书1719.docx
- 文档编号:17966152
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:24
- 大小:100.09KB
计算方法实验指导书1719.docx
《计算方法实验指导书1719.docx》由会员分享,可在线阅读,更多相关《计算方法实验指导书1719.docx(24页珍藏版)》请在冰点文库上搜索。
计算方法实验指导书1719
集成开发环境(VisualC++.Net2005)的使用
一开发环境介绍
VisualC++.Net画图通常在MFC应用程序中进行。
本实验指导书采用基于对话框的MFC应用程序。
该种工程新建过程如下:
(1)选择文件->新建->项目,选择路径且填写工程名称后点“确定”;
(2)在MFC应用程序向导中点“下一步”,应用程序类型选“基于对话框”,MFC的使用选“在静态库中使用MFC”,并将“使用Unicode库”前面的√去掉,点“完成”。
一个工程就建好了。
我们先来熟悉一下VisualC++.Net和我们所新建的这个工程。
在左侧,有“解决方案资源管理器”、“类视图”、“属性管理器”和“资源视图”。
若有缺少,到菜单栏中“视图”中添加。
“解决方案资源管理器”中列出了四个头文件和三个源文件,其中你的程序写在×××Dlg.cpp和×××Dlg.h中(我们以×××指代你的工程名),其余的文件不要修改。
“类视图”列出了工程×××中的所有的类,该视图主要用于为类添加成员函数和变量。
“资源视图中”的“Dialog”中有“IDD_×××_DIALOG”,双击打开即可看到对话框,我们程序的运行结果通过这个对话框显示。
对话框上已经默认放置了两个Button和一个StaticText,将其删除。
最右边,有“工具箱”,其中有各种控件,我们将使用的主要是Button,你可以尝试在对话框上放置一个Button,然后双击该Button,则会跳转到×××Dlg.cpp对应位置,这里要编写的就是该Button的单击响应程序。
另外,右侧有属性栏,显示的是当前选中的控件的各种属性,可修改。
在属性栏中,有“控件事件”一栏(闪电符号),其中有一个控件的多种事件,除单击外,有双击,等。
下面开始编写我们的程序。
以实验一——拉格朗日插值为例。
二类的添加
右击资源视图中的工程名,选择“添加”->“类”,在“类别”中选择“C++类”,然后点击“添加”。
出现了一个“C++类向导”,在“类名”、“.h文件”、“.cpp文件”中分别填“CInterpolation”、“CInterpolation.h”和“CInterpolation.cpp”,然后点击“完成”,一个空类就建好了。
将本实验指导书中已经给出的拉格朗日插值函数和类公有变量以及有参数的构造函数复制到该类中,并将“CInterpolation.cpp”文件开头的#include"CInterpolation.h"拷到C×××Dlg.h中,就可以通过对象调用拉格朗日函数了(你可以在前面添加的那个Button中进行)。
三画图
拉格朗日插值的结果有了,如何化成图像呢?
MFC提供了类CDC用来画图,CDC中有很多现成的画图函数,如连接两点的函数Lineto,画椭圆的函数Ecllipse,等,画图功能全面而且使用方便。
使用方法如下:
CDC*pDC=GetDC();//pDC检索对话框
pDC->Moveto(2,2);//pDC指向点(2,2)
pDC->Lineto(250,250);//连接点(2,2)与点(255,255)
ReleaseDC(pDC);//pDC使用完毕,取消检索
使用CDC类,你可以将求得的数组中的数据划成曲线,可以画出坐标系,可以将取的结点在对话框中标出。
另外,CDC还提供了输出文本的函数
pDC->TextOutA(100,100,”原点O”);//在点(100,100)处输出字符串”原点O”
四类型转换
在显示图像时,可能会用到整型变量与字符串的相互转换。
要将整型变量a的值转换为字符串,做法如下
CStringmStr;
mStr.Format(“%d”,a);
则串mStr为”a”。
要将串mStr转换为整型数,做法如下
inta=atoi(mStr);//串转换为浮点数floata=atof(mStr);
从对话框中读出的数据都是字符串,若要作为数值使用,需要转换,向对话框输出数值也需要转换。
CString是MFC中特有的串类,与C++中的“字符串”不是一回事。
在VC中可以用字符串常量赋值,两个串可以相加。
要通过对话框向程序输入数据,则需要使用EditControl控件。
从EditControl中获取字符串的办法为
CStringmStr;
GetDlgItem(IDC_EDIT1)->GetWindowText(mStr);//IDC_EDIT1是添加的EditControl控件的ID
则mStr就获取了EditControl中的字符串了。
实验一——插值方法
实验学时:
4
实验类型:
设计
实验要求:
必修
一实验目的
通过本次上机实习,能够进一步加深对各种插值算法的理解;学会使用用三种类型的插值函数的数学模型、基本算法,结合相应软件(如VC/VB/Delphi/Matlab/JAVA/TurboC)编程实现数值方法的求解。
并用该软件的绘图功能来显示插值函数,使其计算结果更加直观和形象化。
二实验内容
通过程序求出插值函数的表达式是比较麻烦的,常用的方法是描出插值曲线上尽量密集的有限个点,并用这有限个点的连线,即折线,近似插值曲线。
取点越密集,所得折线就越逼近理论上的插值曲线。
本实验中将所取的点的横坐标存放于动态数组
中,通过插值方法计算得到的对应纵坐标存放于动态数组
中。
以VisualC++.Net2005为例。
本实验将Lagrange插值、Newton插值和三次样条插值实现为一个C++类CInterpolation,并在Button单击事件中调用该类相应函数,得出插值结果并画出图像。
CInterpolation类为
classCInterpolation
{
public:
CInterpolation();//构造函数
CInterpolation(float*x1,float*y1,intn1,floath1);//有参数的构造函数
~CInterpolation();//析构函数
…………
…………
inth;//采样点间隔
intn,N;//n+1为结点数,N+1为描点数
float*x,*y,*X;//分别存放结点横坐标、结点纵坐标、采样点横坐标
float*p_H,*p_Alpha,*p_Beta,*p_a,*p_b,*p_c,*p_d,*p_m;//样条插值用到的公有指针,分别存放
,
,
,
,
,
,
和
};
其中,有参数的构造函数为
CInterpolation(float*x1,float*y1,intn1,inth1)
{
/*
动态数组x1,y1中存放结点的横、纵坐标,n1是结点下标上限(即n1+1个结点),h1为采样点步长
*/
h=h1;n=n1;
N=(x1[n]-x1[0])/h;
X=newfloat[N+1];
x=newfloat[n+1];
y=newfloat[n+1];
for(inti=0;i<=n;i++)
{
x[i]=x1[i];
y[i]=y1[i];
}
for(inti=0;i<=N;i++)
X[i]=x[0]+h*i;
}
2.1Lagrange插值
,其中
对于一个自变量
,要求插值函数值
,首先需要计算对应的Lagrange插值基函数值
floatl(floatxv,inti)//求插值基函数l(x)
{
floatt=1;
for(intj=0;j<=n;j++)
if(j!
=i)
t=t*(xv-x[j])/(x[i]-x[j]);
returnt;
}
调用函数l(floatx,inti),可求出
floatp_l(floatx)//求采样点x的插值结果
{
floatt=0;
for(inti=0;i<=n;i++)
t+=y[i]*l(x,i);
returnt;
}
调用p_l(floatx)可实现整个区间的插值
float*Lagrange()//求整个插值区间上所有采样点的插值结果
{
float*Y=newfloat[N+1];
for(intk=0;k<=N;k++)
Y[k]=p_l(x[0]+k*h);
returnY;
}
2.2Newton插值
,
其中
,
对于一个自变量
,要求插值函数值
,首先需要计算出
和
float*f()
{
//该函数的返回值是一个长度为n+1的动态数组,存放各阶差商
}
floatw(floatx,inti)
{
}
在求
的函数中调用*f()得到各阶差商,然后在循环中调用w(floatx)可得出插值结果
floatp_n(floatx)
{
}
调用p_n(floatx)可实现整个区间的插值
float*Newton()
{
}
2.3三次样条插值
三次样条插值分为以下四步:
(1)计算结点间的步长
、
、
;
(2)利用
、
、
产生三对角方程组的系数矩阵和常数向量;
(3)通过求解三对角方程组,得出中间结点的导数
;
(4)对自变量x,在对应区间
上,使用Hermite插值;
(5)调用上述函数,实现样条插值。
将每步写成函数:
(1)
voidGetH(void)
{
}
voidGetAlpha(void)
{
}
voidGetBeta(void)
{
}
(2)
voidGeta(void)
{
}
voidGetb(void)
{
}
voidGetc(void)
{
}
voidGetd(void)
{
}
(3)
float*Chasing(float*pa,float*pb,float*pc,float*pd,intn)
{
}
(4)
floatF0(floatx)
{
}
floatF1(floatx)
{
}
floatP0(floatx)
{
}
floatP1(floatx)
{
}
调用上述函数,实现三次样条插值
float*Cubic_Spline
{
}
三实验组织运行要求
实验前,由任课教师落实实验任务,每个学生事先编写好算法设计源程序代码。
集中上机、调试并通过计算机图形可视化演示操作实例来测试、验证所学的数值分析理论。
四实验条件
为每个学生提供一台具有WINDOWS98/XP/NT/2000操作系统的计算机;同时提供VC++/VB/JAVA/TC等集成语言开发环境来编程设计计算方法的上机实验。
五实验步骤
1.根据实验内容和算法流程图预先编好程序初稿,上机调试、运行,输出正确的结果。
2.三种类型的插值函数所生成的图形要显示在同一坐标轴上,并用三种不同的颜色分别表示出来。
3.分析它们的运行结果,并比较三种插值函数各自不同的特点。
4.实验完毕后提交实验报告
六实验报告
实验报告的内容包括:
实验目的、实验内容、源程序清单和结果分析及心得体会。
并分析它们的运行结果,并比较三种插值函数各自不同的特点。
实验二——数值积分
实验学时:
2
实验类型:
设计
实验要求:
必修
一实验目的
通过该课程实习,学会使用数值积分的各种方法求解定积分计算的问题,体会各种方法的精度差异。
二实验内容
本实验将梯形法的递推化和龙贝格算法编写为类CIntegration,在工程中调用该类得出积分结果并画出区间二分图像。
首先画出被积函数图像,并储存被积函数在图像中每个像素对应的采样点的横坐标(存放于float型指针p_X中)和纵坐标(存放于int型指针p_Y中);然后调用CIntegration类中相应函数,计算积分结果;最后将x轴上的区间二分点与其对应的被积函数值的点连线。
CIntegration有公有变量和指针floata,b,h,*x;intn和带参数的构造函数
CIntegration:
:
CIntegration(floatma,floatmb)
{
a=ma;//a、b分别为积分区间左右端点
b=mb;
n=1;//区间二分个数
h=b-a;//步长
x=newfloat[n+1];//存放区间二分点
x[0]=a;
x[1]=b;
}
另需被积函数
floatCIntegration:
:
f(floatx)
{
floatmTemp=sin(x);//可替换为其他函数
returnmTemp;
}
2.1梯形法的递推化
梯形法递推化公式为
该过程是下列过程的往复循环
(1)求已有各区间中点函数值的和
;
(2)区间二分,即更新结点,并将步长
减半。
(3)求积分值
。
要实现该算法过程,需要先编写下面两个函数
floatCIntegration:
:
Sum(void)
{
//该函数求
的值
}
voidCIntegration:
:
Divide(void)
{
//该函数实现区间二分和步长更新
}
为了后面编程的方便,可将单次二分过程写为函数
floatCIntegration:
:
T1ToT2(floatT1)
{
}
最后,调用T1ToT2,可实现梯形法递推化的函数
floatCIntegration:
:
Trapezium_Recurrence(floate)
{
}
在后面的Romberg函数中,还需要用到迭代一定次数的梯形法递推函数
floatCIntegration:
:
Trapezium_Recurrence(intN)
{
}
2.2龙贝格算法
……
……
……
……
其中
调用梯形法递推函数Trapezium_Recurrence(intN)可以很方便的实现单次龙贝格算法的函数
floatCIntegration:
:
R1(float*T)
{
}
调用函数R1可实现迭代的龙贝格函数
floatCIntegration:
:
Romberg(floate)
{
}
三实验组织运行要求
实验前,由任课教师落实实验任务,每个学生事先编写好算法设计源程序代码。
集中上机、调试并通过计算机图形可视化演示操作实例来测试、验证所学的数值分析理论。
四实验条件
为每个学生提供一台具有WINDOWS98/XP/NT/2000操作系统的计算机;同时提供VC++/VB/JAVA/TC等集成语言开发环境来编程设计计算方法的上机实验。
五实验步骤
1、根据实验内容和算法流程图预先编好程序初稿,上机调试、运行。
2、用绘图函数绘出曲边梯形的面积并计算其值并输出正确的结果。
3、测试、分析它们的运行结果,比较两种方法的精度差异。
4、实验完毕后提交实验报告。
六实验报告
实验报告的内容包括:
实验目的、实验内容、源程序清单和结果分析及心得体会。
并分析它们的运行结果,并比较两种数值积分不同的特点和精度差异。
实验三——微分方程
实验学时:
2
实验类型:
综合/设计
实验要求:
必修
一实验目的
通过本次实验,熟悉求解常微分方程初值问题的有关方法和理论,主要是欧拉法、改进欧拉法、四阶龙格库塔法,学会编制这三种方法的计算程序。
体会这三种解法的功能、优缺点及适用场合。
二实验内容
本实验将欧拉法、改进欧拉法和经典四阶龙哥库塔发编写为一个类CDifferential_Equation,调用该类实现一阶微分方程初值问题的求解,并画出解函数的图像。
CDifferential_Equation的框架如下
classCDifferential_Equation
{
public:
CDifferential_Equation(floatma,floatmb,floatmh,floatmy0);
~CDifferential_Equation(void);
floatf(floatx,floaty);
voidEuler(void);//欧拉法
voidEuler_Improved(void);//改进欧拉法
voidClassical_Forth_Order_Runge_Kutta(void);//经典四阶龙哥库塔法
floata,b,h,y0;//分别为区间左端点、区间右端点、步长
float*x,*y;//存放各个结点和横、纵坐标
intn;//结点个数,构造函数中得到
};
三实验组织运行要求
实验前,由任课教师落实实验任务,每个学生事先编写好算法设计源程序代码。
集中上机、调试并通过计算机图形可视化演示操作实例来测试、验证所学的数值分析理论。
四实验条件
为每个学生提供一台具有WINDOWS98/XP/NT/2000操作系统的计算机;同时提供VC++/VB/JAVA/TC等集成语言开发环境来编程设计计算方法的上机实验。
五实验步骤
1、根据实验内容和算法流程图预先编好程序初稿,上机调试、运行。
2、在屏幕上按适当比例和位置画出坐标轴及解的函数曲线输出正确的结果。
3、测试、分析它们的运行结果,比较三种方法的精度和误差。
4、实验完毕后提交实验报告。
六实验报告
实验报告的内容包括:
实验目的、实验内容、源程序清单和结果分析及心得体会。
并分析它们的运行结果,比较三种常微分方程求初值的精度和误差。
实验四——非线性方程
实验学时:
2
实验类型:
设计
实验要求:
必修
一实验目的
通过本次实验,熟练的掌握方程求根的最基本、常用的运算方法和理论。
主要有二分法、牛顿法、弦截法,并体会它们各自不同的特点及收敛速率。
二实验内容
本实验将求解非线性方程的区间二分法、牛顿法和快速弦截法编写为类CNonlinear_Equation,调用该类实现非线性方程的求解,并画出求解过程的图像。
CNonlinear_Equation的框架如下
classCNonlinear_Equation
{
public:
CNonlinear_Equation(void);
~CNonlinear_Equation(void);
floatf(floatx);//方程表达式,方程化为一端为0的形式
floatfd(floatx);//导数方程,方程化为一端为0的形式
floatBisection(floata,floatb,floate);
floatNewton(floatx,floate);
floatSecant(floatx0,floatx1,floate);
};
2.1区间二分法
对于单根区间[a,b],f(a)f(b)<0:
(1)区间中点m为(a+b)/2,如果|b-a| (2)如果f(a)=0(或f(b)=0),则a(或b)即为方程的解;(注意: 程序中,两浮点数不可判断相等,即使两浮点数a和b理论上相等,但“a==b;”一般不成立) (3)如果f(a)f(m)<0,则对区间[a,m]调用函数自身(递归); (4)如果f(m)f(b)<0,则对区间[m,b]调用函数自身(递归); floatCNonlinear_Equation: : Bisection(floata,floatb,floate) {//a和b分别为为区间左右端点,e为容许误差,返回值为方程的解 //建议该函数用递归实现 //函数在[a,b]区间须连续、端点函数值异号且函数在该区间有唯一解 //每步的区间中点存入顺序表中,以备后面画图之用 } 2.2牛顿法 , 已知 floatCNonlinear_Equation: : Newton(floatx,floate) {//x为初值x0,e为容许误差,返回值为方程的解 //每次得到的近似解存入顺序表中,以备后面画图之用 } 2.3快速弦截法 , 和 已知 floatCNonlinear_Equation: : Secant(floatx0,floatx1,floate) {//x0,x1分别为前两个近似解,用于启动迭代过程,e为容许误差,返回值为方程的解 //将每次迭代结果存入顺序表中,以备后面画图之用 } 三实验组织运行要求 实验前,由任课教师落实实验任务,每个学生事先编写好算法设计源程序代码。 集中上机、调试并通过计算机图形可视化演示操作实例来测试、验证所学的数值分析理论。 四实验条件 为每个学生提供一台具有WINDOWS98/XP/NT/2000操作系统的计算机;同时提供VC++/VB/JAVA/TC等集成语言开发环境来编程设计计算方法的上机实验。 五实验步骤 1、根据实验内容和算法流程图预先编好程序初稿,上机调试、运行。 2、按适当的比例在屏幕上画出f(x)的函数曲线以及根在x轴上的逼近过程。 3、测试、分析它们的运行结果并比较三种方法的运算速率及精度误差。 4、实验完毕后提交实验报告。 六实验报告 实验报告的内容包括: 实验目的、实验内容、源程序清单和结果分析及心得体会。 并分析它们的运行结果,比较三种方程求根的运算速率及精度误差。 实验五——线性方程组 实验学时: 2 实验类型: 设计 实验要求: 必修 一实验目的 通过本课程的实习,学会编写全主元消去法的计算程序。 掌握解线性方程组的最基本算法及其运用,进一步了解该解法的功能、优缺点,领会系数矩阵对解的影响。 二实验内容 本实验将线性方程组的高斯-赛德尔迭代法和高斯列主元消去法实现为类CLinear_Equations,调用该类实现线性方程组的求解。 该类结构如下 classCLinear_Equations { public: CLinear_Equations(void); CLinear_Equations(float**ppA,float*pB,intD);//向类中公有变量和指针传递数据 ~CLinear_Equations(void); float*Adjust(float*pX); float*Gauss_Seidel(float*pX0,floate); floatDistance_Vector(float*pX0,float*pX1); intSearch_Pricipal_Element(intCol); voidExchange(intRow1,intRow2); voidSlash(intRow); float*Elimination(void); float*Gaussian_Elimination(void); float**pp_A,*p_B;//分别存放系数矩阵、常数项向量 intm_D;//方程组的维数 }; 为了方便,使用二维动态数组。 可调用下面的函数为二维指针分配动态存储空间和销毁空间。 为了方便程序的移植和重复利用,可将这两个函数写在一个文件MatrixAllocate.h中。 template
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算方法 实验 指导书 1719
![提示](https://static.bingdoc.com/images/bang_tan.gif)