插值法及程序

合集下载

MAAB牛顿插值法例题与程序

MAAB牛顿插值法例题与程序

题目一:多项式插值某气象观测站在8:00(AM )开始每隔10分钟对天气作如下观测,用三次多项式插值函数(Newton )逼近如下曲线,插值节点数据如上表,并求出9点30分该地区的温度(x=10)。

二、数学原理假设有n+1个不同的节点及函数在节点上的值(x 0,y 0),……(x n ,y n ),插值多项式有如下形式:)())(()()()(n 10n 102010n x -x )(x -x x -x x P x x x x x x -⋯⋯-+⋯⋯+-++=αααα(1) 其中系数i α(i=0,1,2……n )为特定系数,可由插值样条i i n y x P =)((i=0,1,2……n )确定。

根据均差的定义,把x 看成[a,b]上的一点,可得f(x)=f (0x )+f[10x x ,](0x -x ) f[x,0x ]=f[10x x ,]+f[x,10x x ,](1x -x )……f[x,0x ,…x 1-n ]=f[x,0x ,…x n ]+f[x,0x ,…x n ](x-x n )综合以上式子,把后一式代入前一式,可得到:f(x)=f[0x ]+f[10x x ,](0x -x )+f[210x x x ,,](0x -x )(1x -x )+…+f[x,0x ,…x n ](0x -x )…(x-x 1-n )+f[x,0x ,…x n ,x ])(x 1n +ω=N n (x )+)(x n R 其中N n (x )=f[0x ]+f[10x x ,](0x -x )+f[210x x x ,,](0x -x )(1x -x )+ …+f[x,0x ,…x n ](0x -x )…(x-x 1-n )(2))(x n R =f(x)-N n (x )=f[x,0x ,…x n ,x ])(x 1n +ω(3) )(x 1n +ω=(0x -x )…(x-x n ) Newton 插值的系数i α(i=0,1,2……n )可以用差商表示。

(最新整理)matlab实现插值法和曲线拟合

(最新整理)matlab实现插值法和曲线拟合

matlab实现插值法和曲线拟合编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(matlab实现插值法和曲线拟合)的内容能够给您的工作和学习带来便利。

同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。

本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为matlab实现插值法和曲线拟合的全部内容。

插值法和曲线拟合电子科技大学摘要:理解拉格朗日多项式插值、分段线性插值、牛顿前插,曲线拟合,用matlab编程求解函数,用插值法和分段线性插值求解同一函数,比较插值余项;用牛顿前插公式计算函数,计算函数值;对于曲线拟合,用不同曲线拟合数据。

关键字:拉格朗日插值多项式;分段线性插值;牛顿前插;曲线拟合引言:在数学物理方程中,当给定数据是不同散点时,无法确定函数表达式,求解函数就需要很大的计算量,我们有多种方法对给定的表格函数进行求解,我们这里,利用插值法和曲线拟合对函数进行求解,进一步了解函数性质,两种方法各有利弊,适合我们进行不同的散点函数求解。

正文:一、插值法和分段线性插值1拉格朗日多项式原理对某个多项式函数,已知有给定的k + 1个取值点:其中对应着自变量的位置,而对应着函数在这个位置的取值。

假设任意两个不同的x j都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为:其中每个为拉格朗日基本多项式(或称插值基函数),其表达式为:[3]拉格朗日基本多项式的特点是在上取值为1,在其它的点上取值为0。

2分段线性插值原理给定区间[a,b], 将其分割成a=x 0 <x 1 <…<x n =b , 已知函数y= f (x ) 在这些插值结点的函数值为y k =f (x k )(k=0,1,…,n)求一个分段函数I h (x), 使其满足:(1) I h (x k )=y k ,(k=0,1,…,n) ;(2) 在每个区间[x k ,x k+1 ] 上,I h (x )是个一次函数.易知,I h (x)是个折线函数, 在每个区间[x k ,x k+1 ]上,(k=0,1,…,n )k 1k k1k 1k k 1k k k ,1)()()(x x x x x f x x x x x f x L --+--=++++,于是, I h (x)在[a,b]上是连续的,但其一阶导数是不连续的。

牛顿插值matlab程序

牛顿插值matlab程序

牛顿插值matlab程序牛顿插值是一种多项式插值方法,其基本思想是利用分差表来构造一个一次到n 次多项式,从而逼近给定的数据点集合。

牛顿插值法有着计算简单,精度高,兼容性好等优点。

在Matlab中,牛顿插值法的实现非常简单。

接下来将介绍如何使用Matlab编写牛顿插值程序。

首先,我们需要明确牛顿插值法的基本思想,这可以用一个公式表示:f(x)≈Nn(x)=y0+C1(x−x0)+C2(x−x0)(x−x1)+⋯+Cn(x−x0)(x−x1)⋯(x−xn−1)其中y0即为给定数据点中的第一个点的纵坐标,x0到xn-1为已知的节点,Ci 表示节点x0到xi的差商,x为我们要求解的插值点。

据此,我们可以编写如下的Matlab代码实现牛顿插值:matlabfunction [result] = newton_interpolation(x, y, z)% x, y为已知的节点,z为插值点n = length(x);diff = zeros(n, n);diff(:, 1) = y';for j = 2:nfor i = j:ndiff(i, j) = (diff(i, j-1) - diff(i-1, j-1)) / (x(i) - x(i-j+1));endendresult = diff(n, n);for k = n-1:-1:1result = diff(k, k) + (z - x(k)) * result;end我们首先定义一个函数newton_interpolation,其输入为已知节点x和纵坐标y,以及插值点z。

接着,我们使用双重循环来计算分差表,并按照公式计算插值多项式的值。

最后,我们得到了插值点z处的函数值。

需要注意的是,在计算分差表时,我们需要根据已知的节点计算出所有的差商,并记录在diff中。

在计算插值点z处的函数值时,我们需要按照公式从n-1到0依次计算出多项式的各项系数。

第5章 插值方法

第5章 插值方法

第5章插值方法5.1 插值问题概述假设f(x)是某个表达式很复杂,甚至根本写不出来的实函数,且已知f(x)在某个区间[a,b]上的n+1个互异的点x0,x1,…,x n处的函数值f(x0),f(x1),…,f(x n),我们希望找到一个简单的函数y=P(x),使得P(x k)=f(x k),k=0,1,…,n.这就是插值问题。

如果我们找到了这样的函数y=P(x),我们就可以在一定范围内利用P(x)近似表示f(x),从而解决了相应的计算问题。

1.利用函数值列表来表示插值问题对于一个插值问题来说,我们的已知条件就是n+1个互异的点处的函数值.回顾高等数学中学习过的函数的表示方法,我们可用下面表1的形式列出已知的函数值,并简称为由表1给出的插值问题。

表1:插值问题的函数值列表2.重要术语对于n+1个基点的插值问题,我们称:f(x) 为被插值函数;P(x)为插值函数;x0,x1,…,x n为插值基点或插值节点;P(x k)=f(x k),k=0,1,…,n为插值条件;[a,b]为插值区间。

注释:对于早期的插值问题来说,f(x)通常是已知的,比如对数函数,指数函数,三角函数等这些问题现在已经不用插值法来计算了;对于现在的许多实际问题来说,我们并不知道f(x)的具体形式,所对应的函数值可能是由测量仪器或其他物理设备中直接读出来的,f(x)只是一个概念中的函数。

3.多项式插值对于n+1个基点的插值问题,如果要求插值函数是次数不超过n 的多项式,记为P n(x),则相应的问题就是多项式插值,并且把P n(x)称为插值多项式。

实际上,我们所考虑的插值函数通常都是多项式函数或分段多项式函数。

由于次数不超过n的多项式的一般形式为P n((x)=a 0+a 1x+a 2x 2+…+a n x n (1)所以只要确定了n+1个系数a 0,a 1,a 2,a n ,我们便确定了一个插值多项式。

4.多项式插值的一般方法对于n+1个基点的多项式插值问题,我们完全可以用上一章中的办法来求插值多项式P n (x)的系数,a 0,a 1,a 2,a n ,它们可表为下面的线性方程组的解,所以多项式插值相对说来是很简单的。

16章 插值法

16章 插值法

第16章插值法Lagrange插值求n次Lagrange插值多项式算法1.输入n+1个插值点:(x i, y i),i=0,1,…,n2.计算插值基函数l0n(x), l1n(x) ,…, l nn(x)3.给出n次Lagrange插值多项式:L n(x)= y0 l0n(x)+ y1 l1n(x) +…+y n l nn(x)求Lagrange插值多项式程序Clear[lag,xi,x,yi];xi=Input["xi="]yi=Input["yi="]n=Length[xi]-1;p=Sum[yi[[i]]*(Product[(x-xi[[j]])/(xi[[i]]-xi[[j]]),{j,1,i-1}]*Product[(x-xi[[j]])/(xi[[i]]-xi[[j]]),{j,i+1,n+1}]),{i,1,n+1}];lag[x_]=Simplify[p]说明:本程序用于求n次Lagrange插值多项式。

程序执行后,按要求通过键盘输入插值基点xi:{x0 , x1, ... , x n }和对应函数值yi:{ y0 , y1, … , y n }后,程序即可给出对应的n次Lagrange插值多项式lag[x]。

程序中变量说明xi:存放插值基点{x0 , x1, ... , x n }yi: 存放对应函数值{y0 , y1, … , y n}lag[x]: 存放求出的n次Lagrange插值多项式Ln(x)注:语句lag[x_]=Simplify[p]用简化形式给出对应的n次Lagrange插值多项式。

例题与实验例1.给定数据表x 0 1 2 3y=f(x) 1 3 5 12用Lagrange插值法求三次插值多项式,并给出函数f(x)在x =1.4的近似值。

解:执行Lagrange插值程序后,在输入的两个窗口中按提示分别输入{0, 1, 2, 3}、{1, 3, 5, 12},每次输入后用鼠标点击窗口的“OK”按扭,得如下插值函数。

stata插值法补全数据

stata插值法补全数据

stata插值法补全数据Stata插值法补全数据是一种可以有效处理缺失或非连续数据的方法,它将有效地帮助数据分析人员更有效地补全缺失或者非连续的数据。

本文将介绍Stata插值法补全数据的基本原理和步骤,并给出案例说明。

一、什么是Stata插值法Stata插值法是一种以一定比例填充缺失或非连续数据的方法,它可以有效地补全数据,使模型分析更准确。

它是在建立、检验和修正统计模型时,将程序应用于数据中的一种数据处理方法。

二、Stata插值法的原理及其步骤Stata插值法的原理是,根据样本中已知的数据和插值系数,按照给定的比例填充缺失的数据,以补全数据。

补全的具体步骤包括:(1)确定插值系数。

根据样本数据,计算已知数据点之间的平均增量;(2)根据插值系数和已知数据点之间的平均增量,计算缺失数据点的值;(3)如果缺失的数据点经过插值法处理后的值与前后的实际值之间相差较大,则可以对该数据点重新进行插值处理,以确保处理得到的值如实反映了实际情况。

三、Stata插值法的案例说明以下是一个使用Stata插值法补全数据的实例:假设一个城市房屋租金的实际收入数据如下:月份:1 2 3 4 5 6 7 8收入:500 600 700 450 800 900 1000 800其中第四个月的收入为450,因此缺失了一个数据点。

现在就可以使用Stata插值法来补全第四个月的收入数据。

首先,确定插值系数。

由于第四个月的收入为450,因此可以计算1-3月和5-8月的平均增量,分别为100和100,因此插值系数为50。

接下来,根据插值系数和已知的收入数据,可以计算第四个月的收入:由于第三个月的收入为700,因此第四个月的收入为700(插值系数50)+100(三月与五月之间收入增量)=800。

根据插值法,第四个月的收入为800。

四、总结以上是Stata插值法补全数据的基本原理及步骤以及一个实例说明。

Stata插值法具有自动计算、准确补全和高效率等优势,可以有效地处理缺失或不连续的数据,对于数据分析人员来说是一项必不可少的技能。

用matlab编写拉格朗日插值算法的程序

用matlab编写拉格朗日插值算法的程序

用matlab编写拉格朗日插值算法的程序10[ 标签:matlab,插值算法,程序]用matlab编写拉格朗日插值算法的程序,并以下面给出的函数表为数据基础,在整个插值区间上采用拉格朗日插值法计算f(),写出程序源代码,输出计算结果xy匿名回答:1 人气:6 解决时间:2011-05-24 19:58满意答案好评率:83%做了一个测试,希望有所帮助。

代码:% 用matlab编写拉格朗日插值算法的程序,并以下面给出的函数表为数据基础,% 在整个插值区间上采用拉格朗日插值法计算f(),写出程序源代码,输出计算结果% x% yfunction main()clc;x = [ ]; y = [ ];x0 = ;f = Language(x,y,x0)function f = Language(x,y,x0)%求已知数据点的拉格朗日插值多项式%已知数据点的x坐标向量: x%已知数据点的y坐标向量: y%插值点的x坐标: x0%求得的拉格朗日插值多项式或在x0处的插值: f syms t l;if(length(x) == length(y))n = length(x);elsedisp('x和y的维数不相等!');return; %检错endh=sym(0);for (i=1:n)l=sym(y(i));for(j=1:i-1)l=l*(t-x(j))/(x(i)-x(j));end;for(j=i+1:n)l=l*(t-x(j))/(x(i)-x(j));end;h=h+l;endsimplify(h);if(nargin == 3)f = subs (h,'t',x0); %计算插值点的函数值elsef=collect(h);f = vpa(f,6); %将插值多项式的系数化成6位精度的小数end结果:f =>>如何用MATLAB编写的拉格朗日插值算法的程序、二阶龙格-库塔方法的程序和SOR迭代法的程序,要能运行的∮初夏戀雨¢回答:2 人气:29 解决时间:2009-12-08 19:04满意答案好评率:100%拉格朗日function y=lagrange(x0,y0,x) n=length(x0);m=length(x);for i=1:mz=x(i);s=;for k=1:np=;for j=1:nif j~=kp=p*(z-x0(j))/(x0(k)-x0(j)); endends=p*y0(k)+s;endy(i)=s;endSOR迭代法的Matlab程序function [x]=SOR_iterative(A,b)% 用SOR迭代求解线性方程组,矩阵A是方阵x0=zeros(1,length(b)); % 赋初值tol=10^(-2); % 给定误差界N=1000; % 给定最大迭代次数[n,n]=size(A); % 确定矩阵A的阶w=1; % 给定松弛因子k=1;% 迭代过程while k<=Nx(1)=(b(1)-A(1,2:n)*x0(2:n)')/A(1,1);for i=2:nx(i)=(1-w)*x0(i)+w*(b(i)-A(i,1:i-1)*x(1:i-1)'-A(i,i+1:n)*x0(i+1:n)')/ A(i,i);endif max(abs(x-x0))<=tolfid = fopen('', 'wt');fprintf(fid,'\n********用SOR迭代求解线性方程组的输出结果********\n\n');fprintf(fid,'迭代次数: %d次\n\n',k);fprintf(fid,'x的值\n\n');fprintf(fid, '% \n', x);break;endk=k+1;x0=x;endif k==N+1fid = fopen('', 'wt');fprintf(fid,'\n********用SOR迭代求解线性方程组的输出结果********\n\n');fprintf(fid,'迭代次数: %d次\n\n',k);fprintf(fid,'超过最大迭代次数,求解失败!');fclose(fid);endMatlab中龙格-库塔(Runge-Kutta)方法原理及实现龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法。

牛顿插值法matlab程序例题

牛顿插值法matlab程序例题

牛顿插值法是一种常用的数值分析方法,用于构造一个多项式函数,以便在给定的数据点上进行插值。

这个主题在数学和工程领域中有着广泛的应用,特别是在数据拟合和函数逼近方面。

牛顿插值法的核心思想是通过不断地添加新的数据点来构造一个多项式,并利用已知数据点来确定多项式的系数,从而实现对未知数据点的插值预测。

在Matlab中,实现牛顿插值法并不困难,我们可以利用已有的函数和工具来简化计算过程。

下面,我们将通过一个具体的例题来讲解如何使用Matlab编写牛顿插值法的程序,并分析其结果。

我们需要明确牛顿插值法的数学原理。

给定n个互不相同的节点\(x_0, x_1, ... , x_n\),以及在这些节点上的函数值\(f(x_0), f(x_1), ... , f(x_n)\),我们希望构造一个n次插值多项式p(x),满足p(x_i) = f(x_i),i=0,1,...,n。

牛顿插值多项式的一般形式为:\[p(x) = a_0 + a_1(x - x_0) + a_2(x - x_0)(x - x_1) + ... + a_n(x -x_0)(x - x_1)...(x - x_{n-1})\]其中,\[a_i\]表示插值多项式的系数。

通过牛顿插值法的迭代过程,可以逐步求解出这些系数,进而得到插值多项式的表达式。

接下来,我们将以一个具体的例题来演示如何在Matlab中实现牛顿插值法。

假设我们有如下的数据点和函数值:\(x = [1, 2, 3, 4]\)\(f(x) = [1, 4, 9, 16]\)我们希望利用这些数据点来构造一个插值多项式,并在给定的区间上进行插值计算。

在Matlab中,可以通过interp1函数来进行插值计算,该函数支持多种插值方法,包括牛顿插值法。

下面是一个简单的Matlab程序示例:```matlabx = [1, 2, 3, 4];y = [1, 4, 9, 16];xi = 2.5;yi = interp1(x, y, xi, 'spline');disp(['在x=',num2str(xi),'处的插值结果为:',num2str(yi)]);```在这段代码中,我们首先定义了给定的数据点x和对应的函数值y,然后利用interp1函数对x=2.5处的插值结果进行计算。

插值法-第二次程序题

插值法-第二次程序题

插值法题目1:对函数在区间[-1,1]作下列插值逼近,并和的图像进行比较,并对结果进行分析。

(1)用等距节点,200,1.0,-1≤≤=+=i h ih x i 绘出它的20次Newton 插值多项式的图像。

(2)用节点)20,,2,1,0(,)4212cos(⋅⋅⋅=+=i i x i π,绘出它的20次Lagrange 插值多项式的图像。

(3)用等距节点,200,1.0,-1≤≤=+=i h ih x i 绘出它的分段线性插值函数的图像。

(4)用等距节点,200,1.0,-1≤≤=+=i h ih x i 绘出它的三次自然样条插值函数的图像。

程序及分析:(1)用等距节点,200,1.0,-1≤≤=+=i h ih x i 绘出它的20次Newton 插值多项式的图像。

Matlab 程序如下:%计算均差x=[-1::1];n=length(x);syms zfor i=1:ny(i)=1/(1+25*x(i)*x(i));endN=zeros(n,n);N(:,1)=y';for j=2:nfor k=j:nN(k,j)=(N(k,j-1)-N(k-1,j-1))/(x(k)-x(k-j+1));endendfor t=1:nc(t)=N(t,t)end%构造插值多项式f=N(1,1);for k=2:na=1;for r=1:(k-1)a=a*(z-x(r));endf=f+N(k,k)*a;end%作图a=[-1::1];n=length(a);for i=1:nb(i)=1/(1+25*a(i)*a(i));endfx=subs(f,z,a);subplot(2,1,1);plot(a,b,'k',a,fx,'r');c=[::];n=length(c);for i=1:nd(i)=1/(1+25*c(i)*c(i));endfx=subs(f,z,c);subplot(2,1,2);plot(c,d,'k',c,fx,'r');结果与分析:由下图可以看出,在区间[,]上,插值多项式可以很好的逼近被插值函数。

化工计算方法-3-插值法

化工计算方法-3-插值法

l k 1 ( x k 1 ) 1 l k 1 ( x k ) 0 l k 1 ( x k 1 ) 0
l k 1 ( x k 1 ) 0 l k 1 ( x k ) 0 l k 1 ( x k 1 ) 1
( x xk 1 )( x x k 1 ) lk ( x ) ( xk xk 1 )( x k x k 1 )
xk 1 xk 由两点式可看出, L1(x) 是由两个线性函数 x x k 1 x xk 的线性组合得到的, lk ( x ) , l k 1 ( x ) x k x k 1 x k 1 x k
线性插值多项式可写为 满足
l k ( xk ) 1 l k 1 ( x k ) 0
( x xk 1 )( x xk ) l k 1 ( x ) ( xk 1 xk 1 )( xk 1 xk )
l k ( x k 1 ) 0 lk ( xk ) 1 l k ( xk 1 ) 0
10
3.2.3 n次插值
用 n+1 个 插值节点,构造一个n 次插值多项式 Pn (x) 使通过所有 n+1 个插值节点,即满足 Pn ( x j ) y j (j = 0, 1,…,n) 所以此时的插值基函数应该满足 1 i k lk ( xi ) ( i , k 0, 1, 2, , n) 0 i k 用类似的推导方法,可求得n次插值基函数为 n x xj lk ( x ) ( ) j , k 0, 1, 2, , n j 0 xk x j
• 以直线方程作为插值多项式,即下 式中的 n=1
x3= 30 x4= 40
x5= 50 x6= 60 x7= 70

计算方法-牛顿插值法

计算方法-牛顿插值法

一、实验目的、要求1、掌握牛顿插值法的思想及其解题方法;2、编程实现牛顿插值法;3、已知函数如下表:X 10 11 12 13Lnx 2.3206 2.3979 2.4849 2.5649求解Ln11.75的值?二、使用仪器、材料Windows XPMicrosoft Visual 6.0三、实验方法和步骤1、编辑程序并进行调试;2、输入已知项数及各项的(x_i,y_i);3、输入所要求解f(x)的x值;4、进行计算得到最终结果。

四、实验原理及基本技术路线图1、实验原理:通过简单函数的近似计算求解难以直接计算的解。

2、流程图:Startprintf("\n输入已知项项数n:");printf("输入各已知项的值: (x_i,y_i)\n");i<ndiff[i]=points[i].y;i<n,j>idiff[j]=(diff[j]-diff[j-1])/(points[j].x-points[j-1-i].x);tmp=1; newton=diff[0];i<ntmp=tmp*(x-points[i].x);newton=newton+tmp*diff[i+1];printf("f(%f)=%f\n",x,newton);End五、实验过程原始记录(数据、图表、计算等)#include<stdio.h>#define MAX 20//------------------------------------------------ typedef struct TPOINT{double x;double y;}POINT;//-------------------------------------------------int main(){int n,i,j;POINT points[MAX +1];double diff[MAX +1];double x,tmp,newton=0;printf("\n输入已知项项数n:");//n-1为插值次数scanf("%d",&n);printf("输入各已知项的值: (x_i,y_i)\n");for(i=0;i<n;i++)scanf("%lf%lf",&points[i].x,&points[i].y);printf("输入所要求解的x值:");scanf("%lf",&x);for(i=0;i<n;i++)diff[i]=points[i].y;for(i=0;i<n;i++){for(j=n;j>i;j--){diff[j]=(diff[j]-diff[j-1])/(points[j].x-points[j-1-i].x);}}tmp=1;newton=diff[0];for(i=0;i<n;i++){tmp=tmp*(x-points[i].x);newton=newton+tmp*diff[i+1];}printf("f(%f)=%f\n",x,newton);return 0;}//----------------------------------------------------六、实验结果、分析和结论1、用前三个点带入计算:X 10 11 12Lnx 2.3206 2.3979 2.4849解Ln11.75=2.4639;2、用后三个点带入计算:X 11 12 13Lnx 2.3979 2.4849 2.5649解Ln11.75=2.4638;3、用所有点带入计算:X 10 11 12 13Lnx 2.3206 2.3979 2.4849 2.5649解Ln11.75=2.4639。

常见的插值法及其应用

常见的插值法及其应用

见的有分段线性插值和分段三次埃尔米特插值. 但是分段
插值光滑性较差.
2. 6 三次样条插值
工程上常用三次样条插值 ,其基本思想是将插值区间
n 等分 ,在每一个子区间上采用三次 Hermite 插值方法导
出插值函数 S3 ( x) (1) 在每个小区间 [ xi- 1 , xi ] 上是不高于三次的多项
= Ii
该公式我们也称为埃特金 ( Ait ken) 逐次线性插值公式. 这
个算法的优点是适合在计算机上计算 ,且具有自动选节点
并逐步比较精度的特点 ,程序也较简单.
2. 3 Newton 插值法
由表 (1) 构造的 Newton 插值多项式为
N ( x) = f ( x0 ) + f ( x0 , x1 ) ( x - x0 ) + …+ f ( x0 , x1 ,
7 YYSZXB
© 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved.
姜 琴 ,周天宏 : 常见的插值法及其应用
例 2 已知函数 f ( x) ,如表 6 所示 :
2 常见的代数插值公式及其构造
2. 1 Lagrange 插值法
表 (1) 的 n 次 Lagrange 插值多项式 L n ( x) 的数学公
n
∑ 式 :L n ( x) =
f ( xi) li ( x)
i =0
其中 li ( x) ( i = 0 , 1 ,2 , …n) 是插值基函数 ,且 li ( x) =
3 例题
例 1 已知数据 ,如表 3 所示 :
表 3 插值表

三种插值法原理及其代码

三种插值法原理及其代码

最临近插值法原理:这种算法就是根据原图像和目标图像的尺寸,计算缩放的比例,然后根据缩放比例计算目标像素所依据的原像素,过程中自然会产生小数,这时就采用四舍五入,取与这个点最相近的点。

图解如下:如果(i+u, j+v)落在A区,即u<0.5, v<0.5,则将左上角象素的灰度值赋给待求象素,同理,落在B区则赋予右上角的象素灰度值,落在C区则赋予左下角象素的灰度值,落在D区则赋予右下角象素的灰度值。

具体Matlab源代码实现:clear all;A=imread('12.png'); %读取图像信息imshow(A); %显示原图title('原图128*128');Row = size(A,1); Col = size(A,2); %图像行数和列数nn=8; %放大倍数m = round(nn*Row); %求出变换后的坐标的最大值n = round(nn*Col);B = zeros(m,n,3); %定义变换后的图像for i = 1 : mfor j = 1 : nx = round(i/nn); y = round(j/nn); %最小临近法对图像进行插值if x==0 x = 1; endif y==0 y = 1; endif x>Row x = Row; endif y>Col y = Col;endB(i,j,:) = A(x,y,:);endendB = uint8(B); %将矩阵转换成8位无符号整数figure;imshow(B); %显示输出图片title('最邻近插值法放大8倍1024*1024');运行程序后,原图如图1所示:图1用最邻近插值法放大8倍后的图如图2所示:图2双线性内插值法:计算过程简单了解,如图,已知Q12,Q22,Q11,Q21,但是要插值的点为P 点,这就要用双线性插值了,首先在x轴方向上,对R1和R2两个点进行插值,这个很简单,然后根据R1和R2对P点进行插值,这就是所谓的双线性插值。

插值法

插值法

插值法一.实验目的•熟悉Matlab 编程; • 学习插值方法及程序设计算法二.实验内容1. 已知函数在下列各点的值为试用4次Newton 插值多项式4()P x 及分段线性插值函数()h I x 对数据进行插值.用图给出{}(,),0.20.08,0,1,,10i i i x y x i i =+=,4()P x 及()h I x .2. 在区间[1,1]-上分别取10n =、20用两组等距节点对龙格函数21()125f x x =+作多项式插值及分段线性插值,对每个n 值,分别画出插值函数及()f x 的图像.3. 下列数据点的插值可以得到平方根函数的近似,在区间[0,64]上作图.(1)用这9个点作8次Lagrange 插值8()L x .(2)用分段线性插值程序求()h I x .从得到结果看在[0,64]上,哪个插值更精确;在区间[0,1]上,两种插值哪个更精确?三.实验内容1.(1)牛顿插值程序function y0=new(x,y,x0)n=length(x);m=length(y);if n~=merror('the lengths of x and y must be equal.');end%计算均差表YY=zeros(n,n);Y(:,1)=y';for k=1:n-1for i=1:n-kif abs(x(i+k)-x(i))<epserror('the DATA is error .')endY(i+k,k+1)=(Y(i+k,k)-Y(i+k-1,k))./(x(i+k)-x(i));endend%计算牛顿插值公式y0=Y(1,1);for i=2:nz=1;for k=1:i-1z=z.*(x0-x(k));endy0=y0+Y(i,i).*z;end命令窗口输入命令>> x=[0.2:0.2:1.0];>> y=[0.98 0.92 0.81 0.64 0.38];>> x0=[0.2:0.08:1.0];>> P4=new(x,y,x0);(2)分段线性插值程序function y=divline(x0,y0,x)n=length(x0);m=length(x);for j=1:mfor i=1:n-1if (x(j)>=x0(i))&(x(j)<=x0(i+1))y(j)=(x(j)-x0(i+1))./(x0(i)-x0(i+1)).*y0(i)+(x(j)-x0(i))./(x0(i+1)-x0(i)).*y0(i+1);elsecontinue;endendend命令窗口输入命令>>x=[0.2:0.2:1.0];>> y=[0.98 0.92 0.81 0.64 0.38];>> x0=[0.2:0.08:1.0];>> I=divline(x,y,x0);实验结果(含实验图像)(1)牛顿插值画图命令及图像>> plot(x0,P4)(2)分段线性插值画图命令及图像>> plot(x0,I)2.function f=zuoye2_2(n)x0=linspace(-1,1,n+1);y0=1./(1+25*x0.^2);x=linspace(-1,1,100);y=1./(1+25*x.^2);y3=interp1(x0,y0,x,'spline');for k=1:length(x)im=ones(1,n+1);for i=1:n+1for j=1:n+1if x0(i)~=x0(j)im(i)=im(i)*(x(k)-x0(j))/(x0(i)-x0(j));endendendyp(k)=im*y0';endplot(x0,y0,'*',x,y,'b',x,y3,'-.',x,yp,'--');%画图legend('原插值点','原函数','三次样条插值','多项式插值')%加图例以zuoye2_2.m 保存文件。

分段线性插值法

分段线性插值法

例2. 给出数据表如下:
Xi yi 19.1 76.3 25 77.8 30.1 79.25 36 80.8 40 82.35 15.1 83.9 50 85.1
生成插值函数及其图形,并求当x = 27.1时的函数值。
解:In[1]:= data={{19.1,76.3},{25,77.8},{30.1,79.25},{36,80.8},{ 40,82.35},{45.1,83.9},{50,85.1}};
采用分段插值是一种办法。
一、分段线性插值的概念
所谓分段线性插值就是通过插值点用折线连 接起来逼近 f ( x )
设已知节点a x0 x1 xn b 上的函数值为: y0 , y1 yn 构造插值函数 ( x) 使其满足: (1) ( xi ) yi (i 0,1,2,..., n)
g1=ListPlot[Table[A],Prolog->AbsolutePointSize[18]];
Interpolation[A,InterpolationOrder->3] g2=Plot[%[x],{x,0,0.8}] Show[g1,g2] N[%%%[0.12],20] N[%%%%[0.72],20] N[f[0.12],20] N[f[0.72],20]
i 1 ( x x ) i j f ( x ) L2 ( x ) yk j i 1 ( x k x i ) k i 1 jk
i 1
这种分段的低次插值叫分段二次插值,在几何 上就是用分段抛物线代替 y=f(x) , 故分段二次 插值又为分段抛物插值。
2. 插值函数
函数InterPolation通过在数据点之间进行多项式 插值,构造一个近似函数(分段插值函数) , 该函数通过已知的数据点,其调用格式如下:

试验二--插值法

试验二--插值法

试验二 插值法一、实验目的(1) 学会Lagrange 插值和牛顿插值等基本插值方法; (2) 讨论插值的Runge 现象,掌握分段线性插值方法;(3) 学会Matlab 提供的插值函数的使用方法,会用这些函数解决实际问题。

二、实验要求(1) 按照题目要求完成实验内容; (2) 写出相应的Matlab 程序;(3) 给出实验结果(可以用表格展示实验结果); (4) 分析和讨论实验结果并提出可能的优化实验。

(5) 写出实验报告。

三、实验步骤1、用编好的Lagrange 插值法程序计算书本P66 的例1、用牛顿插值法计算P77的例1。

2、已知函数在下列各点的值为:试用4次牛顿插值多项式4()P x 对数据进行插值,根据{(,),0.20.08,0,1,2,,10i i i x y x i i =+=},画出图形。

3、在区间[-1,1]上分别取10,20n =用两组等距节点对龙格函数21(),(11)125f x x x =-≤≤+作多项式和线性插值,对不同n 值,分别画出插值函数及()f x 的图形。

3、下列数据点的插值可以得到平方根函数的近似,在区间[0,64]上作图。

(1) 用这9个点作8次多项式插值8()L x 。

一、实验目的1、学会Lagrange 插值、牛顿插值和 分段线性插值等基本插值方法;2、讨论插值的Runge 现象,掌握分段线性插值方法3、学会Matlab 提供的插值函数的使用方法,会用这些函数解决实际问题。

二、实验原理1、拉格朗日插值多项式2、牛顿插值多项式3、分段线性插值三、实验步骤1、用MATLAB 编写独立的拉格朗日插值多项式函数2、用MATLAB 编写独立的牛顿插值多项式函数3、利用编写好的函数计算本章书本P66 的例1、用牛顿插值法计算P77的例1。

4、利用编写好的函数计算实验步骤中要求的各道题。

(注意:这里需将要做得的题目抄下来,仅以上机实习题2为例:)2、在区间[-1,1]上分别取10,20n =用两组等距节点对龙格函数21(),(11)125f x x x=-≤≤+作多项式和线性插值,对不同n 值,分别画出插值函数及()f x 的图形。

Newton插值法的程序设计与应用

Newton插值法的程序设计与应用

第一章 插值方法求得近似函数的方法通常有两种:一种是插值法,另一种是曲线拟合法.本章主要讨论插值法用多项式来逼近列表函数问题,即具有唯一插值函数的多项式插值,对其中的多项式插值主要讨论n 次多项式插值的方法,即给定n+1各点处的函数值后,怎样构造一个n 次插值多项式的方法.§1.1插值问题的由来在许多实际问题及科学研究中,因素之间往往存在函数关系.然而这种关系经常很难有明显的解析表达式,通常只是由观察与测试得到一些离散数值.有时由于表达式过于复杂,不仅使用不便,而且不易于进行计算与理论分析.解决此类问题的方法有两种:一种是插值法,另一种是拟合法.插值法是一种古老的数学方法,他来自生产实践,早在一千多年前,我国科学家在研究历法上就应用了线性插值与二次插值,但它的基本理论却是在微积分产生之后才逐渐完善的,其应用也逐步增多.特别是在计算机软件中,许三多库函数.等的计算实际上归结于它的逼近函数的计算.在工程的实际问题中,由于航空、造船、精密机械加工等实际问题的需要,插值方法在实践上和理论上显得更为重要,并得到了进一步的发展和广泛的应用.因此我们希望能够得到一个“简单函数”逼近被计算函数的函数值.于是就得到了一种方法.叫做插值逼近或者插值法.§1.2 几个基本概念§1.2.1 插值函数的概念及相关性质定义 1.1 设连续函数)(x f y -在区间],[b a 上有定义,已知在1+n 个互异的点n x x x ,,,10 上取值分别为n y y y ,,10(设b x x x a n ≤<<<≤ 10).若在函数类中存在以简单函数)(x p ,使得i i y x p =)((n i ,1,0=),则称)(x p 为)(x f 的插值函数. 称n x x x ,,,10 为插值节点,称],[b a 为插值区间. 定义1.2 设如下表i x0x 1xn x iyy1yny求一个)(x p ,使其满足: ○1)()(x IP x p n ∈○2i i i y x f x P ==)()(, n i ,,1,0 =则称)(x p 为)(x f 的n 次代数插值多项式,该问题称为n 次代数插值问题.定理1.1 n 次代数插值问题的解存在且唯一 .§1.2.2 Lagrange 插值函数的概念及相关性质定义1.3 若n 次多项式)(x l k (n k ,1,0=)在1+n 个互异节点n x x x ,,,10 上满足),,1,0,(,0,1)(n j k kj kj x l kj j k =⎩⎨⎧≠===δ则称)(x l k (n k ,,1,0 =)为节点n x x x ,,,10 上的n 次插值基函数. n 次差值多项式)(x L n 为)()(0x l y x L k nk k n ∑==称之为拉格朗日多项式.定理1.2 设],[1b a C f n +∈,则余项为:)()!1()()(11x w n f x R n n n +++=ξ其中)())(()(101n n x x x x x x x w ---=+ .§1.2.3 差商的概念及相关性质定义1.4 称函数)(x f 于点j i x x ,(j i x x ≠)上的平均变化率为)(x f 在j i x x ,处的一阶差商,记作],[j i x x f ,即ij i j j i x x x f x f x x f --=)()(],[,j i x x ≠.一阶差商的差商为)(x f 在点k j i x x x ,,处的二阶差商.记作],,[k j i x x x f ,即ik j i k j k j i x x x x f x x f x x x f --=],[],[],,[一般地,在求出)(x f 的1-m 阶差商后就可以构造)(x f 的m 阶差商.称10110],,[],[],,,[i im im i im i im i i x x x x f x x f x x x f --=-为)(x f 在im i i x x x ,,10处的m 阶差商.特别地,规定零阶差商)(][i i x f x f =.性质1.1 任意调换插值节点的次序其值不变 即],,[],,[],,[120201210x x x f x x x f x x x f ==性质1.2 差商是一个数,可表示为某个函数的线性组合.性质1.3 当)(x f 的m 阶导数)()(x f m 在包含节点im i i x x x ,,10的某个区间上存在时,在 im i i x x x ,,10之间至少存在一点ξ使!)(],,,[)(10m f x x x f m im i i ξ=注1.1 由性质2可以推出,n 次多项式的一阶差商是1-n 多项式.表1-1差商表k x )(kx f 一阶差商 二阶差商三阶差商四阶差商x)(kx f1x )(kx f ],[10x x f2x)(kxf],[21x x f ],,[21x x x f3x )(k x f ],[32x x f ],,[321x x x f ],,,[321x x x x f4x)(kx f],[43x x f],,[432x x x f],,[321x x x f],,,,[4321x x x x x f§1.2.3 Newton 插值函数与差分的概念及相关性质 定义1.5 我们定义牛顿插值公式为)())(](,,,[))(](,,[)](,[)()(1111211----++--+-+=n nnx x x x x x x x x f x x x x x x x f x x x x f x f x N (1.1)定义1.6 设函数)(x f y =在等距节点kh x x k +=0),,1,0(n k =上的函数值)(k k x f y = ),,1,0(n k =,其中h 为常数,称为步长.称函数在每个小区间上的增量k k y y -+1为函数)(x f 在k x 处以h 为步长的一阶向前差分,记作k y ∆,即k y ∆k k y y -=+1称一阶差分的差分1+∆k y -k y ∆为二阶差分,记作k y 2∆,即k k k k k k y y y y y y +-=∆-∆=∆+++12122由此可得1-m 阶差分的差分k m k m k m y y y 111-+-∆-∆=∆为)(x f 在k x 点处的m 阶差分.称1--k k y y 为函数)(x f 在k x 处以h 为步长的一阶向后差分,记作k y ∇.即1--=∇k k k y y y称111---∇-∇k m k m y y 为函数)(x f 在k x 处以h 为步长的m 阶向后差分,记作k m y ∇. 即111---∇-∇=∇k m k m k m y y y表1-2 向前差分表ix i y i y ∆y 2∆y 3∆y 3∆x1y1x 1y 0y ∆2x2y1y ∆02y ∆3x 3y 2y ∆ 12y ∆03y ∆4x4y2y ∆22y ∆13y ∆3y ∆表1-3向后差分表ix i y i y ∇y 2∇y 3∇y 3∇x1y1x 1y 0y ∇2x2y1y ∇02y ∇3x 3y 2y ∇ 12y ∇ 03y ∇4x4y2y ∇22y ∇13y ∇3y ∇性质1.4 各阶差分可以表示成函数值的线性组合.即(1)k n j knnk k j ny C y -+=∑-=∆0)1( (2)k j knn k k j ny C y -=∑-=∇0)1( 性质1.5 差商与差分有如下关系n n nn n h n f h n f x x x f !!],,,[0010∇=∆=定义1.7 设1+n 个等距插值节点的顺序为n n x x x x ,,,110- ,则由差商表示的牛顿插值公式为)()](,,,[))(](,,[)](,[][)(111211---++--+-+=n nnx x x x x x x f x x x x x x x f x x x x f x f x N又设插值节点th x x +=0 )0(n t <<由性质1.5差商与差分关系kk k h k f x x x f !],,,[010∆=可得∑=∆+--=∆+--++∆-+∆+=nk knn f k k t t t f n n t t t f t t f t f x N 00200!)1()1(!)1()1(!2)1()( (1.2) 称为牛顿前插公式.其余项公式为,)()1()!1()()()(110++--+=+=n n n n h n t t t n f th x R x R ξ],[0n x x ∈ξ定义1.8 设1+n 个等距插值节点的顺序为011,,,x x x x n n -,则由差商表示的牛顿插值公式为)()](,,,[))()(](,,[)](,[][)(10121211x x x x x x x f x x x x x x x x x f x x x x f x f x N n n n n n n n n n n n n n n --++---+-+=------又设插值节点th x x n -= )0(n t <<由性质1.5差商与差分关系knk k n n n hk f x x x f !],,,[1∇=-- 可得∑=∆+---=∆+---+-∇-+∇-=nk nkk nnn n n n n f k k t t t f n n t t t f t t f t f x N 02!)1()1()1(!)1()1()1(!2)1()( (1.3) 称为牛顿后插公式.其余项公式为,)1)(()1()!1()()()(111+++---+=-=n n n n n n h n t t t n f th x R x R ξ],[0n x x ∈ξ第二章 Newton 插值法的程序设计与应用利用插值基函数很容易得到Lagrange 插值多项式,公式结构紧凑,在理论分析中也很方便,但当插值节点增减时全部插值基函数)(x l i n i ,,1,0 =都要随之变化,整个公式也将发生变化,这在实际计算中是很不方便的,于是我们导出插值多项式的又一种表示形式——Newton 插值公式.远远减少了工作量.但由于通过相同结点的差值多项式是惟一的,因此,拉格朗日差值公式与牛顿公式本质上是一个多项式,只不过形式不同而已.为了更方便的应用Newton 插法,本章主要讨论Newton 插值法的程序设计,并对其应用进行讨论.§2.1 Newton 插值法的算法与程序设计本节主要讨论n 次多项式插值的方法,即给定n+1各点处的函数值后,怎样构造一个n 次插值多项式的方法.为了更方便的计算并与计算机结合,我们便作出了相应的程序.并利用Matlab 进行绘图.§2.1.1 Newton 插值法的应用步骤步骤 首先我们按照表1-1,求得各点的差商.然后利用Newton 前差或后差公式即(公式1.3)把数值带入.即可以求得n 次多项式. 它在计算机上的应用步骤如下:步骤1 输入所要求的牛顿多项式的次数n ,并依次输入1+n 个节点),(i i y x .for : i=0 to n+1 {scanf("%f",&x[i]) scanf("%f",&y[0][i]); }步骤2 计算各阶差商 for : i=1 to n+1 {for : j=i to n+1 if(i>1)y[i][j]=(y[i-1][j]-y[i-1][j-1])/(x[j]-x[j-i]); elsey[i][j]=(y[i-1][j]-y[i-1][j-1])/(x[j]-x[j-1]);}步骤3 代入牛顿插值公式,可计算得出结果. for :i=1 to n+1 {temp=temp*(xx-x[i-1]);newton=newton+y[i][i]*temp;}由于篇幅所限,流程图、C 语言程序和Matlab 程序详见附录(附录A 、B 、C ).§2.1.2 利用Newton 插值法程序的实例为了更方便的应用牛顿插值法,我们进行了与计算机的结合,下面我们将展示几个例子.例2.1 已知x y sin =的一组数据为x6π4π3π2πsinx21 22 23 1(1)构造牛顿插值函数并作图分析. (2)并分别利用程序估计12sinπ,1514sinπ的估计值.分析 首先我们可以通过程序求出差商表:带入定义1.5中可求得如下牛顿插值多项式如下)6(2086076.095492926.0)(2π--=x x x x N (2.1)kx)(kx f一阶差商 二阶差商三阶差商四阶差商6π 21 954929268.04π 22 791089631.0086076.2-3π 23607024424.0 35153865.0- 13648909.0-2π125587263.044710035.0-09125470.0-028797106.0)4)(6(13648909.0)6(2086076.095492926.0)(3πππ-----=x x x x x x x N (2.2))3)(4)(6(028797106.0)4)(6(13648909.0)6(2086076.095492926.0)(4ππππππ---+-----=x x x x x x x x x x x N (2.3)第二步 我们分别利用C++程序和Matlab 分别计算12sinπ和1514sinπ的值.步骤如下:○1利用C++程序:首先我们输入所要求的牛顿多项式的次数n ,然后输入n+1个节点的值.即可以得出12sinπ和1514sin π的值为0.2586和0.0804; ○2利用Matlab 程序:首先我们在Matlab 中新建一个文件,文件内容即为附录C 中Matlab 程序代码,然后输入以下步骤:x=[0,pi/6,pi/4,pi/3,pi/2];y=[0,0.5,sqrt(2)./2,sqrt(3)./2,1]; x0=pi/12;Newton(x,y,x0] ans =0.2586x=[0,pi/6,pi/4,pi/3,pi/2];y=[0,0.5,sqrt(2)./2,sqrt(3)./2,1]; x0=14.*pi/15; Newton(x,y,x0) ans =0.0804即结果为0.2586和0.0804利用Matlab 分别对求得的牛顿差值多项式作图(代码详见附录D)图形如下.图2-1例2.2 设)1ln()(x x f +=的函数表如下:x0.25 0.30 0.36 0.39 0.45 )(x f0.2231440.2623640.3074850.3293040.371564试计算)275.1ln(,3.2ln )(=x f分析:同上题步骤我们先求差商表,进而代入公式可得)39.0)(36.0)(30.0)(25.0(057720032.0)36.0)(30.0)(25.0(1411736357.0)30.0)(25.0(294393939.0)25.0(7844.022314.0)(4----+---+----+=x x x x x x x x x x x N ( 2.4))36.0)(30.0)(25.0(1411736357.0)30.0)(25.0(294393939.0)25.0(7844.022314.0)(3---+----+=x x x x x x x N (2.5))30.0)(25.0(294393939.0)25.0(7844.022314.0)(2----+=x x x x N (2.6)利用C++程序我们可以得到计算结果 :242946.0)275.0(4=N ,242945.0)275.0(3=N ,242938.0)275.0(2=N 928823.0)3.1(4=N ,877002.0)3.1(3=N ,737653.0)275.0(2=N 我们利用Matlab 进行绘图.图2-2从上述两个例子我们可以看出,多项式(2.1)在区间]4,0[π周围与原函数逼近的较好.离这个区间越远与原函数的误差越大在5.1=x 处时,该图像就已经开始背离图像了.所以该多项式只能在一个小的区间里可以逼近原函数,不适合作为原函数的逼近函数.也可以看出多项式(2.2)在]3,0[π区间的周围逼近的较好,但是2=x 处时,该图像就离原图像误差较大.多项式(2.3)在区间[0,2.5]都逼近的挺好,从图中我们看出在远离这个区间的图像误差相对较大,但是在这三个多项式中是逼近最好的,同样在例2.2中也是如此.于是我们我们可以得出节点越多,函数逼近的相对较好.在节点附近逼近的越好,越远离节点误差越大,所以公式适用于计算节点附近的值于是为了减小误差,在下一节的等距节点下的插值公式根据所求的点的函数值的不同分别采取了前插和后插公式.§2.2 等距节点下的Newton 插值算法与程序设计前面我们讲述了一般节点下的牛顿插值公式,为了计算方便于是有了对等距节点下的牛顿多项式的研究,本节将对等距节点下的插值多项式进行总结讨论.§2.2.1 等距节点下的Newton 插值法的程序算法步骤步骤 我们按照表1-2或1-3,求差分.然后利用Newton 前插公式(公式1.2)或Newton 后插公式(公式1.3)并把数值带入.即可以求得n 次多项式. 它在计算机上的应用步骤如下:步骤1 输入所要求的牛顿多项式的次数n ,步长h ,并依次输入1+n 个节点),(i i y x .for : i=0 to n+1 {scanf("%f",&x[i]) scanf("%f",&y[0][i]); }步骤2 求得各界差分 for : i=1 to n+1{ for : j=i to n+1y[i][j]=(y[i-1][j+1]-y[i-1][j-1])/(x[j]-x[j]); }//求向前差分for : i=1 to n+1{ for : j=i to n+1y[i][j]=(y[i-1][j]-y[i-1][j-1])/(x[j]-x[j-i]); }//求向后差分步骤3 代入牛顿插值公式,可计算得出结果 for(i=1;i<n+1;i++) {temp=temp*((t-i+1)/i);newton=newton+y[i][i]*temp; }printf("求得的结果为:N(%.4f)=%9f\n",xx,newton); }//求得运用前插公式的值for(i=n;i<0;i--) {temp=temp*((t-i+1)/i);newton=newton+y[n-i][n-i]*temp; }printf("求得的结果为:N(%.4f)=%9f\n",xx,newton); }//求得运用后插公式的值由于篇幅所限 C 语言程序(详见附录D 、E).§2.2.2 等距节点下Newton 插值的实例例2.4 已知x tan 的值列表如下: x 1. 3 1.31 1.32 1.33 x tan 3.6021 3.7471 3.90334.0723近似计算325.1tan ,305.1tan .采用Newton 向后插公式.为此,做差分表i x i f i f ∇ i f 2∇ i f 3∇ 1.3 3.6021 0.1450 0.0112 0.0016 1.31 3.7471 0.1562 0.0128 1.32 3.9033 0.1690 1.334.0723从而,有).2)(1(!30016.0)1(!20128.01690.00723.4)(3++++++=t t t t t t x p 将5.001.033.1325.1-=-=t 代入上式,得9869.3)325.1(325.1tan 3=≈p .将5.201.033.1305.1-=-=t 带入后插多项式中可以得到0797.3)305.1(305.1tan 3=≈p现在我们利用C++程序 首先输入所求插值的次数3和步长0.01.然后输入各个节点,并输入所要求的点1.325既可以求出该点的函数值.即9869.3)325.1(=f . 0797.3)26.1()26.1(3=≈p f下面我们可得图图2-4 例2.4 设函数在各节点的取值如下x0 0.2 0.4 0.6 0.8 1.0 )(x f 1.0 0.818731 0.670320 0.548812 0.449329 0.367879 试利用插值公式求)3.0(f的值.采用Newton向前插公式,同上题我们先做差分表,然后相应带入到差分公式.中求得后插公式.利用C语言程序步骤如下:首先输入所求插值的次数5和步长0.2.然后输入各个节点,并输入所要求的点0.3既可以求出该点的函数值.即7880f.)3.0(.0由以上例子我们看到例1用了牛顿后插公式,例2用了牛顿前插公式,我们该怎样选取.这个经过验证得出,如果所要求的点较靠近节点x,则采用前插公式;如果1x,则采用牛顿后插公式.靠近n附录A :牛顿插值法的流程图N YNYY NNY开始 输入ni=0i=i+1分别输入n+1个输入各节点 j=j+1 i=1;t=1;N=00y j=ii<n j<n? i>1ij j ij x x y --=1-j 1,-i 1j -i y -y 11-j 1,-i 1j -i y -y --=j j ij x x y 输入ij y i<n+1 t=t*(x-1-i x )N=N+i i ty i=i+1输出n 的值附录B:牛顿插值法的程序#include<stdio.h>void main(){float x[11],y[11][11],xx,temp,newton;int i,j,n;printf("Newton插值:\n请输入要运算的值:x=");scanf("%f",&xx);printf("请输入插值的次数(n<11):n=");scanf("%d",&n);printf("请输入%d组值:\n",n+1);for(i=0;i<n+1;i++){ printf("x%d=",i);scanf("%f",&x[i]);printf("y%d=",i);scanf("%f",&y[0][i]);}for(i=1;i<n+1;i++)for(j=i;j<n+1;j++){ if(i>1)y[i][j]=(y[i-1][j]-y[i-1][j-1])/(x[j]-x[j-i]);elsey[i][j]=(y[i-1][j]-y[i-1][j-1])/(x[j]-x[j-1]); printf("%f\n",y[i][i]);}temp=1;newton=y[0][0];for(i=1;i<n+1;i++){ temp=temp*(xx-x[i-1]);newton=newton+y[i][i]*temp;}printf("求得的结果为:N(%.4f)=%9f\n",xx,newton);}附录C:牛顿插值法的Matlab程序function f = Newton(x,y,x0)syms t;if(length(x) == length(y))n = length(x);c(1:n) = 0.0;elsedisp('x和y的维数不相等!');return;endf = y(1);y1 = 0;l = 1;for(i=1:n-1)for(j=i+1:n)y1(j) = (y(j)-y(i))/(x(j)-x(i));endc(i) = y1(i+1);l = l*(t-x(i));f = f + c(i)*l;simplify(f);y = y1;if(i==n-1)if(nargin == 3)f = subs(f,'t',x0);elsef = collect(f); %将插值多项式展开 f = vpa(f, 6);endendend附录D:等距节点下的前插公式的C语言程序#include<stdio.h>void main(){float x[11],y[11][11],xx,temp,newton,t,h;int i,j,n;printf("Newton插值:\n请输入要运算的值:x=");scanf("%f",&xx);printf("请输入插值的次数(n<11):n=");scanf("%d",&n);printf("步长:\n请输入要运算的值:h=");scanf("%f",&h);printf("请输入%d组值:\n",n+1);for(i=0;i<n+1;i++){printf("x%d=",i);scanf("%f",&x[i]);printf("y%d=",i);scanf("%f",&y[0][i]);}t=(xx-x[0])/h;for(i=1;i<n+1;i++)for(j=i;j<n+1;j++){y[i][j]=(y[i-1][j+1]-y[i-1][j]);printf("%f\n",y[i][i]);}temp=1;newton=y[0][0];for(i=1;i<n+1;i++){temp=temp*((t-i+1)/i);newton=newton+y[i][i]*temp;}printf("求得的结果为:N(%.4f)=%9f\n",xx,newton);}附录E:等距节点下的后插公式的C语言程序#include<stdio.h>void main(){float x[11],y[11][11],xx,temp,newton,t,h;int i,j,n;printf("Newton插值:\n请输入要运算的值:x=");scanf("%f",&xx);printf("请输入插值的次数(n<11):n=");scanf("%d",&n);printf("步长:\n请输入要运算的值:h=");scanf("%f",&h);printf("请输入%d组值:\n",n+1);for(i=0;i<n+1;i++){printf("x%d=",i);scanf("%f",&x[i]);printf("y%d=",i);scanf("%f",&y[0][i]);}t=(xx-x[n-1])/h;for(i=1;i<n+1;i++)for(j=i;j<n+1;j++){y[i][j]=(y[i-1][j]-y[i-1][j-1]);printf("%f\n",y[i][i]);}temp=1;newton=y[n-1][n-1];for(i=n;i<0;i--){temp=temp*((t-i+1)/i);newton=newton+y[n-i][n-i]*temp;}printf("求得的结果为:N(%.4f)=%9f\n",xx,newton);}。

二次插值法

二次插值法

一维无约束优化算法——二次插值法二次插值法亦是用于一元函数在确定的初始区间内搜索极小点的一种方法。

它属于曲线拟合方法的范畴。

一、基本原理在求解一元函数的极小点时,常常利用一个低次插值多项式来逼近原目标函数,然后求该多项式的极小点(低次多项式的极小点比较容易计算),并以此作为目标函数的近似极小点。

如果其近似的程度尚未达到所要求的精度时,可以反复使用此法,逐次拟合,直到满足给定的精度时为止。

常用的插值多项式为二次或三次多项式,分别称为二次插值法和三次插值法。

这里我们主要介绍二次插值法的计算公式。

假定目标函数在初始搜索区间中有三点、和,其函数值分别为、和(图1},且满足,,即满足函数值为两头大中间小的性质。

利用这三点及相应的函数值作一条二次曲线,其函数为一个二次多项式,式中、、为待定系数。

图1根据插值条件,插值函数与原函数在插值结点、、处函数值相等,得(2)为求插值多项式的极小点,可令其一阶导数为零,即(3)解式(3)即求得插值函数的极小点(4)式(4)中要确定的系数可在方程组(2)中利用相邻两个方程消去而得:(5)(6)将式(5)、(6)代入式(4)便得插值函数极小值点的计算公式:(7)把取作区间内的另一个计算点,比较与两点函数值的大小,在保持两头大中间小的前提下缩短搜索区间,从而构成新的三点搜索区间,再继续按上述方法进行三点二次插值运算,直到满足规定的精度要求为止,把得到的最后的作为的近似极小值点。

上述求极值点的方法称为三点二次插值法。

为便于计算,可将式(7)改写为(8)式中:(9)(10)二.程序框图三.例题及其程序代码1.用二次差值法求f(α)=sinα在4≤α≤5上的极小值2.程序(1) function y=f(x)y=sin(x); …………………….%定义f文件(2)c1=(y3-y1)/(x3-x1);c2=((y2-y1)/(x2-x1)-c1)/(x2-x3);ap=0.5*(x1+x3-c1/c2);yp=f(ap);……………………%定义f1文件(3)x1=4;x2=4.5;x3=5;e=0.001;y1=f(x1);y2=f(x2);y3=f(x3); ………………%确定初始差值节点h=0.1;c1=(y3-y1)/(x3-x1);c2=((y2-y1)/(x2-x1)-c1)/(x2-x3);ap=0.5*(x1+x3-c1/c2);yp=f(ap);…% 计算二次插值函数极小点while (abs((y2-yp)/y2)<e)....%判断迭代终止if ((ap-x2)*h>0) 条件if(y2>=yp)x1=x2;y1=y2;x2=ap;y2=yp;f1;elsex3=ap;y3=yp;f1;endelseif (y2>=yp)x3=x2;y3=y2;x2=ap;y2=yp;f1;elsex1=ap;y1=yp;f1;…………………..%缩短搜索区间endendif (y2<yp)xo=x2;yo=y2;elsexo=ap;yo=yp;endxoyo二次插值法四结果分析经过MATLAB运算,结果如上,与解析法运算结果相同,说明二次差值的效果很好。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
plot(x,y,'+k',x,z1,'-g',x,z2,'-r');
xlabel('X')
ylabel('Y')
title('lagrange插值')
%输出结果
b1 = 0.1196
b2 = 0.1198
2、利用牛顿插值法计算过程如下:
构造差分表如下:
0.1
0.2
0.3
0.4
0.09983
0.19867
plot(x0,y0,'*k',x,y,'-r')
xlabel('X')
ylabel('Y')
title('三次样条插值')
%输出结果
b = 0.1198
dn=6/H(n-1)*(Dn-(Y(n)-Y(n-1))/H(n-1));
d=zeros(1,n-2);
forj=2:n-1
d(j-1)=6*cs(X(j-1:j+1),Y(j-1:j+1));
end
d1=[d0,d,dn];
M=inv(A)*d1';
y=zeros(1,m);
fori=1:m
if(x(i)~=X(n))
数值计算方法
第2章大作业
题目: 插值逼近
********************************
学号: ************
专业:运筹学与控制论
插值逼近
一、插值问题
设 是区间 上的一个实函数, 是 上 个互异实数,已知 在 的值 , 求一个次数不超过 的多项式 使其满足 这就是多项式插值问题。
n=length(x0);m=length(x);
fori=1:m
z=x(i);
s=0.0;
fork=1:n
p=1.0;
forj=1:n
ifj~=k
p=p*(z-x0(j))/(x0(k)-x0(j));
end
end
s=p*y0(k)+s;
end
y(i)=s;
end
%在命令行窗口输入
x=0.1:0.1:0.6;
end
End
%在命令行窗口输入
x=0.1:0.1:0.6;
y=sin(x);
x1=[0.1 0.2];
y1=sin(x1);
z1=newton(x1,y1,x);
x2=[0.1 0.2 0.3];
y2=sin(x2);
z2=newton(x2,y2,x);
a=0.12;
b1=newton(x1,y1,a)
forj=1:n-1
if(x(i)>=X(j)&&x(i)<X(j+1)) y(i)=((X(j+1)-x(i))^3*M(j)+(-X(j)+x(i))^3*M(j+1))/6/H(j)+((X(j+1)-x(i))*Y(j)+(x(i)-X(j))*Y(j+1))/H(j)-H(j)/6*((X(j+1)-x(i))*M(j)+(-X(j)+x(i))*M(j+1));
end
end
else
y(i)=Y(n);
end
end
End
%在命令行窗口输入
x0=0.1:0.1:0.4;
y0=[0.099830.198670.295520.38942];
x=0.1:0.001:0.4;
[y,M]=scyt(x0,y0,1.00000,0.99998,x);
a=0.12;
b=scyt(x,y,1.00000,0.99998,a)
在每个小区间 上是一个次数不超过 的多项式, 因此需确定四个待定常数, 一共有 个小区间,故应确定 个系数, 在 个内节点上具有二阶连续导数,应满足条件
即有 个连续条件,再加上 满足的插值条件 个,共计 个,因此还需要 个条件才能确定 ,通常可在区间 的端点 上各加一个条件(称为边界条件)。可根据实际问题的要求给定,常见有以下三种:
0.19867
0.29Байду номын сангаас52
0.38942
1.00000
0.99998
%建立M文件
function[y,M]=scyt(X,Y,D0,Dn,x)
n=length(X);
m=length(x);
S=-diag(ones(n,1))+diag(ones(n-1,1),-1);
h=X*S;
H=h(1:n-1);
又称一阶差分的差分 为二阶差分。
一般的,定义函数 在点 处的 阶差分为 。
在等距节点 情况下,可以利用差分表示牛顿插值多项式的系数。
四、三次样条插值
定义:给定区间 的一个划分 ,如果函数 满足:
(1) ;
(2)在每个小区间 上是次数不超过 的多项式;
(3)在每个内节点 上具有二阶连续导数,则称 为关于上述划分的一个三次多项式样条函数,简称三次样条。
0.38942
0.47943
0.56464
计算 的值。
1、利用拉格朗日插值法计算过程如下:
(1)利用线性插值法求近似值
因为0.12位于0.1与0.2之间,故取节点
(2)利用抛物插值所求的近似值为
因为0.12位于0.1,0.2与0.3之间,故取节点
%建立M文件
functiony=lagrange(x0,y0,x)
%建立M文件
functiony=newton(x0,y0,x)
n=length(x0);
m=length(x);
y1=zeros(m);
forj=1:m
fori=n:(-1):2
y1(j)=(x(j)-x0(i-1))*(cs(x0(1:i),y0(1:i))+y1(j));
end
y(j)=y1(j)+y0(1);
b2=newton(x2,y2,a)
plot(x,y,'+k',x,z1,'-g',x,z2,'-r');
xlabel('X')
ylabel('Y')
title('Newton插值')
%输出结果
b1 = 0.1196
b2 = 0.1198
3、利用三次样条插值法计算过程如下:
0.1
0.2
0.3
0.4
0.09983
0.29552
0.38942
0.09884
0.09685
0.09390
-0.00199
-0.00295
-0.00096
(1)利用线性插值所求的近似值为
(1)利用线性插值法求近似值
因为0.12位于0.1与0.2之间,故取节点
(2)利用抛物插值所求的近似值为
因为0.12位于0.1,0.2与0.3之间,故取节点
其中, 为待定系数。这种形式的插值多项式称为牛顿插值多项式,记为 ,即
因此,牛顿插值多项式 是插值多项式 的另一种表示形式。
设函数 在等距节点 处的函数值 为已知,其中 是正常数,称步长。我们称两个相邻点 和 处函数之差 为函数 在点 处以 为步长的一阶向前差分,记作 ,即
于是,函数 在各节点处的一阶差分依次为
上式表明 个点 都是 次多项式 的零点,故可设
其中, 为待定系数。由条件 立即可得

由上式可以写出 个 次插值多项式 。我们称它们为在 个节点 上的 次基本插值多项式或 次插值基函数。
三、牛顿插值法
任何一个不高于 次多项式,都可以表示成函数
的线性组合。既可以把满足插值条件 的 次插值多项式写成如下形式
L=zeros(1,n-2);
fori=1:n-2
L(i)=H(i+1)/(H(i)+H(i+1));
end
mu=ones(1,n-2)-L;
L=[1,L];
mu1=[mu,1];
A=2*diag(ones(n,1))+diag(mu1,-1)+diag(L,1);
d0=6/H(1)*((Y(2)-Y(1))/H(1)-D0);
y=sin(x);
x1=[0.1 0.2];
y1=sin(x1);
z1=lagrange(x1,y1,x);
x2=[0.1 0.2 0.3];
y2=sin(x2);
z2=lagrange(x2,y2,x);
a=0.12;
b1=lagrange(x1,y1,a)
b2=lagrange(x2,y2,a)
(1)已知两端的一阶导数值,即 。
(2)两端的二阶导数已知,即 。
(3)当 是以 为周期函数时,则要求 也是周期函数。这是边界条件应满足
五、例题展示
分别用拉格朗日插值法,牛顿插值法和三次样条插值法算法计算
例 已知函数表如下:
0.1
0.2
0.3
0.4
0.5
0.6
0.09983
0.19867
0.29552
其中 称为 的 次插值多项式, 称为被插函数, 称为插值节点, 称为插值点, 称为插值区间, 式 称为插值条件。
从几何意义来看,上述问题就是要求一条多项式曲线 , 使它通过已知的 个点 ,并用 近似表示 .
即 其中 为实数,就称 为插值多项式,相应的插值法称为多项式插值。
二、拉格朗日插值法
在求满足插值条件 次插值多项式 之前,先考虑一个简单的插值问题:对节点 中任一点 ,作一n次多项式 ,使它在该点上取值为1,而在其余点 上取值为零,即
相关文档
最新文档