lagrange插值作业

合集下载

实验四 Lagrange插值法画函数图像

实验四  Lagrange插值法画函数图像

实验四 : Lagrange 插值法画函数图像学号: 姓名:指导老师:马季骕班级:计算机科学与技术(非师范)1、 算法说明:先研究线形插值和二次插值,在线性插值中,若逼近函数用两点式表示出来,则有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)原函数图像的绘制: 对于给定函数11-,2511)(2≤≤+=x xx f 。

在区间[]11-,上画出f (x )的函数图像。

(2)Lagrange 插值函数图像的绘制: 根据题目要求取11个等距插值节点)(10210,1,...10i i x i =+-=,求出每一个结点处的基函数)(x l j (j=0,1,…n ),然后根据Lagrange 插值多项式的一般形式把ϕ(x )写成与节点相对应的函数值)(i x f (i=0,1,2…n )与其插值基函数)(x l j (j=0,1,…n )的线形组合的形式。

即)()()(x l x f x jn0j i ∑==ϕ 2、源代码:// 数值分析Dlg.cpp : implementation file//#include "stdafx.h"#include "数值分析.h"#inc-lude "数值分析Dlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass 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// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_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_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMyDlg dialogCMyDlg::CMyDlg(CWnd* pParent /*=NULL*/): CDialog(CMyDlg::IDD, pParent){//{{AFX_DATA_INIT(CMyDlg)// 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 CMyDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CMyDlg)// NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CMyDlg, CDialog)//{{AFX_MSG_MAP(CMyDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_NEW, OnNew)ON_BN_CLICKED(IDC_LAG, OnLag)ON_BN_CLICKED(IDC_LINE, OnLine)ON_BN_CLICKED(IDC_HER, OnHer)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMyDlg message handlersBOOL CMyDlg::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 dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herereturn TRUE; // return TRUE unless you set the focus to a control}void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CMyDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CMyDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CMyDlg::OnNew(){// TODO: Add your control notification handler code hereint i;int j;int x00=331;int y00=225;double x;CDC *pDC=GetDC();pDC->SetMapMode(MM_LOMETRIC);pDC->SetViewportOrg(x00,y00);for(i=-750; i<=750; 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){double j=400.0/(1+25*x*x);pDC->SetPixel(x*500,j,RGB(0,0,0));}}void CMyDlg::OnLag(){// TODO: Add your control notification handler code here int i;int j;int x00=331;int y00=225;double x;CDC *pDC=GetDC();pDC->SetMapMode(MM_LOMETRIC);pDC->SetViewportOrg(x00,y00);for(i=-750; i<=750; i++){pDC->SetPixel(i,0,RGB(0,0,0));pDC->SetPixel(0,i,RGB(0,0,0));}double yx[]={-1,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8,1};double yy[12],lx[12],ly[12];double l_fenzi[12],l_fenmu[12];double l_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]);}}double qq,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(50,12,225));}}void CMyDlg::OnLine()// TODO: Add your control notification handler code here int i;int j;int x00=331;int y00=225;double x;CDC *pDC=GetDC();pDC->SetMapMode(MM_LOMETRIC);pDC->SetViewportOrg(x00,y00);for(i=-750; i<=750; i++){pDC->SetPixel(i,0,RGB(0,0,0));pDC->SetPixel(0,i,RGB(0,0,0));}double yx[]={-1,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8,1};double yy[14];for(i=0; i<=10; i++){yy[i]=1.0/(1+25*yx[i]*yx[i]);}CPen pen;CPen*oldpen;pen.CreatePen(PS_SOLID,5,RGB(127,255,212));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);}}void CMyDlg::OnHer()// TODO: Add your control notification handler code hereint x00=331,y00=225,i,j;double x;CDC *pDC=GetDC();pDC->SetMapMode(MM_LOMETRIC);pDC->SetViewportOrg(x00,y00);for(i=-750; i<=750; i++){pDC->SetPixel(i,0,RGB(0,0,0));pDC->SetPixel(0,i,RGB(0,0,0));}double yx[]={-1,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8,1};double yy[12];for(i=0; i<=10; i++){yy[i]=1.0/(1+25*yx[i]*yx[i]);}double x0,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(double qq=x0; qq<x1; qq+=0.005){double pp= 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(255,215,0));}}}2、实验结果:4、结果分析:本次实验,对用Lagrange插值法求f(x)的逼近函数 (x)有了更深刻的理解,学会了用程序来求解Lagrange插值基函数(j=0,1,…n),求出逼近函数 (x)并绘制出其图像,当插值函数次数很高时出现了Runge现象,可以通过函数图像很直观地看到Lagrange插值法的这个缺点。

数值计算方法Lagrange插值算法实验

数值计算方法Lagrange插值算法实验

Lagrange插值【实验目的】1、掌握Matlab基本语句,学会编写.M文件2、编写Lagrange算法【实验内容】1.编写Lagrange的Matlab程序lagrange.m,调用该程序,求解例2中的近似值。

补:例2已知:利用此三值的二次插值多项式求lg12的近似值。

【算法】//xi为插值自变量,yi为与xi对应的插值//x为插值自变量数组,y为插值数组float lagrange(x,y,xi){Float p=1.0;s=0.0;yi=0.0;for (k=1;k++;k<=n){for(j=1;j++;j<=n){If(k!=j){p*=(xi-x[j])/(x[k]-x[j]);}}s+=p*y[k];p=1.0;}yi=s;return yi;}【实验要求】本次实验要求写实现代码。

实验报告请写明【实验目的】、【实验内容】、【源代码及注释】和【实验心得】function [ yi ] = lagrange( x,y,xi )% Lagrange插值% x,y分别为已知节点及其函数值向量% xi为插值点,yi为插值n=length(x);m=length(y);if(n~=m)error('The length of x must be equal the length of y!'); ends=0;z=xi;for k=1:np=1.0;for j=1:nif j~=kp=p*(z-x(j))/(x(k)-x(j));endends=p*y(k)+s;end yi=s; end。

Lagrange 插值

Lagrange 插值

今天的上机作业1. Lagrange 插值给出()ln f x x 的数值表用Lagrange 插值计算ln 0.54的近似值。

2.Newton 插值用Newton 插值计算x=0.41的近似值。

3.插值法的全部内容把chap_2试验.doc 的全部内容作一边,粘在这个文件里(包括图形)答:grange 插值function f=lagrange_5(x) x0=[0.4,0.5,0.6,0.7,0.8];y0=[-0.916291,-0.693147,-0.510826,-0.356675,-0.223144]; L1=0;m=length(x0);n=length(y0);if m~=n, error('向量x 与y 的长度必须一致');end for i=1:nL=ones(1,length(x)); for j=1:n if j~=iL=L.*(x-x0(j))/(x0(i)-x0(j)); end endL1=L1+L*y0(i); end L1lagrange_5(0.54) L1 =-0.616142715200002.Newton插值function f=newton_li5(x) %x0为入的节点值,y0相应节点的函数值x0=[0.25 0.30 0.39 0.45 0.53];y0=[0.5000 0.5477 0.6245 0.6708 0.7280];n=length(x0)%syms xfor i=1:nf(i,1)=y0(i);endhx=f(1,1);xx=(1.0);for k=2:nfor i=k:nf(i,k)=(f(i,k-1)-f(i-1,k-1))/(x0(i)-x0(i-k+1)); %构造差商表endxx=xx*(x-x0(k-1));hx=hx+f(k,k)*xx; %计算函数的近似值end%f=expand(hx)Hxnewton(0.41)n =5hx =0.64030542443064ans =0.50000000000000 0 0 0 00.54770000000000 0.95400000000000 0 0 00.62450000000000 0.85333333333333 -0.71904761904761 0 00.67080000000000 0.77166666666666 -0.54444444444446 0.87301587301575 00.72800000000000 0.71500000000000 -0.40476190476189 0.60731538992422 -0.948930296755483.插值法的全部内容把chap_2试验.doc的全部内容作一边,粘在这个文件里(包括图形)P28 例22点插值function f=lagrange_2(x)x0=[0.32,0.34];y0=[0.314567,0.333487];L1=0;m=length(x0);n=length(y0);if m~=n, error('向量x与y的长度必须一致');endfor i=1:nL=ones(1,length(x));for j=1:nif j~=iL=L.*(x-x0(j))/(x0(i)-x0(j));endendL1=L1+L*y0(i);endL1lagrange_2(0.3367)L1 =0.330365200000003点插值function f=lagrange_3(x)x0=[0.32,0.34,0.36];y0=[0.314567,0.333487,0.352274];L1=0;m=length(x0);n=length(y0);if m~=n, error('向量x与y的长度必须一致');endfor i=1:nL=ones(1,length(x));for j=1:nif j~=iL=L.*(x-x0(j))/(x0(i)-x0(j));endendL1=L1+L*y0(i);endL1lagrange_3(0.3367)L1 =0.33037436203750Lagrange插值法%eg1_lagr.mclear;clf;xx=linspace(-5,5,50); y=sin(xx); %作被插函数的图象disp('n x=4.5处的插值绝对误差的绝对值')x1=linspace(-5,5,3); y1=sin(x1); yy1=lagr1(x1,y1,xx); %2次插值chazhi_y45_2=lagr1(x1,y1,4.5);gd_wucha_limit_y45_2=abs(chazhi_y45_2-sin(4.5));disp(sprintf('%d %15.4f %15.4f',2,chazhi_y45_2,gd_wucha_limit_y45_2))x2=linspace(-5,5,5); y2=sin(x2); yy2=lagr1(x2,y2,xx); %4次插值chazhi_y45_4=lagr1(x2,y2,4.5);gd_wucha_limit_y45_4=abs(chazhi_y45_4-sin(4.5));disp(sprintf('%d %15.4f %15.4f',4,chazhi_y45_4,gd_wucha_limit_y45_4))x3=linspace(-5,5,9); y3=sin(x3); yy3=lagr1(x3,y3,xx); %8次插值chazhi_y45_8=lagr1(x3,y3,4.5);gd_wucha_limit_y45_8=abs(chazhi_y45_8-sin(4.5));disp(sprintf('%d %15.4f %15.4f',8,chazhi_y45_8,gd_wucha_limit_y45_8))plot(xx,y,'m-');hold on,pause,plot(x1,y1,'rs',xx,yy1,'r-'); hold on,pause,plot(x2,y2,'b*',xx,yy2,'b-'); hold on,pause,plot(x3,y3,'ko',xx,yy3,'k-'); hold on计算函数值function f=newton_li4(x) %x0为入的节点值,y0相应节点的函数值x0=[0.40,0.55,0.65,0.80,0.90,1.05];y0=[0.41075,0.57815,0.69675,0.88811,1.02652,1.25382];n=length(x0)%syms xfor i=1:nf(i,1)=y0(i);endhx=f(1,1);xx=(1.0);for k=2:nfor i=k:nf(i,k)=(f(i,k-1)-f(i-1,k-1))/(x0(i)-x0(i-k+1)); %构造差商表endxx=xx*(x-x0(k-1));hx=hx+f(k,k)*xx; %计算函数的近似值end%f=expand(hx)hxnewton(0.596)n =5hx =0.77193768707246ans =0.50000000000000 0 0 0 00.54770000000000 0.95400000000000 0 0 00.62450000000000 0.85333333333333 -0.71904761904761 0 00.67080000000000 0.77166666666666 -0.54444444444446 0.87301587301575 00.72800000000000 0.71500000000000 -0.40476190476189 0.60731538992422 -0.94893029675548Newton插值法%eg1_newton.mclear;clf;xx=linspace(-5,5,50); y=sin(xx); %作被插函数的图象disp('n x=4.5处的插值绝对误差的绝对值')x1=linspace(-5,5,3); y1=sin(x1); yy1=newton1(x1,y1,xx,2); %2次插值chazhi_y45_2=newton1(x1,y1,4.5,2);gd_wucha_limit_y45_2=abs(chazhi_y45_2-sin(4.5));disp(sprintf('%d %15.4f %15.4f',2,chazhi_y45_2,gd_wucha_limit_y45_2))x2=linspace(-5,5,5); y2=sin(x2); yy2=newton1(x2,y2,xx,4); %4次插值chazhi_y45_4=newton1(x2,y2,4.5,4);gd_wucha_limit_y45_4=abs(chazhi_y45_4-sin(4.5));disp(sprintf('%d %15.4f %15.4f',4,chazhi_y45_4,gd_wucha_limit_y45_4))x3=linspace(-5,5,9); y3=sin(x3); yy3=newton1(x3,y3,xx,8); %8次插值chazhi_y45_8=newton1(x3,y3,4.5,8);gd_wucha_limit_y45_8=abs(chazhi_y45_8-sin(4.5));disp(sprintf('%d %15.4f %15.4f',8,chazhi_y45_8,gd_wucha_limit_y45_8))plot(xx,y,'m-');hold on,pause,plot(x1,y1,'rs',xx,yy1,'r-'); hold on,pause,plot(x2,y2,'b*',xx,yy2,'b-'); hold on,pause,plot(x3,y3,'ko',xx,yy3,'k-'); hold on。

数值分析Lagrange插值多项式

数值分析Lagrange插值多项式

其余的将M值及f2[x_]修改即可,得到插值函数修改分f3[x_]即可。
1 n+1 !
f
n+1
(εx )
n i=0(x
− xi )
其中 εx 为区间内一点
但 Lagrange 插值法没有承接性,可以进行改良。
【Lagrange 插值算法描述】 1. 对给定函数选取其区间上的一系列节点并计算其函数值,得到点列 (x0 , y0 ),…,( xn , yn ); 2. 通过上述点列构造 Lagrange 基函数li x = 出 Lagrange 插值函数Ln x =
【实验】 通过 Mathematica 编写程序得到如下结果: N=5: 1. 取xi = 5 −
10 N
i , i = 0,1, … ,N 得到:
(1) 插值点为:
(2) 由上述插值点构造出 Lagrange 插值函数:
(3)由题目所给出的条件计算误差得到:
插值函数与原函数的图像为:
其中蓝色为原函数图像,红色为插值函数图像,可以看出在 0 点误差最大,与 我们的计算结果相吻合。
n k=0 yk lk (x); n x −x i j=0 x −x i j j ≠i
,并由该基函数构造
3. 由多项式插值误差定理来估计其误差: f x −p x =
1 n+1 !
f
n+1
(εx )
n i=0(x
− xi )
其中 εx 为区间内一点
但此题有自己的估计误差的要求,则我们依照题意估计误差。
n x −x i j=0 x −x i j j ≠i
,
li x = δij
n k=0 yk lk (x)
来构造 Lagrange 插值多项式: Ln x =

拉格朗日(Lagrange)插值

拉格朗日(Lagrange)插值

p2(7) =
(1–4)(1–9)
*1 + (4–1)(4–9)
*2
(7–1)(7–4)
+ (9–1)(9–4) * 3
= 2.7
例5.4 已知函数y=f(x)在节点上满足
x x0 x1 x2
y y0 y1 y2
求二次多项式 p(x) = a0 + a1x + a2x2
使之满足 p(xi) = yi
li (x的) 插值
lk (x0 ) 0,,lk (xk1) 0,lk (xk ) 1,lk (xk1 ) 0,,lk (xn ) 0

lk
(xi )
ki
1 0
(i k) (i k)
由条件 lk (xi ) 0 ( i k)知, x0 , x1,, xk1, xk1,, xn
都是n次 lk (x) 的零点,故可设
l0 (x)
再由另一条件 l0 (x0
c(x
) 1
x1 )( x x2
确定系数
)
c
(x0
1 x1)( x0
x2
)
从而导出
l0 (x)
(x (x0
x1)( x x2 ) x1 )( x0 x2 )
类似地可以构造出满足条件: l1(x1) 1, l1(x0 ) 0,
的插值多项式
l1 ( x)
lk (x)
j0 jk
n
x xj
n
(xk x j )
j0 xk x j
jk
j0 jk
称 lk (x) 为关于基点 xi 的n次插值基函数(i=0,1,…,n)
以n+1个n次基本插值多项式 lk (x)(k 0,1,, n) 为基础,就能直接写出满足插值条件

多项式插值,Lagrange插值,Lagrange反插值,牛顿插值

多项式插值,Lagrange插值,Lagrange反插值,牛顿插值

数学软件实验任务书实验一 多项式插值1实验原理()y f x =在区间[,]a b 上的1n +个互异点01n a x x x b =<<= 出得值为012,,,,n y y y y ,存在次数不超过n 的多项式:2012()n n n P x a a x a x a x =++++使得满足条件:()()n i i p x f x =2 数据来源X=[1 1.4 1.8 2.0]Y=[-2 -0.8 0.4 1.2]3 实验程序clcclear allX=[1 1.4 1.8 2.0];Y=[-2 -0.8 0.4 1.2]';n=length(X);A=zeros(n,n);for i=1:nfor j=1:n-1A(i,j+1)=X(i)^j;endendB=zeros(n,1);for i=1:nB(i,1)=1;endA(:,1)=B;A1=A;%%%%%%%%范德蒙行列式a=inv(A1)*Ysyms x;f=a(1)+a(2)*x+a(3)*x^2+a(4)*x^3%%%%%检验subs(f,1)4 实验结果%%%%%%%%%%多项式系数a =-9.200012.5333-7.00001.666723()0.9212.537 1.67f x x x x =-+-+%%%%%%%%%%%%%%%代入1x =检验subs(f,1)ans =-2.000000003实验二 Lagrange 插值1 实验原理通过平面上不同两点可以确定一条直线经过这两点,这就是拉格朗日线性插值问题,对于不在同一条直线的三个点得到的插值多项式为抛物线。

这里给出一般的插值公式,拉格朗日插值的基多项式为:10(),0,1,2,,n i j i jj i x x l x i n x x =≠-==-∏ 有了基函数以后就可以直接构造插值多项式,插值多项式为:0()()nn i i i p f x l x ==∑2 数据来源X=[0 1 2 4]Y=[1 9 23 3]3 实验程序function laglange(X,Y,x0)syms xn=length(X);w=1;for i=1:nw=w*(x-X(i));enda=diff(w,x);f=0;for i=1:nb=w/(x-X(i));l=b/(subs(a,x,X(i)));f=f+l*Y(i);endf=expand(f)%subs(f,x,x0)sprintf('f(%f)=%f',x0,subs(f,x,x0))end4 实验结果运行程序在Matlab 窗口显示f =3 2- 11/4 x + 45/4 x - 1/2 x + 1 即:3211451()1442f x x x x =-+-+ 实验三 牛顿插值1 实验原理函数()f x 的差商定义为:[]()k k f x f x =111[][][,]k k k k k kf x f x f x x x x ----=-111[,,][,,][,,,]k j k k j k k k j k k k j f x x f x x f x x x x x -+------=-下面给出牛顿插值多项式为:001001011()[][,]()[,,,]()()()n n n N x f x f x x x x f x x x x x x x x x -=+-++---如果记:011()()(),1,2,,k k w x x x x x x k n -=---=则牛顿插值可以表达为: 001101()[][,][,,,]n n n N x f x f x x w f x x x w =+++2 数据来源X=[1.0 1.3 1.6 1.9 2.2]Y=[0.7651977 0.6200860 0.4554022 0.2818186 0.1103623] 3 实验程序1 计算差商表程序clcclearX=[1.0 1.3 1.6 1.9 2.2];Y=[0.7651977 0.6200860 0.4554022 0.2818186 0.1103623]; f0=Y;n=length(X);f=zeros(n);f(1,:)=Y;for i=1:n-1f(2,i)=(f0(i+1)-f0(i))/(X(i+1)-X(i))endfor k=2:n-1for i=1:n-kf(k+1,i)=(f(k,i+1)-f(k,i))/(X(k+i)-X(i)) endend2 牛顿差值程序function s=niudun(x,y,t)syms p;s=y(1);xishu=0;dxs=1;n=length(x);%%构造牛顿插值方法for(i=1:n-1)for(j=i+1:n)xishu(j) = (y(j)-y(i))/(x(j)-x(i));endtemp1(i)=xishu(i+1);dxs=dxs*(p-x(i));s=s+temp1(i)*dxs;y=xishu;endsimplify(s)end4 实验结果差商表:f =0.7652 0.6201 0.4554 0.2818 0.1104-0.4837 -0.5489 -0.5786 -0.5715 0-0.1087 -0.0494 0.0118 0 00.0659 0.0681 0 0 00.0018 0 0 0 0在命令窗口输入x=[1.0 1.3 1.6 1.9 2.2];y=[0.7651977 0.6200860 0.4554022 0.2818186 0.1103623]; yt=niudun(x,y,1.5)得到结果yt =[0.5118199945]。

三次lagrange插值多项式例题

三次lagrange插值多项式例题

三次lagrange插值多项式例题
Lagrange插值多项式是一种用于数据拟合的方法,它可以根据给定的数据点,构造一个多项式函数,从而在数据点之间进行插值。

以下是一个三次Lagrange插值多项式的例题:
假设有如下数据点:(1,3),(2,5),(4,1),(5,7)
构造三次Lagrange插值多项式,求当x=3时,函数的取值。

首先,我们需要根据给定的数据点,构造出Lagrange插值多项式的基函数。

对于三次Lagrange插值多项式,其基函数可以表示为:
L0(x) = (x-2)(x-4)(x-5)/(-12)
L1(x) = (x-1)(x-4)(x-5)/6
L2(x) = (x-1)(x-2)(x-5)/(-4)
L3(x) = (x-1)(x-2)(x-4)/6
其中,Li(x)表示第i个基函数,其分母为所有数据点的x坐标之差的乘积,分子为除去第i个数据点的x坐标之差的乘积。

接下来,我们可以将基函数和对应的y坐标代入插值多项式的公式中,得到:
P(x) = 3L0(x) + 5L1(x) + L2(x) - 7L3(x)
当x=3时,P(x)的取值为:
P(3) = 3L0(3) + 5L1(3) + L2(3) - 7L3(3)
= 3(-2*1*2/12) + 5((3-1)*(3-4)*(3-5)/6) + (-2*1*2/4) -
7((3-1)*(3-2)*(3-4)/6)
= -2.33
因此,当x=3时,函数的取值为-2.33。

以上就是三次Lagrange插值多项式的例题。

通过构造基函数和代入公式,可以轻松求解出插值多项式在任意点的取值。

数值分析Lagrange插值法计算实验

数值分析Lagrange插值法计算实验

数值分析实验报告(01)一、实验目的通过实验锻炼和掌握的能力掌握Lagrange 插值方法并学会利用计算机编程计算函数值。

二、实验内容给出()ln f x x =的数值表 x0.4 0.5 0.6 0.7 0.8 ln x-0.916291 -0.693147 -0.510826 -0.356675 -0.223144用线性插值和二次插值计算的近似值。

计算ln(0.54)。

三、编程思路0.5图1 程序框图四、Matlab 程序代码function y0=lagrange(x,y,x0)nx=length(x);ny=length(y);if nx~=nyreturn;endn=nx;y0=0;for k=1:np=1;for j=1;nif j~=kp=p.*(x0-x(j))./(x(k)-x(j));endendy0=y0+p*y(k);end% x=[0.5 0.6];% y=[-0.693147 -0.510826];x0=0.54;y0=lagrange(x,y,x0);y0% x=[0.4 0.5 0.6];% y=[-0.916296 -0.693147 -0.510826];x0=0.54;y0=lagrange(x,y,x0);y0五、数值结果及分析(数值运行结果及对结果的分析)y0 =-0.6202y0 =-0.6202六、实验体会(计算中出现的问题,解决方法,实验体会)输入程序时括号含义不明,或者输入括号减少,导致结果错误。

仔细检查,寻找错误,一定要仔细认真。

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

给定函数211)(x x f +=
,现考察在区间【-5,5】上)(x f 上的等距插值问题。

1. 利用matlab 可以得到211)(x x f +=的图形如下图所示: x=-5:0.1:5;
y=1./(1+x.^2);
plot(x,y)
2. 作)(x f 的20个节点的分段线性插值)(20x lin ,其实现代码及图形如下:
x=-5:0.1:5;
y=1./(1+x.^2);
x1=linspace(-5,5,20);
y1=interp1(x,y,x1,'linear');
plot(x,y,’r ’,x1,y1,’b ’)
所得图形如下:
其中兰线我分段线性插值函数)(20x lin 的曲线
此处需说明由于此处利用的PLOT 函数其绘制曲线的原理既是描点,连线,其所得图形是折线。

所以通过plot 函数绘制)(x f 函数时,如果取点不够多,且恰好去20个等距节点时,其所得的图形和通过分段线性插值所得的)(20x lin 图形是一样,即若运行下列代码会得到下面图形:
x=linspace(-5,5,20);
y=1./(1+x.^2);
plot(x,y)
即其和通过分段线性插值所得的函数)(20x lin 的曲线是重合的。

3. 作)(x f 的21个等距节点的20次lagrange 插值函数)(20x l 。

此处由于matlab 中没有固定的lagrange 插值函数,所以定义lagrange 函数如下,并将其放入matlab 可搜索到的工作目录中:\\....\matlab7.0\work 中。

所定义的lagrange 函数如下:
(此处参考:Numerical Computing with MATLAB 【M 】 Cleve Moler, 并下载其附带的lagrange 函数)
% textbook page 35
function yh = lagrange(x,y,xh)
n = length(x);
m = length(xh);
x = reshape(x,n,1); % x = x(:);
y = reshape(y,n,1); % y = y(:);
xh = reshape(xh,m,1); % xh = xh(:);
yh = zeros(m,1);
c1 = ones(1,n-1);
c2 = ones(m,1);
for i=1:n,
xp = x([1:i-1,i+1:n]);
yh = yh + y(i) * prod((xh*c1-c2*xp')./(c2*(x(i)*c1-xp')),2);
end
然后运行下列代码:
x=linspace(-5,5,21)
y=1./(1+x.^2)
x1=linspace(-5,5,23)
y1=lagrange(x,y,x1)
plot(x,y,'r',x1,y1,'b')
可得到如下图形;
这里需说明用plot 函数所得的被插值函数)(x f 与20次lagrange 插值函数的曲线都不是其精确值,由于在绘制)(x f 曲线时,只取了【-5,5】上的21个点,而绘制)(20x l 函数时只取了【-5,5】上的23个点。

以下分别做出10次lagrange 插值函数)(10x l 与16次lagrange 插值函数)(16x l 以作比较。

如:)(x f 在【-5,5】上取11个点,再作10次lagrange 插值函数)(10x l ,然后运行下列代码:
x=linspace(-5,5,11)
y=1./(1+x.^2)
x2=linspace(-5,5,23)
y2=lagrange(x,y,x2)
plot(x,y,'r',x2,y2,'b')
即得如下图形
如:)(x f 在【-5,5】上取17个点,再作16次lagrange 插值函数)(16x l ,然后运行下列代码:
x=linspace(-5,5,17)
y=1./(1+x.^2)
x3=linspace(-5,5,23)
y3=lagrange(x,y,x3)
plot(x,y,'r',x3,y3,'b')
即得如下图形:
若将其绘制在一起则可得下面图形:plot(x1,y1,'r',x2,y2,'b',x3,y3,'g')。

相关文档
最新文档