分段线性插值法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数值分析》实验报告

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

1、 实验目的:

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

2、 实验内容:

求一个函数ϕ(x )用来近似函数f (x ),用分段线

性插值的方法来求解近似函数ϕ(x )并画出近似函数图像及原函数图像。

设在区间[a,b]上,给定n+1个插值节点

b x x x x a n =<<<<=...210和相应的函数值n y y y ,...,,10,求一个

插值函数)(x ϕ,满足以下条件:

(1) ),...,2,1,0()(n j y x j j ==ϕ;

(2) )(x ϕ在每一个小区间[1,+j j x x ]上是线性函数。 对于给定函数11-,2511)(2≤≤+=

x x x f 。在区间[]11-,上画出f (x )和分段线性插值函数)(x ϕ的函数图像。

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

分段线性插值需要在每个插值节点上构造

分段线性插值基函数)(x l j

,然后再作它们的线性组合。分段线性插值基函数的特点是在对应的插值节点上函数值取 1,其它节点上函数值取0。插值基函数如下:

⎪⎩⎪⎨⎧≤≤--=其它 ,0,)(101010x x x x x x x x l ⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧≤<--≤≤--=+++---其它 ,0,,)(11

1111j j j j j j j j j j j x x x x x x x x x x x x x x x l

⎪⎩

⎪⎨⎧≤≤--=---其它 ,0,)(111n n n n n n x x x x x x x x l 设在节点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

相关文档
最新文档