Lagrange插值法.docx

上传人:b****6 文档编号:6184670 上传时间:2023-01-04 格式:DOCX 页数:14 大小:50.75KB
下载 相关 举报
Lagrange插值法.docx_第1页
第1页 / 共14页
Lagrange插值法.docx_第2页
第2页 / 共14页
Lagrange插值法.docx_第3页
第3页 / 共14页
Lagrange插值法.docx_第4页
第4页 / 共14页
Lagrange插值法.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

Lagrange插值法.docx

《Lagrange插值法.docx》由会员分享,可在线阅读,更多相关《Lagrange插值法.docx(14页珍藏版)》请在冰豆网上搜索。

Lagrange插值法.docx

Lagrange插值法

《数值分析》实验报告

实验序号:

实验四实验名称:

Lagrange插值法

1、实验目的:

在数学分析中,用y=f(x)来描述一条平面直线,但是在实际问题中,函数y=f(x)往往是通过观测得到的一组数据来给出的,只是已知个别点的函数值,而非在整个区间上,插值法是应用十分广泛的一种方法。

本实验是用拉格朗日法来逼近被逼近函数,并画出其图像。

 

2、实验内容:

(1)实验分析:

当给出了n+1个节点上f(x)的一张函数表后,用Lagrange插值法求一个函数φ(x),并满足φ(x)是一个不超过n次的多项式;

当插值节点取的足够多时逼近函数φ(x)能够很好的逼近被逼近函数f(x)。

而插值函数φ(x)的次数就会相应地升高,高次的插值多项式就不一定收敛到相应的被逼近函数,就会产生Runge现象,本实验可以从函数的图像上清楚地看到这一现象。

先从特殊情况入手,研究线形插值和二次插值。

在线性插值中,若逼近函数用两点式表示出来,则有F(x)=y0*((x-x1)/(x0-x1))+y1*((x-x0)/(x1-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次多项式,并且逼近函数过所有的型值点。

(1)原函数图像的绘制:

对于给定函数

在区间

上画出f(x)的函数图像。

(2)Lagrange插值函数图像的绘制:

根据题目要求取11个等距插值节点

,求出每一个结点处的基函数

(j=0,1,…n),然后根据Lagrange插值多项式的一般形式把

(x)写成与节点相对应的函数值

(i=0,1,2…n)与其插值基函数

(j=0,1,…n)的线形组合的形式。

3、实验代码:

//LDlg.cpp:

implementationfile

//

#include"stdafx.h"

#include"L.h"

#include"LDlg.h"

#ifdef_DEBUG

#definenewDEBUG_NEW

#undefTHIS_FILE

staticcharTHIS_FILE[]=__FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

//CAboutDlgdialogusedforAppAbout

classCAboutDlg:

publicCDialog

{

public:

CAboutDlg();

//DialogData

//{{AFX_DATA(CAboutDlg)

enum{IDD=IDD_ABOUTBOX};

//}}AFX_DATA

//ClassWizardgeneratedvirtualfunctionoverrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport

//}}AFX_VIRTUAL

//Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg:

:

CAboutDlg():

CDialog(CAboutDlg:

:

IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

voidCAboutDlg:

:

DoDataExchange(CDataExchange*pDX)

{

CDialog:

:

DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

//Nomessagehandlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

//CLDlgdialog

CLDlg:

:

CLDlg(CWnd*pParent/*=NULL*/)

:

CDialog(CLDlg:

:

IDD,pParent)

{

//{{AFX_DATA_INIT(CLDlg)

//NOTE:

theClassWizardwilladdmemberinitializationhere

//}}AFX_DATA_INIT

//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32

m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

voidCLDlg:

:

DoDataExchange(CDataExchange*pDX)

{

CDialog:

:

DoDataExchange(pDX);

//{{AFX_DATA_MAP(CLDlg)

//NOTE:

theClassWizardwilladdDDXandDDVcallshere

//}}AFX_DATA_MAP

}

BEGIN_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_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

//CLDlgmessagehandlers

BOOLCLDlg:

:

OnInitDialog()

{

CDialog:

:

OnInitDialog();

//Add"About..."menuitemtosystemmenu.

//IDM_ABOUTBOXmustbeinthesystemcommandrange.

ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX<0xF000);

CMenu*pSysMenu=GetSystemMenu(FALSE);

if(pSysMenu!

=NULL)

{

CStringstrAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if(!

strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);

}

}

//Settheiconforthisdialog.Theframeworkdoesthisautomatically

//whentheapplication'smainwindowisnotadialog

SetIcon(m_hIcon,TRUE);//Setbigicon

SetIcon(m_hIcon,FALSE);//Setsmallicon

//TODO:

Addextrainitializationhere

returnTRUE;//returnTRUEunlessyousetthefocustoacontrol

}

voidCLDlg:

:

OnSysCommand(UINTnID,LPARAMlParam)

{

if((nID&0xFFF0)==IDM_ABOUTBOX)

{

CAboutDlgdlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog:

:

OnSysCommand(nID,lParam);

}

}

//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow

//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,

//thisisautomaticallydoneforyoubytheframework.

voidCLDlg:

:

OnPaint()

{

if(IsIconic())

{

CPaintDCdc(this);//devicecontextforpainting

SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);

//Centericoninclientrectangle

intcxIcon=GetSystemMetrics(SM_CXICON);

intcyIcon=GetSystemMetrics(SM_CYICON);

CRectrect;

GetClientRect(&rect);

intx=(rect.Width()-cxIcon+1)/2;

inty=(rect.Height()-cyIcon+1)/2;

//Drawtheicon

dc.DrawIcon(x,y,m_hIcon);

}

else

{

CDialog:

:

OnPaint();

}

}

//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags

//theminimizedwindow.

HCURSORCLDlg:

:

OnQueryDragIcon()

{

return(HCURSOR)m_hIcon;

}

voidCLDlg:

:

OnOK()

{

intx00=300,y00=350,i,j;

doublex;

CDC*pDC=GetDC();

pDC->SetMapMode(MM_LOMETRIC);

pDC->SetViewportOrg(x00,y00);

//画坐标轴与原函数

for(i=-700;i<=700;i++)

{

pDC->SetPixel(i,0,RGB(0,0,0));

pDC->SetPixel(0,i,RGB(0,0,0));

}

for(x=-1;x<=1;x+=0.001)

{

doublej=400.0/(1+25*x*x);

pDC->SetPixel(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);

pDC->LineTo(680,-10);

pDC->TextOut(-30,700,"y");

pDC->TextOut(700,-10,"x");

}

 

voidCLDlg:

:

OnLargri()

{

intx00=300,y00=350,i,j;

doublex;

CDC*pDC=GetDC();

pDC->SetMapMode(MM_LOMETRIC);

pDC->SetViewportOrg(x00,y00);

//画坐标轴

for(i=-700;i<=700;i++)

{

pDC->SetPixel(i,0,RGB(0,0,0));

pDC->SetPixel(0,i,RGB(0,0,0));

}

doubleyx[]={-1,-0.8,-0.6,-0.4,-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->TextOut(-30,700,"y");

pDC->TextOut(700,-10,"x");

//拉格朗日差值的函数

doubleyy[12],lx[12],ly[12];

doublel_fenzi[12],l_fenmu[12];

doublel_x,l_y;

for(i=0;i<=10;i++)

{

yy[i]=1.0/(1+25*yx[i]*yx[i]);

}

for(i=0;i<=10;i++)

{

l_fenmu[i]=1.0;

for(j=0;j<=10;j++)

{

if(i!

=j)

l_fenmu[i]=l_fenmu[i]*(yx[i]-yx[j]);

}

}

doubleqq,pp;

for(qq=-1;qq<=1;qq+=0.0003)

{

for(i=0;i<=10;i++)

{

l_fenzi[i]=1.0;

for(j=0;j<=10;j++)

{

if(i!

=j)

l_fenzi[i]=l_fenzi[i]*(qq-yx[j]);

}

}

pp=0;

for(i=0;i<=11;i++)

{

pp=pp+1.0/(1+25*yx[i]*yx[i])*l_fenzi[i]/l_fenmu[i];

}

pDC->SetPixel(qq*500,pp*390+5,RGB(132,112,225));

}

}

voidCLDlg:

:

OnButton2()

{

intx00=300,y00=350,i,j;

doublex;

CDC*pDC=GetDC();

pDC->SetMapMode(MM_LOMETRIC);

pDC->SetViewportOrg(x00,y00);

//画坐标轴与原函数

for(i=-700;i<=700;i++)

{

pDC->SetPixel(i,0,RGB(0,0,0));

pDC->SetPixel(0,i,RGB(0,0,0));

}

doubleyx[]={-1,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8,1};

doubleyy[14];

for(i=0;i<=10;i++)

{

yy[i]=1.0/(1+25*yx[i]*yx[i]);

}

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->TextOut(-30,700,"y");

pDC->TextOut(700,-10,"x");

//线性分段差值的图像

CPenpen;

CPen*oldpen;

pen.CreatePen(PS_SOLID,5,RGB(0,0,0));

oldpen=pDC->SelectObject(&pen);

for(i=0;i<10;i++)

{

pDC->MoveTo(yx[i]*480,yy[i]*400);

pDC->LineTo(yx[i+1]*480,yy[i+1]*400);

}

}

voidCLDlg:

:

OnHermite()

{

intx00=300,y00=350,i,j;

doublex;

CDC*pDC=GetDC();

pDC->SetMapMode(MM_LOMETRIC);

pDC->SetViewportOrg(x00,y00);

//画坐标轴与原函数

for(i=-700;i<=700;i++)

{

pDC->SetPixel(i,0,RGB(0,0,0));

pDC->SetPixel(0,i,RGB(0,0,0));

}

doubleyx[]={-1,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8,1};

doubleyy[12];

for(i=0;i<=10;i++)

{

yy[i]=1.0/(1+25*yx[i]*yx[i]);

}

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->TextOut(-30,700,"y");

pDC->TextOut(700,-10,"x");

//分段三次Hermite差值的函数

doublex0,x1,yd1,yd0,y1,y0;

for(i=0;i<10;i++)

{

x0=yx[i],x1=yx[i+1];

y0=1.0/(1+25*x0*x0);

y1=1.0/(1+25*x1*x1);

yd0=-(50*x0)*1.0/((1+25*x0*x0)*(1+25*x0*x0));

yd1=-(50*x1)*1.0/((1+25*x1*x1)*(1+25*x1*x1));

for(doubleqq=x0;qq

{

doublepp=y0*(1+2*(qq-x0)/(x1-x0))*(qq-x1)/(x0-x1)*(qq-x1)/(x0-x1)

+y1*(1+2*(qq-x1)/(x0-x1))*(qq-x0)/(x1-x0)*(qq-x0)/(x1-x0)

+yd0*(qq-x0)*(qq-x1)/(x0-x1)*(qq-x1)/(x0-x1)

+yd1*(qq-x1)*(qq-x0)/(x1-x0)*(qq-x0)/(x1-x0);

pDC->SetPixel(qq*500,pp*400,RGB(225,185,15));

}

}

}

4.实验截图:

 

5.实验结果分析:

分析:

通过本次实验,我对用Lagrange插值法求f(x)的逼近函数

(x)有了更深刻的理解,学会了用程序来求解Lagrange插值基函数

(j=0,1,…n),求出逼近函数

(x)并绘制出其图像,进而可以通过函数图像很直观地看到Lagrange插值法的缺点,即当插值函数次数很高时出现了Runge现象。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1