分段线性插值法
- 格式: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)(2xxxf。在区间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();
}