牛顿插值MATLAB算法

合集下载

牛顿插值MATLAB算法

牛顿插值MATLAB算法

MATLAB程序设计期中作业——编程实现牛顿插值成员:刘川(P091712797)签名_____汤意(P091712817)签名_____王功贺(P091712799)签名_____班级:2009信息与计算科学学院:数学与计算机科学学院日期:2012年05月02日牛顿插值的算法描述及程序实现一:问题说明在我们的实际应用中,通常需要解决这样的问题,通过一些已知的点及其对应的值,去估算另外一些点的值,这些数据之间近似服从一定的规律,于是,这就引入了插值法的思想。

插值法是利用函数f (x)在某区间中若干点的函数值,作出适当的特定函数,在这些点上取已知值,在区间的其他点上用这特定函数的值作为函数f (x)的近似值。

如果这特定函数是多项式,就称它为插值多项式。

利用插值基函数很容易得到拉格朗日插值多项式,公式结构紧凑,在理论分析中甚为方便,但当插值节点增减时全部插值基函数均要随之变化,整个公式也将发生变化,这在实际计算中是很不方便的,为了克服这一缺点,提出了牛顿插值。

二:算法分析newton 插值多项式的表达式如下:010011()()()()()n n n N x c c x x c x x x x x x -=+-+⋅⋅⋅+--⋅⋅⋅-其中每一项的系数c i 的表达式如下:12011010[,,,][,,,][,,,]i i i i i f x x x f x x x c f x x x x x -⋅⋅⋅-⋅⋅⋅=⋅⋅⋅=- 即为f (x)在点01,,,i x x x ⋅⋅⋅处的i 阶差商,([]()i i f x f x =,1,2,,i n =),由差商01[,,,]i f x x x ⋅⋅⋅的性质可知: ()01001[,,,]()i i i j j k j k k j f x x x f x x x ==≠⋅⋅⋅=-∑∏ 牛顿插值的程序实现方法:第一步:计算[][][][]001012012,,,,,,,n f x f x x f x x x f x x x x 、、、、。

数值计算实验牛顿前插和后插插值

数值计算实验牛顿前插和后插插值

数值计算实验二姓名:方小开学号:20060810202 班级:计科0602一. 实验目的:1、差分的matlab实现;2、Newton插值的matlab实现;二. 实验原理:MATLAB在线性代数,矩阵分析,数值及优化,数理统计和随机信号分析,电路系统,系统动力学,信号与图像处理,控制理论分析和系统设计,过程控制,建模和仿真,通信系统,等有广泛的应用。

它具有功能强大,界面友好,语言自然即开放性等特点。

三.试验环境MATLAB7.0四. 试验过程及现象:1、牛顿插值公式:把下面的matlab程序在matlab中建立M-file文件并保存;function [d,v1]=newtonjz(x,y,v) %d 插商表 v是要插入x v1是插入的y值n=length(x);d=zeros(n,n);d(:,1)=y';for j=2:nfor i=j:nd(i,j)=(d(i,j-1)-d(i-1,j-1))/(x(i)-x(i-j+1));endendw=1;v1=d(1,1);for i=2:nw=w*(v-x(i-1));v1=v1+d(i,i)*w;end分别给x,y赋初值,并调用Newton插值函数得到结果如下:x=[0.40,0.55,0.65,0.80,0.90,1.05];y=[0.41075,0.57815,0.69675,0.88811,1.02652,1.25382];[z,xy]=newtonjz(x,y,0.596);z =0.4108 0 0 0 0 00.5782 1.1160 0 0 0 00.6967 1.1860 0.2800 0 0 00.8881 1.2757 0.3589 0.1973 0 01.0265 1.3841 0.4335 0.2130 0.0312 01.2538 1.5153 0.5249 0.2287 0.0314 0.0003xy =0.63192Newton前插公式:把Newton前插公式的matlab程序写在matlab中建立M-file文件并保存;function [d,v1]=newtonBefore(x,y,t)n=length(x);d=zeros(n,n);d(:,1)=y';for j=2:nfor i=1:n-j+1d(i,j)=(d(i+1,j-1)-d(i,j-1));endendw=1;m=1;v1=d(1,1);for i=2:nw=w*(t-i+2);m=m*(i-1);v1=v1+d(1,i)*(w/m);end分别给x,y赋初值,并调用Newton前插函数得到结果如下;x=[1 1.05 1.10 1.15 1.20 1.25 1.30];y=[1 1.0247 1.04881 1.07238 1.09544 1.11803 1.14017];>> [z,qc]=newtonBefore(x,y,0.2);qc =1.004992263808003、Newton后插公式:把Newton后插公式的matlab程序写在matlab中建立M-file文件并保存;function [d,v1]=newtonAfter(x,y,t)n=length(x);d=zeros(n,n);d(:,1)=y';for j=2:nfor i=j:nd(i,j)=(d(i,j-1)-d(i-1,j-1));endendw=1;m=1;v1=d(1,1);for i=2:nw=w*(t+i-2);m=m*(i-1);v1=v1+d(n,i)*(w/m);end分别给x,y赋初值,并调用Newton后插函数得到结果如下;x=[1 1.05 1.10 1.15 1.20 1.25 1.30];y=[1 1.0247 1.04881 1.07238 1.09544 1.11803 1.14017];>> [z,hc]=newtonAfter(x,y,-0.4);hc=1.13136982835200五.遇到的问题在调试的过程中也遇到了一些小小的问题,如输出的结果只显示4位有效数字,结果的精度太低了,不能满足要求,因此在matlab中把数据的格式从short型改成了long型,这样就大大的提高了结果的精确度,减少了误差。

牛顿-柯特斯公式matlab

牛顿-柯特斯公式matlab

牛顿-柯特斯公式matlab首先,让我们来了解一下数值积分的基本概念。

数值积分是通过求取一个函数在给定区间上的近似面积来计算函数的定积分。

一种常见的数值积分方法是使用插值多项式来近似函数,并在给定区间上对该多项式进行积分。

牛顿插值多项式是由一组不同的x值和对应的函数值构成的。

该多项式通过这些点来逼近函数,并可以用于在任意点上计算函数的近似值。

牛顿插值多项式的形式如下:P(x)=f[x₀]+f[x₀,x₁](x-x₀)+f[x₀,x₁,x₂](x-x₀)(x-x₁)+...其中,f[x₀]表示函数在x₀上的值,f[x₀,x₁]表示函数在x₀和x₁上的差商。

柯特斯系数用于计算牛顿插值多项式在给定区间上的积分。

公式如下:C₀=1C₁=h/2C₂=h²/6C₃=h³/12C₄=h⁴/20其中,h表示区间的宽度。

在MATLAB中,可以使用以下代码来实现牛顿-柯特斯公式:function result = newton_cotes(f, a, b, n)h=(b-a)/n;x=a:h:b;fx = f(x);coefficient = zeros(n+1, 1);coefficient(1) = 1;for i = 2:n+1coefficient(i) = coefficient(i-1) * (h^(i-1)) / factorial(i-1);endresult = sum(fx .* coefficient);end```在上面的代码中,`f`表示要积分的函数,`a`和`b`表示积分区间的起始点和结束点,`n`表示节点的数量。

首先,我们计算出节点的横坐标和对应的函数值。

然后,根据柯特斯系数的公式计算系数。

最后,将函数值与系数相乘,并求和,从而得到近似的积分值。

例如,我们要计算函数f(x) = sin(x)在区间[0, π/2]上的积分值,可以使用以下代码:a=0;b = pi/2;n=4;result = newton_cotes(f, a, b, n);disp(result);```运行该代码,将输出函数f(x)在区间[0,π/2]上的近似积分值。

牛顿插值法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处的插值结果进行计算。

MATLAB作业拉格朗日三阶样条插值函数牛顿插值

MATLAB作业拉格朗日三阶样条插值函数牛顿插值

Lagrange插值M函数syms xx0=[0,1,2];y0=[1,2,3];n=length(x0);for i=1:na=1;for j=1:nif j~=ia=expand(a*(x-x0(j)));endendb=1;for k=1:nif k~=ib=b*(x0(i)-x0(k));endendA(i)=expand(a/b);endL=0;for p=1:nL=L+y0(p)*A(p);endL>> LanguageL =x + 1三阶样条插值M函数function m=naspline(x,y,dy0,dyn,xx)n=length(x)-1;h=diff(x);lemda=h(2/n)./(h(1:n-1)+h(2:n));mu=1-lemda;g=3*(lemda.*diff(y(1:n))./h(1:n-1)+mu.*diff(y(2:n+1))./h(2:n)); g(1)=g(1)-lemda(1)*dy0;g(n-1)=g(n-1)-mu(n-1)*dyn;dy=nachase(lemda,2*ones(1:n-1),mu,g);m=[dy0;dy;dyn];if nargin>=5s=zeros(size(xx));for i=1:nif i==1,kk=find(xx<=x(2));elseif i==nkk=find(xx>x(n));elsekk=find(xx>x(i)&xx<=x(i+1));endxbar=(xx(kk)-x(i))/h(i);s(kk)=alpha0(xbar)*y(i)+alpha1(xbar)*y(i+1)+...h(i)*beta0(xbar)*m(i)+h(i)*beta1(xbar)*m(i+1);endm=s;endfunction x=nachase(a,b,c,d)n=length(a);for k=2:nb(k)=b(k)-a(k)/b(k-1)*c(k-1);d(k)=d(k)-a(k)/b(k-1)*d(k-1);endx(n)=d(n)/b(n);for k=n-1:-1:1x(k)=(d(k)-c(k)*x(k+1))/b(k);endx=x(:);function y=alpha0(x)y=2*x.^3-3*x.^2+1;function y=alpha1(x)y=-2*x.^3+3*x.^2;function y=beta0(x)y=x.^3-2*x.^2+x;function y=beta1(x)y=x.^3-x.^2;naspline([-1 0 1],[-1 0 1],0,-1)ans =1.7500-1.0000>> naspline([-1 0 1],[-1 0 1],0,-1,-1:0.25:1)ans =-1.0000 -0.9258 -0.7188 -0.4023 0 0.4492 0.8438 1.06641.0000ans =Columns 1 through 5-1.0000 -0.9258 -0.7188 -0.4023 0 Columns 6 through 90.4492 0.8438 1.0664 1.0000牛顿插值多项式function yi=Newton(x,y,xi)n=length(x);m=length(y);if n~=merror;return;end%计算均差表YY=zeros(n);Y(:,1)=y';for k=1:n-1for i=1:n-kif abs(x(i+k)-x(i))<epserror;return;endY(i,k+1)=(Y(i+1,k)-Y(i,k))/(x(i+k)-x(i));endend%计算牛顿插值公式yi=0;for i=1:nz=1;for k=1:i-1z=z*(xi-x(k));endyi=yi+Y(1,i)*z;endEnd>>format compact>> x=pi*[1/6 1/4 1/3];y=[0.5 0.7071 0.866];xi=2*pi/9;0.550.60.650.70.750.450.50.550.60.650.70.75>> yi=Newton(x,y,xi)yi =0.6434>>fplot(‘sin ’,[pi/6 pi/4 pi/3]);hold on;>>plot(x,y,’o ’xi,0.6434,’rv ’);hold off;牛顿迭代M 函数function x=nanewton(fname,dfname,x0,e,N) if nargin<5,N=500;endif nargin<4,e=1e-4;endx=x0;x0=x+2*e;k=0;while abs(x0-x)>e&k<N,k=k+1;x0=x;x=x0-feval(fname,x0)/feval(dfname,x0); disp(x)endif k==N,warning('已达迭代次数上限');end >> fun=inline('x^3-x-1');dfun=inline('3*x^2-1'); >> nanewton(fun,dfun,1.5,0.5e-3)1.34781.32521.3247ans =1.32470.550.60.650.70.750.450.50.550.60.650.70.75。

牛顿插值法matlab程序解析

牛顿插值法matlab程序解析

牛顿插值法在MATLAB 中的实现经过n+1个不同的插值点12n+1,,x x x …,,构造牛顿插值公式1211231212n+112n =[,]()[,,]()()[,,]()()()N f x x x x f x x x x x x x f x x x x x x x x x -+--++---(x )……… 注:牛顿插值法中,用到了插值公式%我们以二次牛顿插值公式为例解析牛顿插值法的matlab 程序function[c,d ]=newpoly (x ,y )%这里x 为3个节点的横坐标组成的向量,即()123,,x x x x =,y 为纵坐标的组成向量,即()()()()123,,y f x f x f x =%c 为所得的牛顿插值多项式的系数组成的向量n=length(x);%测量向量x 的长度,即向量x 中元素i x 的个数,赋值给n,所以n=3,注:这里的“n ”仅为变量,和公式中的次数n 不一样d=zeros (n ,n ); d=zeros(3,3)%把变量d 定义为一个n 行,n 列的零矩阵,此矩阵用来储存各阶差商,格式完全等同于书中21页的表2。

1 d (:,1)=y';%此句是把向量y 的转置,即123()()()f x y f x f x ⎛⎫ ⎪= ⎪ ⎪⎝⎭,赋值给零矩阵d 的第一列%下面运用两个for 循环来构造书中21页的差商表2。

1%第一个循环(父循环),循环变量为kfor k=2:n%用来表示零矩阵d 中的第几行%第二个循环(父循环),循环变量为kfor j=k :n%用来表示零矩阵d 中的第几列d (k ,j)=(d (k ,j-1)—d(k-1,j —1))/(x (k)-x (k —j+1));%差商公式,其中d (k,j)表示零矩阵d 中的第k 行,第j 列的元素,d (k,j —1),d (k-1,j —1)等也类似,它们代表的元素随着双循环而变化,x(k —1)表示1k x -,这种计算差商的方法是根据差商表的排列位置而得来,具体解释见下面。

matlab实现牛顿差分及等距节点插值公式

matlab实现牛顿差分及等距节点插值公式

题目:探究matlab中牛顿差分及等距节点插值公式的实现在计算数学问题时,插值是一种常见的数值分析方法,它常常用于估计在已知数据点之间的数值。

而牛顿差分及等距节点插值公式,则是其中的一种重要方法。

本文将从简单到复杂,由浅入深地探讨matlab 中牛顿差分及等距节点插值公式的实现方法,以便读者更深入地理解这一主题。

1. 牛顿插值方法牛顿插值是一种使用多项式进行插值的数值方法,利用了拉格朗日插值多项式的一般形式,其在实际应用中具有良好的稳定性和精确度。

在matlab中,我们可以通过编写函数来实现牛顿插值方法,并根据所给定的数据点计算出插值多项式。

2. 差分及等距节点插值公式差分及等距节点插值公式是牛顿插值的一种具体形式,它通过相邻节点的差分来递推计算插值多项式的系数,从而实现对给定数据点的插值。

在matlab中,我们可以编写代码来实现这一方法,通过对数据点的差分计算来得到插值多项式的系数,并最终得到插值结果。

3. matlab中的实现步骤在matlab中,实现牛顿差分及等距节点插值公式主要包括以下几个步骤:3.1 准备数据点:首先需要准备好给定的数据点,这些数据点将作为插值的依据。

3.2 计算差商:利用给定的数据点,我们可以计算出插值多项式的系数,即差商。

这一步骤可以通过递推计算来实现。

3.3 构建插值多项式:根据得到的插值多项式的系数,我们可以构建出完整的插值多项式。

3.4 计算插值结果:我们可以利用构建好的插值多项式来计算任意点的插值结果。

4. 个人观点和理解在我看来,牛顿差分及等距节点插值公式是一种非常实用和有效的插值方法,在实际工程和科学计算中都有着广泛的应用。

在matlab中,通过编写相应的代码,我们可以很方便地实现这一方法,并得到高质量的插值结果。

掌握牛顿插值及其在matlab中的实现方法对我们来说是非常重要的。

总结回顾本文从简到繁,由浅入深地探讨了matlab中牛顿差分及等距节点插值公式的实现方法。

牛顿插值法matlab程序

牛顿插值法matlab程序

《计算方法》数值实验陈述之宇文皓月创作班级090712 学号09071235 姓名金志彬实验室3-128 设备编号D12 日期2012.06.05 实验题目编写牛顿插值方法的MATLAB主程序并验算P183.111、实验目的:通过编程实现牛顿插值方法,加深对多项式插值的理解。

应用所编程序解决实际算例。

2、实验要求:(1)认真分析课题要求,复习相关理论知识,选择适当的解决方案;(2)上机实验程序,做好上机前的准备工作;(3)调试程序,记录计算结果;(4)分析和解释计算结果;(5)依照要求书写实验陈述。

3、实验内容:(1)算法原理或计算公式式(1-2)为插值余项,由插值多项式唯一性可知,它与书本式(5.1.19)是等价的,事实上,利用均差与导数关系式可由式(1-2)推出书本式(5.1.19)。

但式(1-2)更有一般性,它对f是由离散点给出的情形或f导数不存在时均适用。

(21)输入:n x(本文取x0,x1两个函数点);3(3)源程序function f=Newton(x,y,x0,x1)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;y=y1;endf=simplify(f);g=subs(f,'t',x0)g1=subs(f,'t',x1)A=zeros(n,n-1);A=[y',A];for j=2:nfor i=j:nA(i,j)=(A(i,j-1)-A(i-1,j-1))/(x(i)-x(i+1-j));endenddisp('差商表为');disp(A);(4)运行结果>> x=[0 1 2 3];>> y=[1 2 17 64];>> x0=0.5;>> x1=2.5;>> f=Newton(x,y,x0,x1)g =0.8750g1 =35.3750差商表为0 0 0 01.0000 1.0000 0 07.0000 6.0000 2.5000 03.0000 -4.0000 -5.0000 -2.5000f =1-2*t^2+3*t^34、实验小结体会:1)通过本次实验让我从实践验证了理论-------插值多项式的基本思想;2)牛顿插值法建立过程中用到了插商计算,这是有别于拉格朗日插值法的一部分,在已知点数较少的情况下用牛顿插值法较为准确;3)通过编程,加深了matlab的熟悉特别是一些函数语句,进一步体会到了函数迫近的思想。

牛顿插值MATLAB算法

牛顿插值MATLAB算法

牛顿插值MATLAB算法牛顿插值算法是一种用于数据插值的数值方法,由英国数学家艾萨克·牛顿在17世纪提出。

该算法的目标是通过已知数据点来构建一个多项式,进而估计在未知数据点之间的数值。

MATLAB是一种功能强大的数值计算和科学编程软件,能够方便地实现牛顿插值算法。

牛顿插值算法的基本思想是通过多项式的差商来逐步逼近插值函数。

算法的核心是牛顿插值多项式的递推公式,即:p(x) = f[x0] + (x - x0)f[x0, x1] + (x - x0)(x - x1)f[x0, x1, x2] + ... + (x - x0)(x - x1)...(x - xn-1)f[x0, x1, ..., xn]其中f[x0]表示已知数据点的函数值,f[x0,x1]表示差商,f[x0,x1,x2]表示二阶差商,以此类推。

递推公式可以通过递归或迭代的方法计算。

在MATLAB中,可以使用以下代码实现牛顿插值算法:```matlabfunction p = newton_interpolation(x, y, xx)n = length(x); % 数据点的个数F = zeros(n); % 差商表格F(:,1)=y;%第一列为已知函数值%计算差商表格for j = 2:nfor i = j:nF(i,j)=(F(i,j-1)-F(i-1,j-1))/(x(i)-x(i-j+1));endend%计算牛顿插值多项式p=F(1,1);for j = 2:nterm = 1;for i = 1:j-1term = term * (xx - x(i));endp = p + F(j, j) * term;endend```在使用该函数时,需要提供已知数据点的横坐标x和纵坐标y,以及待估计的插值点的横坐标xx。

函数将返回插值点的估计值p。

以下是利用该函数进行插值的示例:```matlabx=[1,2,4,7];%已知数据点的横坐标y=[0,-1,2,3];%已知数据点的纵坐标xx = 3; % 待估计的插值点的横坐标p = newton_interpolation(x, y, xx);disp(p);```运行上述代码,将会输出插值点(3,?)的估计值。

matlab 拉格朗日插值法和牛顿插值法

matlab 拉格朗日插值法和牛顿插值法

matlab 拉格朗日插值法和牛顿插值法题目:MATLAB中的拉格朗日插值法和牛顿插值法引言在实际问题中,我们常常需要通过一系列已知数据点来估计未知数据点的值。

这种问题很常见,例如用温度测量数据来预测未来某一天的温度。

为了解决这种插值问题,拉格朗日插值法和牛顿插值法是常用的方法之一。

在本文中,我们将介绍这两种插值方法并详细解释如何在MATLAB中使用它们。

一、拉格朗日插值法拉格朗日插值法是基于拉格朗日多项式的一种插值方法。

该方法使用已知数据点的值和位置来构造一个多项式,进而估计未知数据点的值。

其基本思想是通过多项式与每个数据点相等,并利用拉格朗日插值公式来得到插值多项式。

1. 拉格朗日插值公式拉格朗日插值公式可以表示为:P(x) = Σ(yi * li(x))其中P(x)是插值多项式,yi是第i个数据点的值,li(x)是拉格朗日基函数。

拉格朗日基函数li(x)定义为:li(x) = Π((x-xj)/(xi-xj)) (j ≠i)2. MATLAB实现要在MATLAB中实现拉格朗日插值法,我们可以按照以下步骤进行:(1)首先定义数据点的横坐标x和纵坐标y;(2)使用for循环遍历每个数据点,并计算插值多项式的每一项;(3)将每个数据点的插值多项式项相加,得到最终的插值多项式;(4)通过给定的x值,计算插值多项式的值。

该过程可以通过以下MATLAB代码实现:matlab定义已知数据点的横坐标和纵坐标x = [1, 2, 3, 4];y = [2, 4, 1, 6];计算插值多项式的每一项n = length(x); 数据点数量P = 0; 初始化插值多项式for i = 1:n计算每一项的拉格朗日基函数li = ones(size(x));for j = 1:nif j ~= ili = li .* (xs - x(j)) / (x(i) - x(j));endend计算每一项的插值多项式项Pi = yi * li;将每一项相加得到最终的插值多项式P = P + Pi;end给定x值,计算插值多项式的值x_val = 2.5;y_val = polyval(P, x_val);二、牛顿插值法牛顿插值法是一种使用差商的插值方法。

Newton插值的matlab实现

Newton插值的matlab实现

Newton插值的matlab实现成员:黄全P092314746 28%付吉P091712737 24%颜学俭P091712716 24%罗国庭P091712739 24%指导老师:刘华2012年5月2日目录Newton插值的matlab实现 ....................................................................................................... - 1 - 一过程整理...................................................................................................................... - 3 - Newton插值的基本原理 ............................................................................................ - 3 - 二流程图............................................................................................................................ - 4 - 三算法设计...................................................................................................................... - 6 -3.1、Newton插值的matlab实现 .............................................................................. - 6 -3.2、程序..................................................................................................................... - 6 -3.3、例题..................................................................................................................... - 6 -3.4、命令执行图...................................................................................................... - 7 - 四参考文献........................................................................................................................ - 7 -一 过程整理Newton 插值的基本原理假设有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 )确定。

newton插值法matlab

newton插值法matlab

newton插值法matlab一、引言在数值分析中,插值法可以用于在已知的一组数据中,根据数据间的数值规律推断出在某些未知数据点处的数值。

牛顿插值法是一种常用的插值方法,适用于等距节点及非等距节点问题。

二、牛顿插值法的原理假设已经有一组已知的n个节点(x0,y0)、(x1,y1)、...、(xn,yn),其中x0<x1<...<xn,牛顿插值法的思想是通过构造一个n次多项式,使得多项式在节点处与函数的值一致,从而在节点之间对函数进行插值。

具体算法如下:1. 假设插值多项式为f(x),则f(x)=b0+b1(x-x0)+...+bn(x-x0)(x-x1)...(x-x(n-1))其中,b0=y0,bi为差商。

2. 首先计算0阶差商:f[x0]=y0,1阶差商:f[x0,x1]=(y1-y0)/(x1-x0),以此类推。

3. 计算2阶差商,需要用到1阶差商,因此:f[x0,x1,x2]=(f[x0,x1]-f[x1,x2])/(x0-x2),以此类推,直到完成n-1阶差商。

4. 将差商代入插值公式,即可得到牛顿插值多项式。

三、Matlab代码实现假设已知节点(xi,yi)为(0,1)、(1,2)、(3,1)、 (4,3),要求在x=2处的插值结果。

代码如下:```% 定义节点数据x = [0 1 3 4];y = [1 2 1 3];% 计算差商表n = length(x);F = zeros(n,n);F(:,1) = y';for j=2:nfor i=j:nF(i,j) = (F(i,j-1)-F(i-1,j-1))/(x(i)-x(i-j+1));endend% 计算插值结果x0 = 2;result = F(1,1);for k=2:nresult = result + F(k,k)*prod(x0-x(1:k-1));end% 输出结果fprintf('f(%g)= %g\n',x0,result);```输出结果为f(2)= 1.28571428571428。

matlab中的牛顿插值

matlab中的牛顿插值

matlab中的牛顿插值在MATLAB中,你可以使用牛顿插值方法来生成一个多项式,用于逼近一组离散数据点。

牛顿插值多项式通常用于曲线拟合和数据插值的任务。

以下是在MATLAB中执行牛顿插值的步骤:1.准备数据:首先,准备你的离散数据点,包括x值和相应的y值。

这些数据点将用于生成插值多项式。

2.计算差商:使用牛顿插值的关键是计算差商(divided differences)。

差商用于构建插值多项式的系数。

在MATLAB中,你可以使用`divdif`函数来计算差商。

```matlabx=[x1,x2,x3,...];%x值y=[y1,y2,y3,...];%相应的y值coefficients=divdif(x,y);```3.构建插值多项式:一旦你计算出差商,你可以使用这些差商来构建牛顿插值多项式。

可以使用`poly2sym`函数将差商转化为多项式对象。

```matlabp=poly2sym(coefficients,x);```4.绘制插值曲线:你可以使用插值多项式对象`p`来绘制插值曲线,以查看如何逼近原始数据。

```matlabx_interp=linspace(min(x),max(x),100);%用于插值的新x值y_interp=subs(p,x_interp);%计算插值多项式的y值plot(x,y,'o',x_interp,y_interp);```这些步骤将帮助你在MATLAB中执行牛顿插值,以生成一个多项式,用于逼近给定的离散数据点。

这个插值多项式可以用于估算原始数据点之间的值,以获得更平滑的曲线。

matlab newton插值法

matlab newton插值法

matlab newton插值法
在MATLAB 中实现Newton 插值法,您可以使用内置的polyfit和polyval函数。

下面是一个简单的例子,它展示了如何使用Newton 插值法在MATLAB 中拟合数据。

首先,我们需要一些数据来进行插值。

假设我们有一些x 和y 的数据点:
matlab
x = [1, 2, 3, 4, 5];
y = [1, 4, 9, 16, 25];
这些数据点表示一个函数y = x^2 的取值。

然后,我们可以使用polyfit函数来找到最佳拟合的多项式。

polyfit函数返回一个数组,该数组表示多项式的系数,从最高次幂到最低次幂。

例如,对于二次多项式,它会返回一个包含三个系数的数组:a2, a1 和a0。

matlab
p = polyfit(x, y, 2); % 对于二次多项式,我们使用2作为第三个参数
现在,p包含多项式的系数。

我们可以使用polyval函数来评估多项式在给定x 值
处的y 值:
matlab
y_fit = polyval(p, x);
最后,我们可以绘制原始数据和拟合曲线:
matlab
plot(x, y, 'o', x, y_fit, '-');
legend('Data', 'Fitted curve');
以上就是如何在MATLAB 中使用Newton 插值法进行数据拟合的简单示例。

注意,对于非线性函数,您可能需要使用更高阶的多项式来获得更好的拟合效果。

matlab牛顿插值法三次样条插值法

matlab牛顿插值法三次样条插值法

(){}21()(11),5,10,20:12521()1,(0,1,2,,)()2,(0,1,2,,)()()235,20:1100(i i i i n n k k k Newton f x x n x f x x i i n f x nx y i n Newton N x S x n x k y f x =-≤≤=+=-+====-+=题目:插值多项式和三次样条插值多项式。

已知对作、计算函数在点处的值;、求插值数据点的插值多项式和三次样条插值多项式;、对计算和相应的函数值),()() (1,2,,99)4:()max ()()max()n k n k n k n k n k n k kkN x S x k E N y N x E S y S x ==-=-和;、计算,;解释你所得到的结果。

算法组织:本题在算法上需要解决的问题主要是:求出第二问中的Newton 插值多项式)(x N n 和三次样条插值多项式()n S x 。

如此,则第三、四问则迎刃而解。

计算两种插值多项式的算法如下:一、求Newton 插值多项式)(x N n ,算法组织如下:Newton 插值多项式的表达式如下:)())(()()(110010--⋅⋅⋅--+⋅⋅⋅+-+=n n n x x x x x x c x x c c x N其中每一项的系数c i 的表达式如下:1102110),,,(),,,(),,,(x x x x x f x x x f x x x f c i i i i i -⋅⋅⋅-⋅⋅⋅=⋅⋅⋅=-根据i c 以上公式,计算的步骤如下:⎪⎪⎪⎩⎪⎪⎪⎨⎧⋅⋅⋅+⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅----),,,,(1),,,(),,,,(),(,),,(2)(,),(),(11101111011010n n n n n n n n x x x x f n x x x f x x x f n x x f x x f x f x f x f 、计算、计算、计算、计算二、求三次样条插值多项式)(x S n ,算法组织如下:所谓三次样条插值多项式)(x S n 是一种分段函数,它在节点i x 011()n n a x x x x b -=<<⋅⋅⋅<<=分成的每个小区间1[,]i i x x -上是3次多项式,其在此区间上的表达式如下:22331111111()[()()]()()666[,]1,2,,.i i i i i i i i i i i i i i ii i h x x h x x S x x x M x x M y M y M h h h x x x i n --------=-+-+-+-∈=⋅⋅⋅,, 因此,只要确定了i M 的值,就确定了整个表达式,i M 的计算方法如下: 令:11111111116()6(,,)i i i i i i i i i i i i i ii i i i i i i h h h h h h y y y y d f x x x h h h h μλμ++++--+++⎧===-⎪++⎪⎨--⎪=-=⎪+⎩, 则i M 满足如下n-1个方程:1121,2,,1i i i i i i M M M d i n μλ-+++==⋅⋅⋅-,方程中有n+1个未知量,则令0M 和n M 分别为零,则由上面的方程组可得到(11)i M i n ≤≤-的值,可得到整个区间上的三次样条插值多项式)(x S n 。

matlab(迭代法_牛顿插值)

matlab(迭代法_牛顿插值)

实验报告内容:一:不动点迭代法解方程二:牛顿插值法的MATLAB实现完成日期:2012年6月21日星期四数学实验报告一日期:2012-6-21所以,确定初值为x0=1二:不断迭代算法:第一步:将f(x0)赋值给x1第二步:确定x1-x0的绝对值大小,若小于给定的误差值,则将x1当做方程的解,否则回到第一步编写计算机程序:clearf=inline('0.5*sin(x)+0.4');x0=1;x1=f(x0);k=1;while abs(x1-x0)>=1.0e-6x0=x1;x1=f(x0);k=k+1;fprintf('k=%.0f,x0=%.9f,x1=%.9f\n',k,x0,x1)end显示结果如下:k=2,x0=0.820735492,x1=0.765823700k=3,x0=0.765823700,x1=0.746565483k=4,x0=0.746565483,x1=0.739560873k=5,x0=0.739560873,x1=0.736981783k=6,x0=0.736981783,x1=0.736027993k=7,x0=0.736027993,x1=0.735674699 k=8,x0=0.735674699,x1=0.735543758 k=9,x0=0.735543758,x1=0.735495216 k=10,x0=0.735495216,x1=0.735477220 k=11,x0=0.735477220,x1=0.735470548 k=12,x0=0.735470548,x1=0.735468074 k=13,x0=0.735468074,x1=0.735467157 >>。

以下是程序运行截图:数学实验报告之二日期:2012-6-21【编写主程序】>> clear;clf>> x=0:0.1:5;>> y=sin(x);>> [yhat,dy]=newtint(x,y,0.59) 运行结果如下yhat =0.5564dy =-7.2731e-013>>所以:函数在0.59处的近似值为0.5564,误差为dy = -7.2731e-013【实验结果】函数在0.59处的近似值为0.5564【误差分析】误差为dy = -7.2731e-013【心得体会】总算明白了计算机解数学题目的原理是什么了,以前不懂,看到计算机解出一个一个的数学题就觉得非常神奇,老师担心人类不如计算机聪明担心有一天人类会被计算机取代。

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

MATLAB程序设计期中作业
——编程实现牛顿插值
成员:刘川(P091712797)签名_____
汤意(P091712817)签名_____
王功贺(P091712799)签名_____
班级:2009信息与计算科学
学院:数学与计算机科学学院
日期:2012年05月02日
牛顿插值的算法描述及程序实现
一:问题说明
在我们的实际应用中,通常需要解决这样的问题,通过一些已知的点及其对应的值,去估算另外一些点的值,这些数据之间近似服从一定的规律,于是,这就引入了插值法的思想。

插值法是利用函数f (x)在某区间中若干点的函数值,作出适当的特定函数,在这些点上取已知值,在区间的其他点上用这特定函数的值作为函数f (x)的近似值。

如果这特定函数是多项式,就称它为插值多项式。

利用插值基函数很容易得到拉格朗日插值多项式,公式结构紧凑,在理论分析中甚为方便,但当插值节点增减时全部插值基函数均要随之变化,整个公式也将发生变化,这在实际计算中是很不方便的,为了克服这一缺点,提出了牛顿插值。

二:算法分析
newton 插值多项式的表达式如下:
010011()()()()()n n n N x c c x x c x x x x x x -=+-+⋅⋅⋅+--⋅⋅⋅-
其中每一项的系数c i 的表达式如下:
12011010
[,,,][,,,][,,,]i i i i i f x x x f x x x c f x x x x x -⋅⋅⋅-⋅⋅⋅=⋅⋅⋅=- 即为f (x)在点01,,,i x x x ⋅⋅⋅处的i 阶差商,([]()i i f x f x =,1,2,
,i n =)
,由差商01[,,,]i f x x x ⋅⋅⋅的性质可知: ()
01001[,,,]()i i i j j k j k k j f x x x f x x x ==≠⋅⋅⋅=-∑∏ 牛顿插值的程序实现方法:
第一步:计算[][][][]001012012,,,,,,,n f x f x x f x x x f x x x x 、、、、。

第二步:计算牛顿插值多项式中01[,,,]i f x x x ⋅⋅⋅011()()()i x x x x x x ---⋅⋅⋅-,1,2,
,i n =,得到n 个多项式。

第三步:将第二步得到的n个多项式相加,得到牛顿插值多项式。

f x的值。

第四步:利用所得到的插值多项式,估算x取其它值时()
第五步:作出所求多项式在插值结点周围的函数图像。

三:编程实现
function [p2,z]=newTon(x,y,t)
%输入参数中x,y为元素个数相等的向量,t为待估计的点,可以为数字或向量。

%输出参数中p2为所求得的牛顿插值多项式,z为利用多项式所得的t的函数值。

n=length(x);
chaS(1)=y(1);
for i=2:n
x1=x;y1=y;
x1(i+1:n)=[];
y1(i+1:n)=[];
n1=length(x1);
s1=0;
for j=1:n1
t1=1;
for k=1:n1
if k==j
continue;
else
t1=t1*(x1(j)-x1(k));
end
end
s1=s1+y1(j)/t1;
end
chaS(i)=s1;
end
b(1,:)=[zeros(1,n-1) chaS(1)];
cl=cell(1,n-1);
for i=2:n
u1=1;
for j=1:i-1
u1=conv(u1,[1 -x(j)]);
cl{i-1}=u1;
end
cl{i-1}=chaS(i)*cl{i-1};
b(i,:)=[zeros(1,n-i),cl{i-1}];
end
p2=b(1,:);
for j=2:n
p2=p2+b(j,:);
end
if length(t)==1
rm=0;
for i=1:n
rm=rm+p2(i)*t^(n-i);
end
z=rm;
else
k1=length(t);
rm=zeros(1,k1);
for j=1:k1
for i=1:n
rm(j)=rm(j)+p2(i)*t(j)^(n-i); end
z=rm;
end
end
plot(t,z,'y',x,y,'*r')
四:实例验证
clc
clear
x=[0.4 0.55 0.65 0.80 0.90 1.05];
y=[0.41075 0.57815 0.69675 0.88811 1.02652 1.25386];
t=0.4:0.1:1.05;
[u,v]=newTon(x,y,t)
执行结果:
u =
0.0085 0.0032 0.1587 0.0073 0.9971 0.0004
v =
0.4108 0.5211 0.6367 0.7586 0.8881 1.0265 1.1752
1.3356 1.5095
则所求得的牛顿多项式为:
5432
=+++++
f x x x x x x
()0.00850.00320.15870.00730.99710.0004牛顿多项式的函数图像及已知节点在坐标中的显示如下:
x 轴y 轴
五:结果分析
本程序给出了计算牛顿插值多项式的函数,通过调用函数可以求得牛顿多项式与待估算点的值,作出了节点及待求多项式的函数图像,能够比较清晰的通过图像显示出来,总体来说,计算结果是比较理想的,达到了我们的目的。

然而程序在实现过程中,依旧存在着一些不足之处,总体反应在灵活性方面,参数的输入必须为三个,否则程序会出错,有时候我们仅需要得到牛顿多项式,而不需要去估算某个具体的x 对应的函数值。

另外,本程序的函数在实现过程中会给出多项式函数的函数图像,没有设置参数对其判断是否需要。

因此,这些都是有待改进的地方。

相关文档
最新文档