牛顿(Newton)插值多项式
- 格式:ppt
- 大小:758.50 KB
- 文档页数:17
2012-2013(1)专业课程实践论文牛顿插值公式王霄,0818180103,R数学08-1班插值法利用函数()x f 在某区间中若干点的函数值,作出适当的特定函数,在这些点上取已知值,在区间的其他点上用这特定函数的值作为函数()x f 的近似值。
如果这特定函数是多项式,就称它为插值多项式。
利用插值基函数很容易得到拉格朗日插值多项式,公式结构紧凑,在理论分析中甚为方便,但当插值节点增减时全部插值基函数均要随之变化,整个公式也将发生变化, 这在实际计算中是很不方便的,为了克服这一缺点,提出了牛顿插值。
牛顿插值通过求各阶差商,递推得到的一个公式:[]()[]()()[]()()()x Rn x x x x x x f x x x x x x x f x x x x f x f x f n n +--++--+-+=-100102100100,, ,,,)()(牛顿(Newton )插值法:若求i T 和1+i T 之间任一点T ,插值公式为:[]()[]()()[]()()100102100100,,,,,)(---++--+-+=n n x x x x x x f x x x x x x x f x x x x f x f T 式中,[]10,x x f ,[]210,,x x x f , ,[]110,,,-n x x x f 是函数()x f 的1到第1-n 阶差商。
[]()()101010,x x x f x f x x f --=[][][]202110210,,,,x x x x f x x f x x x f --=[][][]1011021010,,,,,,,,,-----=n n n n x x x x x f x x x f x x x f可以看出,每一阶的差商都可以从它的前一阶差商推出。
按照此特点,选定牛顿插值的阶数3~4,然后计算各阶差商,按照插值公式计算插值点的值。
开始输入已知项项数n输入各已知项的值: i y i x _,_i j n i ><,[]()()kk k x x x f x f x x f --=000,输出newton令]0[,1diff newton tmp ==[]()[]()()[]()()100102100100,,,,,)(---++--+-+=n n x x x x x x f x x x x x x x f x x x x f x f T n i <结束#include<stdio.h>#define MAX 20typedef 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. 已知函数如下表:x10 11 12 13ln 2.3206 2.3979 2.4849 2.5649x求解Ln11.75的值。
牛顿插值多项式是一种通过已知数据点来拟合函数的插值方法。
它以英国数学家牛顿的名字命名,是一种常用的插值方法之一。
设给定数据点的集合为(x0, y0), (x1, y1), ... , (xn, yn),并且数据点的x坐标不相同。
牛顿插值多项式通过不断增加插值点来逐步构建插值多项式,具体来说,可以按照以下步骤进行:
将数据点按照x坐标的大小排列,从小到大依次编号为0, 1, ..., n。
定义差商f[xi, xj]为:
f[xi, xj] = (f[xi+1, xj] - f[xi, xj-1]) / (xi+j - xi)
其中,f[xi, xi] = yi,f[xi, xi+1] = (yi+1 - yi) / (xi+1 - xi)。
利用递推公式构建插值多项式:
P(x) = f[x0] + f[x0, x1] * (x-x0) + f[x0, x1, x2] * (x-x0) * (x-x1) + ... + f[x0, x1, ..., xn] * (x-x0) * (x-x1) * ... * (x-xn-1)
其中,f[xi]表示插值节点x0, x1, ..., xi所构成的多项式的最高次项系数。
牛顿插值多项式的优点在于,新增一个数据点只需要重新计算一个差商,而不需要重新计算整个多项式,因此计算效率较高。
同时,它也可以通过递归方式来计算,对于复杂的数据集,计算效率也比较高。
牛顿插值法插值法是利用函数f (x)在某区间中若干点的函数值,作出适当的特定函数,在这些点上取已知值,在区间的其他点上用这特定函数的值作为函数f (x)的近似值。
如果这特定函数是多项式,就称它为插值多项式。
当插值节点增减时全部插值基函数均要随之变化,这在实际计算中很不方便。
为了克服这一缺点,提出了牛顿插值。
牛顿插值通过求各阶差商,递推得到的一个公式:f(x)=f[x0]+f[x0,x1](x-x0)+f[x0,x1,x2](x-x0)(x-x1)+...f[x0,...x n](x-x0 )...(x-x n-1)+R n(x)。
插值函数插值函数的概念及相关性质乩定义:设连续函数y-f(x) 在区间[a,b]上有定义,已知在n+1个互异的点x0,x1,…xn上取值分别为y0,y1,…yn (设a< x1 <x2 < xn w b)。
若在函数类中存在以简单函数P(x),使得P(xi)=yi,则称P(x)为f(x)的插值函数. 称x1,x2,…xn为插值节点,称[a,b]为插值区间。
定理:n次代数插值问题的解存在且唯一。
牛顿插值法C程序1,-Mt Cll. nilI frT-r-1■■』zJr1程序框图#include<stdio.h> void mai n(){float x[11],y[11][11],xx,temp, newto n;int i,j, n;printf("Newton 插值:\n请输入要运算的值:x=");sca nf("%f", &xx);printf(" 请输入插值的次数(n<11):n=");sca nf("%d",&n);printf("请输入%d组值:\n",n+1);for(i=0;i< n+1;i++){ prin tf("x%d=",i);sca nf("%f", &x[i]);prin tf("y%d=",i);sca nf("%f", &y[0][i]);XO=OMHUOW ①匚LHdlu9a巨A-」WL-qx-mxgD-mL'M-nKL'MHmuM①(LAW7 (++rL+uvrHD 」04 (+土=+u v ~ud 」04a -=x① s a)O O H(匚L o_(x )l l o)u ①-H u((A)£6U2H H(X )£6U①一)七】siuAs(oxsx)uoweN H 4 u o l o u a性胆 qewlAIw迴B犀<eo w① u-xx-=u\J6&Ha寸& )M灭<撫旨e ^=)匕 £」d宀CL l u ①&=二A +uo g ① u H u og ① u二 L.'vxxhdlu 晋 dlu2 〉(+土=+u v ~U_)」O 4disp('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)的近似值。
拉格朗日插值公式和牛顿插值公式拉格朗日插值公式和牛顿插值公式是数值分析中常用的插值方法,用于通过已知数据点推导出未知数据点的近似值。
本文将分别介绍这两个插值方法的原理和应用,并比较它们的特点和优劣。
一、拉格朗日插值公式拉格朗日插值公式是由法国数学家拉格朗日于18世纪提出的,它通过构造一个多项式来逼近给定的数据点集合。
具体而言,拉格朗日插值多项式的形式为:P(x) = Σ(yi * Li(x))其中,P(x)表示待求的多项式,yi表示已知数据点的函数值,Li(x)称为拉格朗日基函数,它代表了每个数据点的贡献度。
拉格朗日插值公式的优点在于其简单易懂,计算过程相对简单快速。
但是,该方法的缺点是对于较大规模的数据集合,计算量会变得很大,同时当数据点之间的间距不均匀时,插值结果可能出现较大误差。
二、牛顿插值公式牛顿插值公式是由英国数学家牛顿于17世纪提出的,它采用了多项式的差商形式进行插值。
具体而言,牛顿插值多项式的形式为:P(x) = f[x0] + (x - x0)f[x0, x1] + (x - x0)(x - x1)f[x0, x1,x2] + ...其中,f[x0]表示已知数据点的函数值,f[x0, x1]表示x0和x1两个点之间的差商,以此类推。
牛顿插值公式的优点在于可以通过递推的方式计算差商,避免了重复计算,因此对于较大规模的数据集合,计算效率较高。
此外,牛顿插值公式对于不均匀间距的数据点也能够较好地逼近。
然而,牛顿插值公式的缺点在于其计算过程较为繁琐,需要额外计算差商。
三、比较与应用拉格朗日插值公式和牛顿插值公式都是常见的插值方法,它们在实际应用中各有优劣。
下面将对它们进行比较和应用分析。
1. 计算复杂度从计算复杂度的角度来看,牛顿插值公式在计算差商时需要递推计算,每次计算需要O(n)的复杂度,因此总的计算复杂度为O(n^2)。
而拉格朗日插值公式直接计算每个基函数,每次计算都需要O(n)的复杂度,因此总的计算复杂度也为O(n^2)。
牛顿插值三次插值多项式例题假设有如下数据点:(1, 1), (2, 8), (4, 64), (5, 125)首先,我们需要计算差商表。
差商表是用来计算牛顿插值多项式的系数的重要工具。
差商表的第一列是给定的数据点的y值,第二列是第一次差商,第三列是第二次差商,以此类推。
x | y |1st Dif.|2nd Dif.|3rd Dif.----------------------------------1 | 1 |2 | 8 | 74 | 64 | 28 75 | 125 | 61 18 11计算第一次差商。
第一次差商可以用以下公式计算:f[x1, x2] = (f(x2) - f(x1)) / (x2 - x1)对于第一行和第二行的数据点,我们可以计算:f[1, 2] = (8 - 1) / (2 - 1) = 7类似地,我们可以计算出其他的差商。
计算第二次差商。
第二次差商可以用以下公式计算:f[x1, x2, x3] = (f[x2, x3] - f[x1, x2]) / (x3 - x1)对于第一行到第三行的数据点,我们可以计算:f[1, 2, 4] = (28 - 7) / (4 - 1) = 7类似地,我们可以计算出其他的差商。
计算第三次差商。
第三次差商可以用以下公式计算:f[x1, x2, x3, x4] = (f[x2, x3, x4] - f[x1, x2, x3]) / (x4 - x1)对于所有数据点,我们可以计算:f[1, 2, 4, 5] = (11 - 7) / (5 - 1) = 1现在,我们可以使用差商表中的第一列和第一行的差商来构建牛顿插值多项式。
多项式的形式为:P(x) = f(x0) + f[x0,x1] * (x - x0) + f[x0,x1,x2] * (x - x0)(x - x1) + f[x0,x1,x2,x3] * (x - x0)(x - x1)(x - x2)代入给定的数据点的值,我们有:P(x) = 1 + 7(x - 1) + 7(x - 1)(x - 2) + 1(x - 1)(x - 2)(x - 4)将多项式展开并化简,得到最终的牛顿插值三次插值多项式。
牛顿插值法插值法是利用函数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)的近似值。