分段线性插值法

  • 格式:doc
  • 大小:163.50 KB
  • 文档页数:16

.

精选文档 《数值分析》实验报告

实验序号:实验五 实验名称: 分段线性插值法

1、 实验目的:

随着插值节点的增加,插值多项式的插值多项式的次数也增加,而对于高次的插值容易带来剧烈的震荡,带来数值的不稳定(Runge现象)。为了既要增加插值的节点,减小插值的区间,以便更好的逼近插值函数,又要不增加插值多项式的次数以减少误差,可采用分段线性插值。

2、 实验内容:

求一个函数(x)用来近似函数f(x),用分段线性插值的方法来求解近似函数(x)并画出近似函数图像及原函数图像。

设在区间[a,b]上,给定n+1个插值节点bxxxxan...210和相应的函数值nyyy,...,,10,求一个插值函数)(x,满足以下条件:

(1) ),...,2,1,0()(njyxjj;

(2) )(x在每一个小区间[1,jjxx]上是线性函数。

对于给定函数11-,2511)(2xxxf。在区间11-,上画出f(x)和分段线性插值函数)(x的函数图像。

1. 分段线性插值的算法思想:

分段线性插值需要在每个插值节点上构造分段线性插值基函数)(xlj,然后再作它们的线性组合。分段线性插值基函数的特点是在对应的插值节点上函数值取

1,其它节点上函数值取0。插值基函数如下: .

精选文档 其它 ,0,)(101010xxxxxxxxl其它 ,0,,)(111111jjjjjjjjjjjxxxxxxxxxxxxxxxl

其它 ,0,)(111nnnnnnxxxxxxxxl

设在节点a≤x0

(1) L(x)∈C[a,b]

(2) L(x[i]=y[i])

(3) L(x)在每个小区间(x[i],x[i+1])上是线性

插值函数¢(x)叫做区间[a,b]上对数据(x[j],y[j])(j=0,1,2,…,n)的分段区间函数。

利用一介拉格朗日函数,直接得到线性插值函数为:

L(x0)=(x-x[1])/x[0]-x[1];(x[0]≤x≤x[1])

L(x0)=0(x[1]≤x≤x[n])

分段线性方程的表达式:

¢(x)=∑(j=0,..,n)y[j]*L[j](x);

3、实验代码:

// LDlg.cpp : implementation file

//

#include "stdafx.h"

#include "L.h"

#include "LDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif .

精选文档

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

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

//{{AFX_DATA_INIT(CAboutDlg) .

精选文档 //}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

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

// CLDlg dialog

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

: CDialog(CLDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CLDlg)

// 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)

// NOTE: the ClassWizard will add DDX and DDV calls here

//}}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()

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

// CLDlg message handlers

BOOL 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 < 0xF000); .

精选文档

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

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

}

}

// Set the icon for this dialog. The framework does this automatically

// when the application's 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 unless you set the focus to a control

}

void CLDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

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

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}