1、实验三实验报告实验序号:实验三 实验名称: Lagrange插值法 学号: 20141103261 姓名: 杨慧芳任课教师:马季骕 专业班级:14级计算机科学与技术师范汉班一 实验目的用Lagrange插值法求f(x)的逼近函数 (x)并画出图像二实验内容1算法分析插值节点取的足够多时逼近函数 (x)能够很好的逼近被逼近函数f(x)。插值函数 (x)的次数相应升高,不一定收敛到相应的被逼近函数,从而会产生Runge现象。 要想解决Lagrange插值,先研究线形插值和二次插值。在线性插值中,若逼近函数用两点式表示出来,则有F(x)=y0*(x-x1)/(x0-x1)+y1*(x-x0)/(x1
2、-x0),过三个点的二次插值可以确定一条抛物线,经化简,被逼近函数可表示为F(x)=y0*(x-x1)*(x-x2)/(x0-x1)/(x0-x2)+y1*(x-x0)*(x-x2)/(x1-x0)/(x1-x2)+y2*(x-x0)*(x-x1)/(x2-x0)/(x2-x1),分析可得对于具有n+1个节点的函数,都可以表示成该节点的函数值与其对应基函数的乘积的线形组合。要求逼近函数是n次多项式,并且逼近函数过所有的型值点。2源代码/ LDlg.cpp : implementation file/#include stdafx.h#include L.h#include LDlg.h#ifd
3、ef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic: CAboutDlg();/ Dialog Data /AFX_DATA(CAboutDlg) enum IDD = IDD_ABOUTBOX ; /AFX_DATA / ClassWizard generated virtual function overrides /AFX_V
4、IRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support /AFX_VIRTUAL/ Implementationprotected: /AFX_MSG(CAboutDlg) /AFX_MSG DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD) /AFX_DATA_INIT(CAboutDlg) /AFX_DATA_INITvoid CAboutDlg:DoDataExchan
5、ge(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(CAboutDlg) /AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog) /AFX_MSG_MAP(CAboutDlg) / No message handlers /AFX_MSG_MAPEND_MESSAGE_MAP()/ CLDlg dialogCLDlg:CLDlg(CWnd* pParent /*=NULL*/) : CDialog(CLDlg:IDD, pParent) /AFX_DATA_INIT(C
6、LDlg) / NOTE: the ClassWizard will add member initialization here /AFX_DATA_INIT / Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CLDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(CLDlg) / NOT
7、E: the ClassWizard will add DDX and DDV calls here /AFX_DATA_MAPBEGIN_MESSAGE_MAP(CLDlg, CDialog) /AFX_MSG_MAP(CLDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_LARGRI, OnLargri) ON_BN_CLICKED(IDC_BUTTON2, OnButton2) ON_BN_CLICKED(IDC_HERMITE, OnHermite) /AFX_MSG_MAPEND
8、_MESSAGE_MAP()/ CLDlg message handlersBOOL CLDlg:OnInitDialog() CDialog: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_STRIN
9、G, IDM_ABOUTBOX, strAboutMenu); / Set the icon for this dialog. The framework does this automatically / when the applications main window is not a dialog SetIcon(m_hIcon, TRUE); / Set big icon SetIcon(m_hIcon, FALSE); / Set small icon / TODO: Add extra initialization here return TRUE; / return TRUE
10、unless you set the focus to a controlvoid CLDlg:OnSysCommand(UINT nID, LPARAM lParam) if (nID & 0xFFF0) = IDM_ABOUTBOX) CAboutDlg dlgAbout; dlgAbout.DoModal(); else CDialog:OnSysCommand(nID, lParam); / If you add a minimize button to your dialog, you will need the code below/ to draw the icon. For M
11、FC applications using the document/view model,/ this is automatically done for you by the framework.void CLDlg:OnPaint() if (IsIconic() CPaintDC dc(this); / device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); / Center icon in client rectangle int cxIcon = GetSyst
12、emMetrics(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 icon dc.DrawIcon(x, y, m_hIcon); else CDialog:OnPaint(); / The system calls this to obtain the cursor to dis
13、play while the user drags/ the minimized window.HCURSOR CLDlg:OnQueryDragIcon() return (HCURSOR) m_hIcon;void CLDlg:OnOK() int x00=300,y00=350,i,j; double x; CDC *pDC=GetDC(); pDC-SetMapMode(MM_LOMETRIC); pDC-SetViewportOrg(x00,y00); /画坐标轴与原函数 for(i=-700; iSetPixel(i,0,RGB(0,0,0); pDC-SetPixel(0,i,R
14、GB(0,0,0); for(x=-1; xSetPixel(x*500,j,RGB(255,0,0); pDC-TextOut(-30,-10,0); pDC-TextOut(-30,430,1); pDC-TextOut(490,-10,1); pDC-TextOut(-490,-10,-1); pDC-MoveTo(-10,680); /x箭头 pDC-LineTo(0,700); pDC-MoveTo(0,700); pDC-LineTo(10,680); pDC-MoveTo(680,10); /y箭头 pDC-LineTo(700,0); pDC-MoveTo(700,0); pD
15、C-LineTo(680,-10); pDC-TextOut(-30,700,y); pDC-TextOut(700,-10,x); void CLDlg:OnLargri() int x00=300,y00=350,i,j; double x; CDC *pDC=GetDC(); pDC-SetMapMode(MM_LOMETRIC); pDC-SetViewportOrg(x00,y00);/画坐标轴 for(i=-700; iSetPixel(i,0,RGB(0,0,0); pDC-SetPixel(0,i,RGB(0,0,0); double yx=-1,-0.8,-0.6,-0.4,
16、-0.2,0,0.2,0.4,0.6,0.8,1; pDC-TextOut(-30,-10,0); pDC-TextOut(-30,430,1); pDC-TextOut(490,-10,1); pDC-TextOut(-490,-10,-1); pDC-MoveTo(-10,680); /x箭头 pDC-LineTo(0,700); pDC-MoveTo(0,700); pDC-LineTo(10,680); pDC-MoveTo(680,10); /y箭头 pDC-LineTo(700,0); pDC-MoveTo(700,0); pDC-LineTo(680,-10); pDC-Text
17、Out(-30,700,y); pDC-TextOut(700,-10,x);/ 拉格朗日差值的函数 double yy12,lx12,ly12; double l_fenzi12,l_fenmu12; double l_x,l_y; for(i=0; i=10; i+) yyi=1.0/(1+25*yxi*yxi); for(i=0; i=10; i+) l_fenmui=1.0; for(j=0; j=10; j+) if(i!=j) l_fenmui=l_fenmui*(yxi-yxj); double qq,pp; for(qq=-1; qq=1; qq+=0.0003) for(i=0; i=10; i+) l_fenzii=1.0; for(j=0; j=10; j+) if(i!=j) l_fenzii=l_fenzii*(qq-yxj); pp=0; for(i=0; iSetPixel(qq*500,pp*390+5,RGB(132,112,225); 三 实验截图四结果分析本次实验使我对用Lagrange插值法求f(x)的逼近函数 (x)有了更深的理解,知道了如何用程序来求解Lagrange插值基函数(j=0,1,n),求出逼近函数 (x)并绘制出其图像,且通过图像看到了Lagrange插值法的缺点,即当Lagrange插值函数次数很高时出现了Runge现象。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1