计算方法中的Lagrange插值
- 格式:ppt
- 大小:555.00 KB
- 文档页数:20
第5章 实验四Lagrange 插值多项式实验目的:理解Lagrange 插值多项式的基本概念,熟悉Lagrange 插值多项式的公式及源代码,并能根据所给条件求出Lagrange 插值多项式,理解龙格现象。
5.1 Lagrange 插值多项式 Lagrange 插值多项式的表达式: 1,,2,1,)()()(,)()(1111+=--==∏∑+≠=+=n i x x x x x l x l y x L n ij j j i j i n i i i 。
其中)(x l i 被称为插值基函数,实际上是一个n 次多项式。
)(x l i 的这种表示具有较好的对称性。
公式具有两大优点:(1)求插值多项式,不需要求解线性方程组,当已知数据点较多时,此公式更能显示出优越性。
(2)函数值可以用符号形式表示,数据点未确定的纵坐标可用多项式表示。
5.2 Lagrange 插值多项式源代码I% 功能: 对一组数据做Lagrange 插值 % 调用格式:yi=Lagran_(x,y,xi) % x,y 数组形式的数据表 % xi:待计算y 值的横坐标数组 % yi 用Lagrange 插值算出的y 值数组 function fi=Lagran_(x,f,xi)fi=zeros(size(xi)); np1=length(f); for i=1:np1z=ones(size(xi)); for j=1:np1if i~=j,z=z.*(xi-x(j))/(x(i)-x(j));end endfi=fi+z*f(i); end return例5.1 已知4对数据(1.6,3.3),(2.7,1.22),(3.9,5.61),(5.6,2.94)。
写出这4个数据点的Lagrange 插值公式,并计算出横坐标xi=[2.101,4.234]时对应的纵坐标。
解:4个数据点的Lagrange 插值公式为:)9.36.1(*)7.26.5(*)6.16.5()9.3(*)7.2)(6.1(*94.2)6.59.3(*)7.29.3(*)6.19.3()6.5(*)7.2(*)6.1(*9.3)6.57.2(*)9.37.2(*)6.17.2()6.5(*)9.3(*)6.1(*22.4)6.56.1(*)9.36.1(*)7.26.1()6.5(*)9.3(*)7.2(*3.3)(3------+------+------+------=x x x x x x x x x x x x x L清单5.1 clearx=[1.6, 2.7, 3.9, 5.6]; y=[3.3, 1.22, 5.61, 2.94]; xi=[2.101,4.234]; yi=Lagran_(x,y,xi); xx=1.5:0.05:6.5; yy=Lagran_(x,y,xx); plot(xx,yy,x,y,'o')其结果为:yi =1.0596 6.6457xg (x ):-, d a t a p o i n t s :o图5.1 插值多项式曲线图5.3 Lagrange插值多项式源代码II% 输入:x是插值节点横坐标向量;y是插值节点对应纵坐标向量。
Lagrange插值定理在数学中有着重要的地位,特别是在高等代数中起着至关重要的作用。
它可以用来解决复杂的多项式函数的插值问题,为我们理解和应用数学领域的知识提供了有力的工具。
在不同的学术领域,人们对于Lagrange插值定理有着不同的解读,从而衍生出不同的应用和研究方向。
本文将从几个不同的角度来探讨Lagrange插值定理在高等代数中的不同解读。
一、数学领域中的Lagrange插值定理解读Lagrange插值定理最基本的形式可以描述为:给定一个次数为n的多项式函数,通过n+1个互异的插值点,可以确定该多项式函数的系数,并进而插值计算出其他点的函数值。
从数学的角度来看,Lagrange插值定理是关于多项式插值的一个重要定理。
1. 从数学原理角度解读从数学原理角度来看,Lagrange插值定理是建立在对多项式插值理论的深入研究之上的。
它涉及到多项式插值的基本概念和方法,通过对于插值点的选取和多项式函数的构造来实现对未知函数值的估计。
在数学原理角度下,人们可以进一步研究多项式插值的稳定性、误差估计和收敛性等问题,从而深化对Lagrange插值定理的理解,并且将其应用于更广泛的数学领域。
2. 从数值计算角度解读与数学原理角度不同,Lagrange插值定理也可以从数值计算的角度来解读。
在数值计算中,我们常常需要利用已知的数据点来估计未知函数值,在这种情况下,Lagrange插值定理就可以发挥出极大的作用。
通过构造插值多项式,我们可以利用插值多项式来进行数值计算,从而得到我们所需要的结果。
从数值计算的角度来看,Lagrange插值定理是一个非常实用的工具和方法。
二、Lagrange插值定理在高等代数中的应用除了在数学领域中有着重要的理论意义之外,Lagrange插值定理在高等代数中还有着广泛的应用。
在高等代数课程中,Lagrange插值定理不仅可以帮助学生更深入地理解多项式插值的原理,还可以通过实际案例来展示插值多项式的具体应用。
拉格朗日插值多项式是一种近似函数,它可以通过给定一组离散数据点,来估算出其他数据点的值。
拉格朗日插值多项式是由18世纪法国数学家Joseph-Louis Lagrange提出的,他是一位杰出的数学家和物理学家。
拉格朗日插值多项式的推导可以从一个简单的例子开始。
假设我们有一组离散的数据点{(x1, y1), (x2, y2), …, (xn, yn)},我们想要通过这些点来拟合一个函数,使得在这些点上的函数值与给定的数据点相等。
首先,我们假设要拟合的函数是一个n-1次多项式:P(x) = a0 + a1x + a2x^2 + … + an-1x^n-1我们的目标是找到多项式中的系数a0, a1, …, an-1,使得在给定的数据点上函数值与数据点的y值相等。
根据插值的思想,我们希望在每个数据点上函数值与给定的数据点相等,即对于每个数据点(xi, yi)都满足:P(xi) = yi我们可以将这个条件用一个方程表示出来。
将插值多项式代入方程中,我们得到:a0 + a1xi + a2xi^2 + … + an-1xi^n-1 = yi现在我们有n个方程,通过解这个方程组,我们可以求解出多项式的系数。
为了方便求解,我们引入拉格朗日基函数。
拉格朗日基函数Li(x)的定义是一个n 次多项式,它可以满足以下条件:1.对于所有的i≠j,Li(xj) = 02.Li(xi) = 1根据拉格朗日基函数,我们可以将插值多项式表示为:P(x) = L0(x)y0 + L1(x)y1 + … + Ln-1(x)yn-1其中Li(x)可以表示为:Li(x) = (x - x0)(x - x1)…(x - xi-1)(x - xi+1)…(x - xn-1) / (xi - x0)(xi - x1)…(xi - xi-1)(xi - xi+1)…(xi - xn-1)现在我们可以使用拉格朗日基函数来表示插值多项式,并求解多项式的系数。
拉格朗⽇(Lagrange)插值算法拉格朗⽇插值(Lagrange interpolation)是⼀种多项式插值⽅法,指插值条件中不出现被插函数导数值,过n+1个样点,满⾜如下图的插值条件的多项式。
也叫做拉格朗⽇公式。
这⾥以拉格朗⽇3次插值为例,利⽤C++进⾏实现:1//利⽤lagrange插值公式2 #include<iostream>3using namespace std;45double Lx(int i,double x,double* Arr)6 {7double fenzi=1,fenmu=1;8for (int k=0;k<4;k++)9 {10if (k==i)11continue;12 fenzi*=x-Arr[k];13 fenmu*=Arr[i]-Arr[k];14 }15return fenzi/fenmu;16 }1718int main()19 {20double xArr[4]={};21double yArr[4]={};22//输⼊4个节点坐标23 cout<<"请依次输⼊4个节点的坐标:"<<endl;24for (int i=0;i<4;i++)25 cin>>xArr[i]>>yArr[i];2627//输⼊要求解的节点的横坐标28 cout<<"请输⼊要求解的节点的横坐标:";29double x;30 cin>>x;31double y=0;32for (int i=0;i<4;i++)33 y+=Lx(i,x,xArr)*yArr[i];34 printf("x=%lf时,y=%lf\n",x,y);3536//分界,下⾯为已知y求x37 cout<<"请输⼊要求解的节点的纵坐标:";38 cin>>y;39 x=0;40for (int i=0;i<4;i++)41 x+=Lx(i,y,yArr)*xArr[i];42 printf("y=%lf时,x=%lf\n",y,x);4344 system("pause");45return0;46 }作者:耑新新,发布于转载请注明出处,欢迎邮件交流:zhuanxinxin@。
《数值分析》实验报告实验编号:实验四课题名称:Lagrange插值一、算法介绍对Lagrange型的n次插值多项式,先构造n+1个插值节点x[0],x[1],…,x[n]上的n次插值基函数对任一点xi所对应的插值基函数l[i](x)=[(x-x[0])…(x-x[i-1])(x-x[i+1])…(x-x[n])]/[(x[i]-x[0])…(x[i]-x[i-1])(x[i]-x[i+1 ])…(x[i]-x[n])],其中i=0,1,2,…,n。
有了这n+1个n次插值基函数,n次Lagrange 型插值多项式就容易写出来了,表达式为:f(x)=y[1]*l[1](x)+y[2]*l[2](x)+…+y[n]*l[n](x)。
此程序中n=10。
二、程序代码// testView.cpp : implementation of the CTestView class//#include "stdafx.h"#include "test.h"#include "testDoc.h"#include "testView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CTestViewIMPLEMENT_DYNCREATE(CTestView, CView)BEGIN_MESSAGE_MAP(CTestView, CView)//{{AFX_MSG_MAP(CTestView)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CTestView construction/destructionCTestView::CTestView(){// TODO: add construction code here}CTestView::~CTestView(){}BOOL CTestView::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}/////////////////////////////////////////////////////////////////////////////// CTestView drawingvoid CTestView::OnDraw(CDC* pDC){CTestDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereint i,j,k;double x,y,p_x,p_y,l,xx[100],f[100],F[100],sum,p_sum;CPen MyPen,*OldPen;pDC->SetViewportOrg(400,400); //定义坐标原点for(i=-500;i<500;i++){pDC->SetPixel(0,i,RGB(0,0,0));pDC->SetPixel(i,0,RGB(0,0,0)); //画出坐标}pDC->TextOut(-210,5,"-1");pDC->TextOut(196,5,"1");//原函数MyPen.CreatePen(PS_SOLID,1,RGB(255,0,0));//定义画笔颜色OldPen=pDC->SelectObject(&MyPen);x=-1.0,y=1/(1+25*x*x);p_x=x*200;p_y=-y*200;pDC->MoveTo(p_x,p_y);for (x=-1.0;x<=1.0;x+=0.0001){y=1/(1+25*x*x);p_x=x*200;p_y=-y*200;pDC->LineTo(p_x,p_y);}pDC->SelectObject(OldPen);MyPen.DeleteObject();//Lagrange插值x=-1.0;MyPen.CreatePen(PS_SOLID,1,RGB(0,255,0));OldPen=pDC->SelectObject(&MyPen);for(i=0;i<=10;i++){f[i]=1/(1+25*x*x);xx[i]=x;x+=0.2;}x=-1.0;y=1/(1+25*x*x);p_x=x*200,p_y=-y*200; //将x和y坐标各放大200倍pDC->MoveTo(p_x,p_y);for(k=0;k<=1000;k++){sum=0;for(i=0;i<=10;i++){l=1;for(j=0;j<=10;j++){if(i!=j)l=l*(x-xx[j])/(xx[i]-xx[j]);}sum+=f[i]*l;}p_x=x*200;p_y=-sum*200;pDC->LineTo(p_x,p_y);x+=0.002;}pDC->SelectObject(OldPen);MyPen.DeleteObject();}/////////////////////////////////////////////////////////////////////////////// CTestView printingBOOL CTestView::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}void CTestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add extra initialization before printing}void CTestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add cleanup after printing}/////////////////////////////////////////////////////////////////////////////// CTestView diagnostics#ifdef _DEBUGvoid CTestView::AssertValid() const{CView::AssertValid();}void CTestView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CTestDoc* CTestView::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTestDoc)));return (CTestDoc*)m_pDocument;}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// CTestView message handlers三、运算结果截屏红色的曲线为原函数图像,绿色曲线为Lagerange插值多项式函数对应的图像四、算法分析上述图像中绿色的曲线为Lagrange插值多项式所对应的图像,通过观察可见函数图像在靠近区间端点的地方出现了Runge现象。
lagrange 插值法实验基本原理: lagrange 插值法是用来解决离散点的插值问题。
若给定两个插值点),(),,(1100y x y x 其10x x ≠,在公式中取1=n ,则La g r a n g e 插值多项式为:)()()()()()(001010010110101x x x x y y y x x x x y x x x x y x p ---+=--+--=是经过),(),,(1100y x y x 的一条直线,故此法称为线性插值法。
2、若函数给定三个插值点 2,1,0),,(=i y x i i ,,其中i x 互不相等,在公式中取1=n ,则Lagrange 插值多项式为: ))(())(())(())(())(())(()(1202102210120120102102x x x x x x x x y x x x x x x x x y x x x x x x x x y x p ----+----+----=是一个二次函数,若2,1,0),,(=i y x i i 三点不在一条直线上,则该曲线是一条抛物线,这种插值法称为二次插值或抛物插值。
为了解决这个问题,我们为此构造了这个矩阵⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛----+---.........))(())(()())((12010212010212010x x x x x x x x x x x x x x x x 就可以找到相应系数。
实验结果分析:在应用拉格朗日插值法时应注意以下几个问题:1、在能获得原始资料时应尽量获取原始资料, 不能盲目地用组数据代入公式来估计未知数据。
2、在利用拉格朗日多项式进行插值估计时, 要求所研究范围的值的变化不受特殊或偶照因素的影响, 即的值是在正常条件下的。
3、如果有两组值(i x ,iy ),(j x ,j y ) 的i x =j x ;则这两组值只能取一组代入多项式计算, 否则便会出现 i y 与j y 的项分母为零的情况这种情况对于这种情况, 用哪组值代入多项式估计更好, 往往不易确定。
数学基础课里的lagrange插值公式lagrange插值公式:
1. Lagrange插值法是一种经典的插值方法,在数学和工程领域里都是一种常用的数值算法,也可以用来求解一元函数的极值点。
它实际上是对有n个数据点(比如:xi,yi)的函数f ( x) 进行拟合,形成n-1阶有理曲线,使得拟合曲线经过这些数据点。
2. Lagrange插值公式的可求性:在n个点的插值中,已知n个数据点(xi,yi),求使拟合曲线恰
好经过n个点的系数 ak 的问题。
3. Lagrange 插值公式:向量f (x) 和向量自变量x 可定义如下:f (x) = (f1 (x),f2 (x),…,fn-1 (x),fn (x));xi = (x1,x2,…,xn),那么有f (x) = Σ
j=1 n Lj(x).fj (*j = 1, 2,…, n*)
(其中Lj (x) 为Lagrangebasis 的基函数,可定义为:Lj (x) =Π(x/xj, i !=j))
4. Lagrange 插值公式的优点:
(1) Lagrange插值法简单易懂,实现简单;
(2) Lagrange插值法的拟合精度高;
(3) Lagrange插值法的拟合速度也是很快的,适用
性强。
5. Lagrange 插值公式的缺点:
(1) Lagrange插值法拟合数据点多时,计算量大;
(2) Lagrange插值法只适用于有n个数据点的插值,不能求解多元插值。
第二章 插值法知识点:拉格朗日插值法,牛顿插值法,误差,龙格现象,分段插值。
1.背景实践活动中,表现事务变化的信息往往只是一些离散点值,例如 每个6小时记录一次温度,以此反映一天的气温变化状况,如下表图能从已知这些离散点值信息知道10时的气温是多少吗?如果能通过这些离散点值找到气温变化的规律,也就是说能找到一个反映气温变化规律的“原”函数,就可以知道10时的气温是多少。
但我们能采集到的信息只有这些离散点值,时常给不出反映气温变化规律“原”函数的解析表达式,怎么办?通常可以用近似的办法解决这个问题,办法是构造一个通过所有离散点值的“近似”函数,用这个“近似”函数逼近“原”函数。
如图构造这个“近似”函数的方法称为插值方法。
34 32 30 28 26 24 22 20时间(时)温度(。
C )34 32 30 28 26 24 22 20温度(。
C )2.概念实际问题中,能采集到的信息只是一些离散点值{x i,f(x i)}(i=0,1,2,…n),时常给不出一个函数f(x)的解析表达式,因之,转而考虑选择一个简单的函数ϕ(x)近似替代(原来)f(x)。
定义:设f(x)为定义在区间[a,b]上的函数,x0,x1,…,x n为[a,b]上的互异点,y i=f(x i)。
若存在一个简单函数ϕ(x),满足(插值条件)ϕ(x i)=f(x i),i=0,1,…,n。
则称 ϕ(x)为f(x)插值函数,f(x)为被插函数,点x0,x1,…,x n为插值节点,点{x i,f(x i)},i=0,1,2,…n为插值点。
若用ϕ(x)≈f(x),则计算f(x)就转换为计算 ϕ(x)。
插值需要解决:插值函数是否存在唯一;插值函数如何构造;插值函数与被插函数的误差估计和收敛性。
对插值函数的类型有多种不同的选择,代数多项式p n(x)常被选作插值函数 ϕ(x)。
P23(2.18)和(2.19)指出,存在唯一的满足插值条件的n次插值多项式p n(x)。
实验题目1 Lagrange插值摘要给定平面上n+1个不同的数据点:则满足条件的n次拉格朗日插值多项式是存在唯一的。
若,且充分光滑,则当时,有误差估计式前言利用拉格朗日插值多项式求的近似值程序设计流程拉格朗日插值框图问题1 (1)N = 5时,程序运行如下:TestLag(inline('1./(1+x.^2)'), -5, 5, 5, 0.75:4.75);将区间[-5,5]分为了5段计算插值的点xi =0.7500 1.7500 2.7500 3.7500 4.7500 计算出的插值yi =0.9054 0.5258 0.0096 -0.3568 -0.1595 插值点处函数值yFact =0.6400 0.2462 0.1168 0.0664 0.0424 计算误差err =-0.2654 -0.2796 0.1072 0.4232 0.2020N = 10时,程序运行如下:TestLag(inline('1./(1+x.^2)'), -5, 5, 10, 0.75:4.75);将区间[-5,5]分为了10段计算插值的点xi =0.7500 1.7500 2.7500 3.7500 4.7500 计算出的插值yi =0.6907 0.2330 0.1122 0.1084 -0.2360 插值点处函数值yFact =0.6400 0.2462 0.1168 0.0664 0.0424 计算误差err =-0.0507 0.0132 0.0045 -0.0420 0.2785N = 20时,程序运行如下:TestLag(inline('1./(1+x.^2)'), -5, 5, 20, 0.75:4.75);将区间[-5,5]分为了20段计算插值的点xi =0.7500 1.7500 2.7500 3.7500 4.7500 计算出的插值yi =0.6413 0.2491 0.1282 0.1903 6.4150 插值点处函数值yFact =0.6400 0.2462 0.1168 0.0664 0.0424 计算误差err =-0.0013 -0.0029 -0.0114 -0.1239 -6.3726问题1 (2)N = 5时,程序运行如下:TestLag(inline('exp(x)'), -1, 1, 5, [-0.95 -0.05 0.05 0.95]); 将区间[-1,1]分为了5段计算插值的点xi =-0.9500 -0.0500 0.0500 0.9500计算出的插值yi =0.3863 0.9513 1.0512 2.5863插值点处函数值yFact =0.3867 0.9512 1.0513 2.5857计算误差err =1.0e-003 *0.4471 -0.1051 0.1069 -0.6129N = 10时,程序运行如下:TestLag(inline('exp(x)'), -1, 1, 10, [-0.95 -0.05 0.05 0.95]); 将区间[-1,1]分为了10段计算插值的点xi =-0.9500 -0.0500 0.0500 0.9500计算出的插值yi =0.3867 0.9512 1.0513 2.5857插值点处函数值yFact =0.3867 0.9512 1.0513 2.5857计算误差err =1.0e-008 *-0.3126 -0.0055 -0.0055 -0.3714N = 20时,程序运行如下:TestLag(inline('exp(x)'), -1, 1, 20, [-0.95 -0.05 0.05 0.95]); 将区间[-1,1]分为了20段计算插值的点xi =-0.9500 -0.0500 0.0500 0.9500计算出的插值yi =0.3867 0.9512 1.0513 2.5857插值点处函数值yFact =0.3867 0.9512 1.0513 2.5857计算误差err =1.0e-012 *0.7339 0 -0.0002 -0.5671问题2 (1)N = 5时,程序运行如下:TestLag(inline('1./(1+x.^2)'), -1, 1, 5, [-0.95 -0.05 0.05 0.95]); 将区间[-1,1]分为了5段计算插值的点xi =-0.9500 -0.0500 0.0500 0.9500计算出的插值yi =0.5136 0.9978 0.9978 0.5136插值点处函数值yFact =0.5256 0.9975 0.9975 0.5256计算误差err =0.0121 -0.0002 -0.0002 0.0121N = 10时,程序运行如下:TestLag(inline('1./(1+x.^2)'), -1, 1, 10, [-0.95 -0.05 0.05 0.95]); 将区间[-1,1]分为了10段计算插值的点xi =-0.9500 -0.0500 0.0500 0.9500计算出的插值yi =0.5243 0.9975 0.9975 0.5243插值点处函数值yFact =0.5256 0.9975 0.9975 0.5256计算误差err =0.0014 0.0000 0.0000 0.0014N = 20时,程序运行如下:TestLag(inline('1./(1+x.^2)'), -1, 1, 20, [-0.95 -0.05 0.05 0.95]); 将区间[-1,1]分为了20段计算插值的点xi =-0.9500 -0.0500 0.0500 0.9500计算出的插值yi =0.5256 0.9975 0.9975 0.5256插值点处函数值yFact =0.5256 0.9975 0.9975 0.5256计算误差err =1.0e-005 *-0.7023 0.0000 0.0000 -0.7023实验2 (2)N = 5时,程序运行如下:TestLag(inline('exp(x)'), -5, 5, 5, [-4.75 -0.25 0.25 4.75]); 将区间[-5,5]分为了5段计算插值的点xi =-4.7500 -0.2500 0.2500 4.7500计算出的插值yi =-1.9321 1.4275 0.5882 123.7146插值点处函数值yFact =0.0087 0.7788 1.2840 115.5843计算误差err =1.9408 -0.6487 0.6958 -8.1303N = 10时,程序运行如下:TestLag(inline('exp(x)'), -5, 5, 10, [-4.75 -0.25 0.25 4.75]); 将区间[-5,5]分为了10段计算插值的点xi =-4.7500 -0.2500 0.2500 4.7500计算出的插值yi =0.0425 0.7796 1.2848 115.6630插值点处函数值yFact =0.0087 0.7788 1.2840 115.5843计算误差err =-0.0339 -0.0008 -0.0008 -0.0788N = 20时,程序运行如下:TestLag(inline('exp(x)'), -5, 5, 20, [-4.75 -0.25 0.25 4.75]); 将区间[-5,5]分为了20段计算插值的点xi =-4.7500 -0.2500 0.2500 4.7500计算出的插值yi =0.0087 0.7788 1.2840 115.5843插值点处函数值yFact =0.0087 0.7788 1.2840 115.5843计算误差err =1.0e-007 *-0.0914 0.0000 0.0000 -0.1434问题3 (1)N =5时,程序运行如下:TestLag2(inline('1./(1+x.^2)'), -1, 1, 5, [-0.95 -0.05 0.05 0.95]); 将区间[-1,1]分为了5段计算插值的点xi =-0.9500 -0.0500 0.0500 0.9500计算出的插值yi =0.5254 0.9978 0.9978 0.5254插值点处函数值yFact =0.5256 0.9975 0.9975 0.5256计算误差err =1.0e-003 *0.2071 -0.3011 -0.3011 0.2071N =10时,程序运行如下:TestLag2(inline('1./(1+x.^2)'), -1, 1, 10, [-0.95 -0.05 0.05 0.95]); 将区间[-1,1]分为了10段计算插值的点xi =-0.9500 -0.0500 0.0500 0.9500计算出的插值yi =0.5255 0.9972 0.9972 0.5255插值点处函数值yFact =0.5256 0.9975 0.9975 0.5256计算误差err =1.0e-003 *0.1562 0.2603 0.2603 0.1562N =20时,程序运行如下:TestLag2(inline('1./(1+x.^2)'), -1, 1, 20, [-0.95 -0.05 0.05 0.95]); 将区间[-1,1]分为了20段计算插值的点xi =-0.9500 -0.0500 0.0500 0.9500计算出的插值yi =0.5256 0.9975 0.9975 0.5256插值点处函数值yFact =0.5256 0.9975 0.9975 0.5256计算误差err =1.0e-007 *0.2318 0.2381 0.2381 0.2318问题3 (2)N =5时,程序运行如下:TestLag2(inline('exp(x)'), -1, 1, 5, [-0.95 -0.05 0.05 0.95]); 将区间[-1,1]分为了5段计算插值的点xi =-0.9500 -0.0500 0.0500 0.9500计算出的插值yi =0.3867 0.9514 1.0511 2.5857插值点处函数值yFact =0.3867 0.9512 1.0513 2.5857计算误差err =1.0e-003 *0.0079 -0.1317 0.1339 -0.0108N =10时,程序运行如下:TestLag2(inline('exp(x)'), -1, 1, 10, [-0.95 -0.05 0.05 0.95]); 将区间[-1,1]分为了10段计算插值的点xi =-0.9500 -0.0500 0.0500 0.9500计算出的插值yi =0.3867 0.9512 1.0513 2.5857插值点处函数值yFact =0.3867 0.9512 1.0513 2.5857计算误差err =1.0e-009 *-0.5045 -0.4791 -0.4835 -0.5994N =20时,程序运行如下:TestLag2(inline('exp(x)'), -1, 1, 20, [-0.95 -0.05 0.05 0.95]); 将区间[-1,1]分为了20段计算插值的点xi =-0.9500 -0.0500 0.0500 0.9500计算出的插值yi =0.3867 0.9512 1.0513 2.5857插值点处函数值yFact =0.3867 0.9512 1.0513 2.5857计算误差err =1.0e-015 *0.1665 0.3331 -0.4441 -0.8882问题4(1)程序运行如下:TestLag3([1 4 9], [5 50 115 185])计算插值的点xi =5 50 115 185计算出的插值yi =2.2667 -20.2333 -171.9000 -492.7333插值点处函数值yFact =2.2361 7.0711 10.7238 13.6015 计算误差err =-0.0306 27.3044 182.6238 506.3348 (2)程序运行如下:TestLag3([36 49 64], [5 50 115 185])计算插值的点xi =5 50 115 185计算出的插值yi =3.1158 7.0718 10.1670 10.0388 插值点处函数值yFact =2.2361 7.0711 10.7238 13.6015 计算误差err =-0.8797 -0.0007 0.5568 3.5626 (3)程序运行如下:TestLag3([100 121 144], [5 50 115 185])计算插值的点xi =5 50 115 185计算出的插值yi =4.4391 7.2850 10.7228 13.5357 插值点处函数值yFact =2.2361 7.0711 10.7238 13.6015 计算误差err =-2.2030 -0.2139 0.0010 0.0658 (4)程序运行如下:TestLag3([169 196 225], [5 50 115 185])计算插值的点xi =5 50 115 185计算出的插值yi =5.4972 7.8001 10.8005 13.6006 插值点处函数值yFact =2.2361 7.0711 10.7238 13.6015 计算误差err =-3.2611 -0.7291 -0.0767 0.0009实验所用函数function yh = LagInterp(x, y, xh)% LagInterp 计算拉格朗日插值%% Synopsis: yh = LagInterp(x, y, xh)%% Input: x = 一维向量,将要做插值x的值% y = 一维向量,将要做插值y的值% xh = 数值或一维向量,计算插值的位置,支持计算一列xh的值%% Output: yh = 数值或一维向量,通过计算插值的位置算出的插值if min(size(x)) > 1 | min(size(y)) > 1 %判断x,y是否为一维向量error('x,y must be vectors!');elseif length(x) ~= length(y) %判断x,y是否有同样多的元素error('x and y must agree!');endyh = zeros(size(xh));L = zeros(length(x) - 1);for j = 1:length(xh)for i = 1:length(x)xCal = x;xCal(i) = [];%prod(xh(j) - xCal)/prod(x(i) - xCal)为拉格朗日基函数L(i) = prod(xh(j) - xCal)/prod(x(i) - xCal);yh(j) = yh(j) + L(i) * y(i); %yh = sum(L(i) * y(i))endendfunction TestLag(fx, a, b, n, xi)% TestLag 实验题目1 1,2%% Synopsis: TestLag(fun, a, b, n, xi)%% Input: fx = 用来验证插值计算准确率的函数% a,b = 节点选取上下限% n = 多项式次数,固定区间[-a,b]分段数% xi = 要计算插值的点x = linspace(a, b, n);y = feval(fx, x);yi = LagInterp(x, y, xi);yFact = feval(fx, xi);err = yFact - yi;fprintf('将区间[%d,%d]分为了%d段\n', a, b, n);fprintf('计算插值的点xi =\n');disp(xi);fprintf('计算出的插值yi =\n');disp(yi);fprintf('插值点处函数值yFact =\n');disp(yFact);fprintf('计算误差err =\n');disp(err);function TestLag2(fx, a, b, n, xi)% TestLag2 实验题目1 3%% Synopsis: TestLag2(fun, a, b, n, xi)%% Input: fx = 用来验证插值计算准确率的函数% a,b = 节点选取上下限% n = 多项式次数,固定区间[-a,b]分段数% xi = 要计算插值的点x = zeros(1,n);for k = 1:nx(k) = cos( (2*k-1)*pi/(2*n) ); %构造非等距节点endy = feval(fx, x);yi = LagInterp(x, y, xi);yFact = feval(fx, xi);err = yFact - yi;fprintf('将区间[%d,%d]分为了%d段\n', a, b, n);fprintf('计算插值的点xi =\n');disp(xi);fprintf('计算出的插值yi =\n');disp(yi);fprintf('插值点处函数值yFact =\n');disp(yFact);fprintf('计算误差err =\n');disp(err);function TestLag3(x, xi)% TestLag3 实验题目1 4%% Synopsis: TestLag3(fun, a, b, n, xi)%% Input: x = 构造Lagrange插值的节点% xi = 要计算插值的点fx = inline('sqrt(x)');y = feval(fx, x);yi = LagInterp(x, y, xi);yFact = feval(fx, xi);err = yFact - yi;fprintf('计算插值的点xi =\n');disp(xi);fprintf('计算出的插值yi =\n');disp(yi);fprintf('插值点处函数值yFact =\n');disp(yFact);fprintf('计算误差err =\n');disp(err);思考题1.拉格朗日插值多项式的次数并不是越大越好,根据定义,插值式可以在节点处与实际函数匹配,但不能保证在节点之间很好的逼近实际函数。