分段线性插值法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 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)