差分与等距节点插值法
- 格式:ppt
- 大小:370.50 KB
- 文档页数:47
牛顿插值法插值法是利用函数f (x)在某区间中若干点的函数值,作出适当的特定函数,在这些点上取已知值,在区间的其他点上用这特定函数的值作为函数f (x)的近似值。
如果这特定函数是多项式,就称它为插值多项式。
当插值节点增减时全部插值基函数均要随之变化,这在实际计算中很不方便。
为了克服这一缺点,提出了牛顿插值。
牛顿插值通过求各阶差商,递推得到的一个公式:f(x)=f[x0]+f[x0,x1](x-x0)+f[x0,x1,x2](x-x0)(x-x1)+...f[x0,...xn](x-x0 )...(x-xn-1)+Rn(x)。
插值函数插值函数的概念及相关性质[1]定义:设连续函数y-f(x) 在区间[a,b]上有定义,已知在n+1个互异的点x0,x1,…xn上取值分别为y0,y1,…yn (设a≤ x1≤x2……≤xn≤b)。
若在函数类中存在以简单函数P(x) ,使得P(xi)=yi,则称P(x) 为f(x)的插值函数.称x1,x2,…xn 为插值节点,称[a,b]为插值区间。
定理:n次代数插值问题的解存在且唯一。
牛顿插值法C程序程序框图#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);牛顿插值法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);endend牛顿插值法摘要:值法利用函数f (x)在某区间中若干点的函数值,作出适当的特定函数,在这些点上取已知值,在区间的其他点上用这特定函数的值作为函数f (x)的近似值。
§2 等距节点插值和差分摘要:在等距节点情况下,通过使用差分可减少Newton 插值公式的计算量。
本节首先介绍等距节点下的差分公式、差分与差商之间关系,根据待估值点x 的位置不同,引入表初公式、表末公式和Bessel 公式,最后说明在使用差分计算插值时需注意的两点:(1)不宜用高阶差分公式;(2)差分公式是一个不稳定的计算公式。
等距节点:1,1,2,,i i x x h i n +-==,h 称为步长2.2.1 差分概念一阶差分:()()()1i i i f x f x f x +∆=- 二阶差分:()()()21i i i f x f x f x +∆=∆-∆ … … … …k 阶差分:()()()111k k k i i i f x f x f x --+∆=∆-∆()()()()()()()()()123110231(1)(1)ki i k i k i k i k k k i i kk jk j j k k f x f x kf x f x x kf x f x k f x j ++-+-+--+-+=⎛⎫⎛⎫∆=-+-+⎪ ⎪⎝⎭⎝⎭+-+-⎛⎫=- ⎪⎝⎭∑2.2.2 差分与差商关系定理2.2.1 在等距节点的情况下 ()()1121,,,,!k k k k f x f x x x x h k +∆=.利用归纳法证明这个公式是在Newton 公式中使用差商的基础 2.2.3 差分表()()()()()()()()()()()()()()()11221233212344321234554321x f x x f x f x x f x f x f x x f x f x f x f x x f x f x f x f x f x ∆∆∆∆∆∆∆∆∆∆2.2.4 根据待估值点x 的位置不同选择不同的计算公式 给定等距节点组:{}12,,,n x x x● 表初公式:如果x 在节点中最小的那个节点附近 节点选取:1213111,,2,,.k x x x h x x h x x kh +=+=+=+x 的表示:1x x ph =+牛顿公式:()(1)(1)(1)2111112!!10.p p p p p k k k kjj P x ph f p f f f p f j --⋅⋅-+=+=+∆+∆++∆⎛⎫=∆ ⎪⎝⎭∑例2.2.1 有函数表x 0.5 0.6 0.7 0.8 f(x) 0.4794 0.5646 0.6442 0.7174 求f(0.54).解:差分表(1)(1)(2)23!0.540.5,0.1,0.4(0.54)0.47940.0852(0.0056)(0.0008)0.5142p p p p p x ph h p P p ---==+===+⨯+-+-=● 表末公式:如果x 在最大节点附近 节点选取与编号:010200(max),,2,,.k x x x h x x h x x kh ---=-=-=-x 的表示:0x x ph =-牛顿公式:()()(1)(1)(1)200122!!0()(1)1.p p p p p k kk kk kjjj j P x ph f x p f f f p f j --⋅⋅-+----=-=-∆+∆++-∆⎛⎫=-∆ ⎪⎝⎭∑● 贝塞尔(Bessel)公式:如果x 在中间节点附近 节点选取与编号:121012,,,,,,,,k k k x x x x x x x -+-+-第一种组序:01122(1),,,,,,k k x x x x x x x ----,Newton 公式1:()1121200011212k k j jj j j j p j p j P x ph f f f j j --+--==++-⎛⎫⎛⎫+=+∆+∆ ⎪ ⎪+⎝⎭⎝⎭∑∑ 第二种组序:()10211,,,,,,k k x x x x x x ---Newton 公式2:()112120110111212k k j jj j j j p j p j P x ph f f f j j --+--+==+-+-⎛⎫⎛⎫+=+∆+∆ ⎪ ⎪+⎝⎭⎝⎭∑∑ Bessel 公式:(Newton1+Newton2)/2()12101002211111/222211.22k j j j j jk j j j p j f f p P x ph f j j f f p j j -+-=---+=+-⎛⎫+-+=+∆+ ⎪+⎝⎭∆+∆+-⎛⎫ ⎪⎝⎭∑∑Bessel 公式适合计算01,01x x x p <<<<,特别是12p =.()2244011021102132821282f f f f f f P x h ---+∆+∆∆+∆+=-++ 例 2.2.2 表2.10求()f 0.525Bessel 公式的截断误差:取2n 个节点()()22(2)22(1)11111(1),2!2222n n n nf R x n n h n x x ξξ--⎛⎫⎛⎫⎛⎫⎛⎫⎛⎫=---- ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭⎝⎭⎝⎭⎝⎭<< 2.2.5 差分公式的缺点1)高阶差分容易造成有效数字的丢失,见表2.10 原因?2)差分容易扩大传播误差3322321123230012323411012332422110232433201123364x y x y y x y y y x y y y y x y y y y y x y y y y y x y y y y y εεεεεεεεεεεεε------------------∆∆∆+∆+∆+∆+∆-∆-∆-∆-∆∆+∆-∆+∆∆-∆∆-。
第四节差分与等距节点插值公式差分与等距节点插值是数值计算中常用的一种插值方法,它使用离散的节点以及节点处的函数值,通过差分运算得到函数的近似值。
在本节中,将介绍差分和等距节点插值的基本思想和公式,并给出一些具体的例子和应用。
差分与等距节点插值的基本思想是利用函数在节点上的值来近似函数在其他点上的值,而节点之间的间隔是相等的。
具体来说,我们可以通过计算函数在节点上的导数来近似函数在其他点上的导数,进而得到函数在其他点上的近似值。
一维差分插值的基本公式是拉格朗日插值公式。
设函数f(x)在等距节点x0, x1, ..., xn上的值分别为y0, y1, ..., yn,则拉格朗日插值公式可以表示为:f(x) ≈ P(x) = ∑[(x - xi) / (xj - xi)] * yj其中,i ≠ j,∑表示对j的求和,xi表示节点的值,xj表示其他任意点的值,yj表示其他节点处函数的值。
多维差分插值的基本公式也是类似的。
设函数f(x1, x2, ..., xn)在等距节点(xi1, xi2, ..., xin)上的值分别为yij,则多维拉格朗日插值公式可以表示为:f(x1, x2, ..., xn) ≈ P(x1, x2, ..., xn) = ∑[∏(xk - xik) / (xjk - xik)] * yij其中,∏表示对k的连乘,i ≠ j,xi1, xi2, ..., xin表示节点的值,xj1, xj2, ..., xjn表示其他任意点的值,yij表示其他节点处函数的值。
差分与等距节点插值在实际应用中有广泛的用途。
例如,在数值微分中,我们可以使用差分公式来近似计算函数在特定点上的导数。
其中,常用的差分公式有中心差分公式、向前差分公式和向后差分公式。
中心差分公式通过函数在相邻两个节点上的值来近似计算函数在中间点的导数。
向前差分公式通过函数在当前节点和下一个节点上的值来近似计算函数在当前点的导数。
§2 差商、牛顿插值多项式在计算过程中,若需要再增加插值节点并求出新的插值函数,则Lagrange 插值公式所有的基函数都要重新计算,造成计算量的很大浪费。
而以下介绍的牛顿插值公式可以克服这一缺陷,可在原有插值多项式的基础上灵活的增加插值节点。
一、 差商及其性质: 1、相关定义设给出函数)(x f 在点0x ,1x ,… ,n x ,…上的函数值 ,则有:称],[10x x f 1010()()f x f x x x -=-为函数)(x f 在0x 、1x 点的一阶差商。
一阶差商的差商],,[210x x x f 121020],[],[x x x x f x x f --= 称为函数)(x f 在0x ,1x 和2x 点的二阶差商。
1-n 阶差商的差商],,,[10n x x x f 112020],,,[],,,[------=n n n n n n x x x x x f x x x f称为函数)(x f 在n x x x ,,,10 点的n 阶差商。
见插商表4-12、性质:性质1 :差商],,,[10n x x x f 可表示为函数值的线性组合,即 ∑==ni i i n x f a x x x f 010)(],,,[ ,其中:∏≠=-=nij j j ii x xa ,0)(/1。
该性质表明:差商与节点的排列次序无关,即:],,,[10n x x x f =],,,[01n x x x f =…=],,,[01x x x f n这就是差商的对称性。
性质 2101010[,,][,,][,,,]n n n n f x x f x x f x x x x x --=-01110[,,,][,,,]n n n f x x x f x x x x -=11100[,,][,,,]n n n f x x f x x x x x --=-10110[,,][,,,]n n n f x x f x x x x x --=-性质 3 设)(x f 在所含节点n x x x ,,,10 的区间],[b a 上有n 阶导数,则在该区间内至少有一点],[b a ∈ξ,使得:!/)(],,,[)(10n f x x x f n n ξ= 由该性质可知,若)(x f 为n 次多项式,则其n 阶差商为一常数。
2012-2013(1)专业课程实践论文等距节点插值公式柳希元,0818180127,R数学08-1班一、算法理论将Newton差商插值多项式中各阶差商用相应差分替代,就可得到各种形式的等距节点插值公式。
如果节点错误!未找到引用源。
要计算错误!未找到引用源。
附近点x 的函数错误!未找到引用源。
值,可令错误!未找到引用源。
于是为Newton前插公式。
其中如果要求表示函数在错误!未找到引用源。
附近的值错误!未找到引用源。
此时应用Newton插值公式,插值点应按错误!未找到引用源。
的次序排列,有做变换错误!未找到引用源。
带入公式得为Newton后插公式。
其中二、算法框图三、算法程序class Interpolation{Interpolation(int num, double x1, double x2, double func[]);double ComputeForwardValue(double x); // compute forward interpolation value ~Interpolation();private:void GetForwardTable(); // get the forward differential tableprivate:int m_num; // the number of interpolation pointsdouble m_x1, m_x2; // the first point m_x1 and last point m_x2double m_step; // the interpolation stepdouble* m_func; // the function value of interpolation pointsdouble* m_ftable; // the forward differential table};#include<iostream>#include<limits>using namespace std;#define NUM 11//上¦?面?输º?入¨?需¨¨要°a多¨¤少¦¨´个?样¨´本À?#define MIN 0//上¦?面?输º?入¨?区?间?的Ì?最Á?小?值¦Ì#define MAX 10//上¦?面?输º?入¨?区?间?的Ì?最Á?大䨮值¦Ìint main(){//下?面?输º?入¨?y的Ì?值¦Ìdouble func[NUM]=0,1,4,9,16,25,36,49,64,81,100};//上¦?面?输º?入¨?y的Ì?值¦Ìdouble x1=MIN, x2=MAX, x;int num=NUM;char flag='Y';Interpolation test(num, x1, x2, func);while(flag=='Y'){cout<<"Input x: ";cin>>x;if (!cin) // checking failure state{cin.clear(); // clear failure tagcin.ignore(numeric_limits<int>::max(), '\n'); // clear input buffercontinue;}if(x<x1 || x>x2){cout<<"---Invalid input: "<<x<<"---"<<endl;cout<<"Only the number between "<<x1<<" and "<<x2<<" is valid..."<<endl; }else{cout<<"Forward interpolation value:"<<puteForwardValue(x+0.001)<<endl;}cout<<endl<<"Do you want to process? please input(Y/N):"<<endl;cin>>flag;}return 0;}Interpolation::Interpolation(int num, double x1, double x2, double func[]) {m_num = num;m_x1 = x1;m_x2 = x2;m_step = (m_x2-m_x1)/(num-1);m_func = new double[m_num];m_ftable = new double[m_num];for (int i=0; i<m_num; ++i){m_func[i] = func[i];m_ftable[i] = func[i];}GetForwardTable();}Interpolation::~Interpolation(){delete m_func;delete m_ftable;}void Interpolation::GetForwardTable(){// get the forward differential tableint i, j;for (i=1; i<m_num; ++i)for (j=m_num-1; j>=i; --j)m_ftable[j] = m_ftable[j]-m_ftable[j-1];}double Interpolation::ComputeForwardValue(double x){// compute forward interpolation valuedouble* coef; //coefficient talbedouble result, t;int i;coef = new double[m_num];t = (x-m_x1)/m_step;for (i=1, coef[0]=1; i<m_num; ++i) //compute the coefficient tablecoef[i] = coef[i-1]*(t-i+1)/i;for (i=0, result=0; i<m_num; ++i)result += m_ftable[i]*coef[i];delete coef;return result;}四、算法实现例 1.当错误!未找到引用源。
题目:探究matlab中牛顿差分及等距节点插值公式的实现在计算数学问题时,插值是一种常见的数值分析方法,它常常用于估计在已知数据点之间的数值。
而牛顿差分及等距节点插值公式,则是其中的一种重要方法。
本文将从简单到复杂,由浅入深地探讨matlab 中牛顿差分及等距节点插值公式的实现方法,以便读者更深入地理解这一主题。
1. 牛顿插值方法牛顿插值是一种使用多项式进行插值的数值方法,利用了拉格朗日插值多项式的一般形式,其在实际应用中具有良好的稳定性和精确度。
在matlab中,我们可以通过编写函数来实现牛顿插值方法,并根据所给定的数据点计算出插值多项式。
2. 差分及等距节点插值公式差分及等距节点插值公式是牛顿插值的一种具体形式,它通过相邻节点的差分来递推计算插值多项式的系数,从而实现对给定数据点的插值。
在matlab中,我们可以编写代码来实现这一方法,通过对数据点的差分计算来得到插值多项式的系数,并最终得到插值结果。
3. matlab中的实现步骤在matlab中,实现牛顿差分及等距节点插值公式主要包括以下几个步骤:3.1 准备数据点:首先需要准备好给定的数据点,这些数据点将作为插值的依据。
3.2 计算差商:利用给定的数据点,我们可以计算出插值多项式的系数,即差商。
这一步骤可以通过递推计算来实现。
3.3 构建插值多项式:根据得到的插值多项式的系数,我们可以构建出完整的插值多项式。
3.4 计算插值结果:我们可以利用构建好的插值多项式来计算任意点的插值结果。
4. 个人观点和理解在我看来,牛顿差分及等距节点插值公式是一种非常实用和有效的插值方法,在实际工程和科学计算中都有着广泛的应用。
在matlab中,通过编写相应的代码,我们可以很方便地实现这一方法,并得到高质量的插值结果。
掌握牛顿插值及其在matlab中的实现方法对我们来说是非常重要的。
总结回顾本文从简到繁,由浅入深地探讨了matlab中牛顿差分及等距节点插值公式的实现方法。