




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验一插值方法一 实验目的通过本次上机实习,能够进一步加深对各种插值算法的理解;学会使用用三种类型的插值函数的数学模型、基本算法,结合相应软件(如VC/VB/Delphi/Matlab/JAVA/Turbo C)编程实现数值方法的求解。并用该软件的绘图功能来显示插值函数,使其计算结果更加直观和形象化。二 实验内容通过程序求出插值函数的表达式是比较麻烦的,常用的方法是描出插值曲线上尽量密集的有限个采样点,并用这有限个采样点的连线,即折线,近似插值曲线。取点越密集,所得折线就越逼近理论上的插值曲线。本实验中将所取的点的横坐标存放于动态数组中,通过插值方法计算得到的对应纵坐标存放于动态数组中。本实验将Lagrange插值、Newton插值和三次样条插值实现为一个C+类CInterpolation,并在Button单击事件中调用该类相应函数,得出插值结果并画出图像。CInterpolation类为class CInterpolationpublic: CInterpolation();/构造函数CInterpolation(float *x1, float *y1, int n1);/结点横坐标、纵坐标、下标上限 CInterpolation();/析构函数int n, N;/结点下标上限,采样点下标上限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, int n1) /动态数组x1,y1中存放结点的横、纵坐标,n1是结点下标上限(即n1+1个结点) n=n1; N=x1n-x10; X=new floatN+1; x=new floatn+1; y=new floatn+1; for(int i=0;i=n;i+) xi=x1i; yi=y1i; for(int i=0;i=N;i+) Xi=x0+i;2.1 Lagrange插值,其中对于一个自变量,要求插值函数值,首先需要计算对应的Lagrange插值基函数值float l(float xv,int i) /求插值基函数的值 float t=1; for(int j=0;j=n;j+) if(j!=i) t=t*(xv-xj)/(xi-xj); return t;调用函数l(float x,int i),可求出float p_l(float x) /求在一个点的插值结果 float t=0; for(int i=0;i=n;i+) t+=yi*l(x,i); return t;调用p_l(float x)可实现整个区间的插值float *Lagrange() /求整个插值区间上所有采样点的插值结果 float *Y=new floatN+1; for(int k=0;k=N;k+) Yk=p_l(x0+k*h); return Y;2.2 Newton插值,其中,对于一个自变量,要求插值函数值,首先需要计算出和float *f()/该函数的返回值是一个长度为n1的动态数组,存放各阶差商float w(float x, int i)/该函数计算在求的函数中调用*f()得到各阶差商,然后在循环中调用w(float x)可得出插值结果float p_n(float x)/该函数计算在一点的值调用p_n(float x)可实现整个区间的插值float *Newton()/该函数计算出插值区间内所有点的值2.3 三次样条插值三次样条插值程序可分为以下四步编写:(1) 计算结点间的步长、;(2) 利用、产生三对角方程组的系数矩阵和常数向量;(3) 通过求解三对角方程组,得出中间结点的导数;(4) 对自变量x,在对应区间上,使用Hermite插值;(5) 调用上述函数,实现样条插值。将每步写成函数:(1)void GetH(void)/该函数计算数组void GetAlpha(void)/该函数计算数组void GetBeta(void)/该函数计算数组(2)void Geta(void)/该函数计算数组下对角线 void Getb(void)/该函数计算数组主对角线 void Getc(void)/该函数计算数组上对角线void Getd(void)/该函数计算方程组右端常数项(3)float *Chasing(float *pa,float *pb,float *pc,float *pd,int n)/追赶过程,计算各点斜率(4)float F0(float x)/该函数计算函数的值float F1(float x)/该函数计算函数的值float P0(float x)/该函数计算函数的值float P1(float x)/该函数计算函数的值调用上述函数,实现三次样条插值float *Cubic_Spline()/该函数计算所有点的插值结果三 实验组织运行要求 实验前,由任课教师落实实验任务,每个学生事先编写好算法设计源程序代码。集中上机、调试并通过计算机图形可视化演示操作实例来测试、验证所学的数值分析理论。四 实验条件为每个学生提供一台具有WINDOWS 98/XP/NT/2000操作系统的计算机;同时提供VC+/VB/JAVA/TC等集成语言开发环境来编程设计计算方法的上机实验。五 实验内容拉格朗日插值/ TODO: 在此添加控件通知处理程序代码/首先从线性表中获取节点坐标double *x,*y;int n;n=m_SL.Length;x=new doublen;y=new doublen;for(int i=0;iMoveTo(mI.X0,mI.Y0);for(int i=0;iLineTo(mI.Xi,mI.Yi);ReleaseDC(pDC);*/void CInterpolationDlg:Draw(double * px, double * py, int n)/为了画图方便,可以将函数图像的绘制写成函数DrawCDC *pDC=GetDC();pDC-MoveTo(px0,py0);for(int i=0;iLineTo(pxi,pyi);ReleaseDC(pDC);/ InterpolationDlg.cpp : 实现文件/#include stdafx.h#include Interpolation.h#include InterpolationDlg.h#include afxdialogex.h#ifdef _DEBUG#define new DEBUG_NEW#endif/ 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogExpublic:CAboutDlg();/ 对话框数据enum IDD = IDD_ABOUTBOX ;protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV 支持/ 实现protected:DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialogEx(CAboutDlg:IDD)void CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialogEx:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()/ CInterpolationDlg 对话框CInterpolationDlg:CInterpolationDlg(CWnd* pParent /*=NULL*/): CDialogEx(CInterpolationDlg:IDD, pParent)m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CInterpolationDlg:DoDataExchange(CDataExchange* pDX)CDialogEx:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CInterpolationDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_LBUTTONDBLCLK()ON_BN_CLICKED(IDC_BUTTON3, &CInterpolationDlg:OnBnClickedButton3)END_MESSAGE_MAP()/ CInterpolationDlg 消息处理程序BOOL CInterpolationDlg:OnInitDialog()CDialogEx:OnInitDialog();/ 将“关于.”菜单项添加到系统菜单中。/ IDM_ABOUTBOX 必须在系统命令范围内。ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动/ 执行此操作SetIcon(m_hIcon, TRUE);/ 设置大图标SetIcon(m_hIcon, FALSE);/ 设置小图标/ TODO: 在此添加额外的初始化代码return TRUE; / 除非将焦点设置到控件,否则返回 TRUEvoid CInterpolationDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialogEx:OnSysCommand(nID, lParam);/ 如果向对话框添加最小化按钮,则需要下面的代码/ 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,/ 这将由框架自动完成。void CInterpolationDlg:OnPaint()if (IsIconic()CPaintDC dc(this); / 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc(), 0);/ 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ 绘制图标dc.DrawIcon(x, y, m_hIcon);elseCDialogEx:OnPaint();/画坐标系CDC *pDC=GetDC();pDC-MoveTo(0,250);pDC-LineTo(500,250);/画x轴pDC-LineTo(490,240);pDC-MoveTo(500,250);pDC-LineTo(490,260);/画x轴箭头pDC-TextOutA(500,230,X);pDC-MoveTo(250,500);pDC-LineTo(250,0);/画y轴pDC-LineTo(240,10);pDC-MoveTo(250,0);pDC-LineTo(260,10);/画y轴箭头pDC-TextOutA(230,0,Y);pDC-TextOutA(230,255,O);ReleaseDC(pDC);/当用户拖动最小化窗口时系统调用此函数取得光标/显示。HCURSOR CInterpolationDlg:OnQueryDragIcon()return static_cast(m_hIcon);void CInterpolationDlg:OnLButtonDblClk(UINT nFlags, CPoint point)/ TODO: 在此添加消息处理程序代码和/或调用默认值/鼠标左键双击事件,将双击的点point作为差值节点/point的坐标为计算机坐标系,原点在对话框左上角,y轴向下m_SL.InsertAtTail(point);/将鼠标双击时的坐标插入线性表末尾CDC *pDC=GetDC();pDC-Ellipse(point.x-5,point.y-5,point.x+5,point.y+5);/在鼠标双击处画圆标记CString ms=(;CString mx,my;mx.Format(%d,point.x);my.Format(%d,point.y);ms+=mx;ms+=,;ms+=my;ms+=);pDC-TextOutA(point.x+5,point.y+5,ms);/显示点的坐标/请自行将计算机坐标转换为平面直角坐标系显示CDialogEx:OnLButtonDblClk(nFlags, point);void CInterpolationDlg:OnBnClickedButton3()/ TODO: 在此添加控件通知处理程序代码/首先从线性表中获取节点坐标double *x,*y;int n;n=m_SL.Length;x=new doublen;y=new doublen;for(int i=0;iMoveTo(mI.X0,mI.Y0);for(int i=0;iLineTo(mI.Xi,mI.Yi);ReleaseDC(pDC);*/void CInterpolationDlg:Draw(double * px, double * py, int n)/为了画图方便,可以将函数图像的绘制写成函数DrawCDC *pDC=GetDC();pDC-MoveTo(px0,py0);for(int i=0;iLineTo(pxi,pyi);ReleaseDC(pDC);:#include stdafx.h#include ZInterpolation.hZInterpolation:ZInterpolation(void)ZInterpolation:ZInterpolation(double *x,double *y,int n)this-n=n;this-x=new doublen+1;this-y=new doublen+1;for(int i=0;ixi=xi;this-yi=yi;N=xn-x0;X=new doubleN+1;Y=new doubleN+1;for(int i=0;i=N;i+)Xi=x0+i;ZInterpolation:ZInterpolation(void)double ZInterpolation:l(double mx, int i)/求拉格朗日差值基函数double t=1;for(int j=0;j=n;j+)if(j=i)continue;elset*=(mx-xj)/(xi-xj);return t;double ZInterpolation:L(double mx)/求一个点的拉格朗日插值结果double t=0;for(int i=0;i=n;i+)t+=yi*l(mx,i);return t;void ZInterpolation:Lagrange(void)/求整个差值区间上每个采样点(像素)的拉格朗日差值结果,并存放在数组Y中for(int i=0;iLoadIcon(IDR_MAINFRAME);void CInterpolation2Dlg:DoDataExchange(CDataExchange* pDX)CDialogEx:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CInterpolation2Dlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_LBUTTONDBLCLK()ON_BN_CLICKED(IDC_BUTTON1, &CInterpolation2Dlg:OnBnClickedButton1)END_MESSAGE_MAP()/ CInterpolation2Dlg message handlersBOOL CInterpolation2Dlg:OnInitDialog()CDialogEx:OnInitDialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization herereturn TRUE; / return TRUE unless you set the focus to a controlvoid CInterpolation2Dlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialogEx:OnSysCommand(nID, lParam);/ If you add a minimize button to your dialog, you will need the code below/ to draw the icon. For MFC applications using the document/view model,/ this is automatically done for you by the framework.void CInterpolation2Dlg:OnPaint()if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialogEx:OnPaint();/画坐标系CDC *pDC=GetDC();pDC-MoveTo(0,250);pDC-LineTo(500,250);/画X轴pDC-LineTo(490,240); pDC-MoveTo(500,250); pDC-LineTo(490,260);/画X轴箭头pDC-TextOutA(500,230,X); pDC-MoveTo(250,500);pDC-LineTo(250,0);/画Y轴pDC-LineTo(240,10); pDC-MoveTo(250,0); pDC-LineTo(260,10);/画Y轴箭头pDC-TextOutA(230, 0,Y); pDC-TextOutA(230,255,O);ReleaseDC(pDC);/ The system calls this function to obtain the cursor to display while the user drags/ the minimized window.HCURSOR CInterpolation2Dlg:OnQueryDragIcon()return static_cast(m_hIcon);void CInterpolation2Dlg:OnLButtonDblClk(UINT nFlags, CPoint point)/ TODO: Add your message handler code here and/or call default/鼠标左键双击事件,将双击的点point作为插值节点/point的坐标为计算机坐标系,原点在对话框左上角,y轴向下m_SL.InsertAtTail(point);/将鼠标双击时的坐标插入线性表末尾CDC *pDC=GetDC();pDC-Ellipse(point.x-5,point.y-5,point.x+5,point.y+5);/在鼠标双击处画圆标记CString ms=(;CString mx,my;mx.Format(%d,point.x-250);my.Format(%d,point.y*(-1)+250); ms+=mx;ms+=,;ms+=my;ms+=);pDC-TextOutA(point.x+5,point.y+5,ms);/显示点的坐标ReleaseDC(pDC);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 魔都考试题及答案
- 项目实施中的信息系统项目管理师道德准则试题及答案
- 重点掌握西医临床内容试题及答案
- 药剂学面试中需展示的能力试题及答案
- 2024年南阳市第十一人民医院招聘专业技术人员笔试真题
- 经济法学原理试题及答案
- 2024年鹤壁市山城区城市管理局招聘看护人员笔试真题
- 2024年合肥长丰县单位招聘笔试真题
- 重要技巧与方法信息系统项目管理师试题及答案
- 系统架构设计中高可用性的构建试题及答案
- 欢迎上级领导莅临检查指导
- 信用修复申请书
- PKPM砖混结构抗震及其他计算全攻略
- “十四五”生物质能源发展规划
- “育鲲”轮转叶式舵机工作原理和电气控制以及故障分析
- 智力七巧板校本课程开发教案
- 陕旅版四年级下册英语全册教案及各单元知识点总结
- 最新.尔雅批判与创意思考--冯林答案
- 施工单轨吊起吊锚杆安装单轨吊梁施工安全技术措施方案
- 二年级下册数学半期检测题
- PROFORMAINVOICE模板
评论
0/150
提交评论