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型,这样就大大的提高了结果的精确度,减少了误差。
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编写牛顿插值法的程序,并分析其结果。
我们需要明确牛顿插值法的数学原理。
给定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程序及例题牛顿法是一种求解非线性方程组的常用方法,它的基本思想是通过迭代逐步逼近方程组的根。
在matlab中,可以通过编写相应的程序来实现牛顿法,并且可以通过一些例题来深入理解其应用。
下面是一份牛顿法的matlab程序:function [x, fval, exitflag, output] = mynewton(fun, x0, tol, maxiter)% fun:非线性方程组的函数句柄% x0:初始点% tol:允许误差% maxiter:最大迭代次数x = x0;fval = feval(fun, x);iter = 0;output = [];while norm(fval) > tol && iter < maxiteriter = iter + 1;J = myjacobian(fun, x);dx = - J fval;x = x + dx;fval = feval(fun, x);output = [output; [x', norm(fval)]];endif norm(fval) <= tolexitflag = 0; % 成功求解elseexitflag = 1; % 未能求解end% 计算雅可比矩阵function J = myjacobian(fun, x)n = length(x);fval = feval(fun, x);J = zeros(n);h = sqrt(eps); % 微小的增量for j = 1:nxj = x(j);x(j) = xj + h;fval1 = feval(fun, x);x(j) = xj - h;fval2 = feval(fun, x);x(j) = xj;J(:, j) = (fval1 - fval2) / (2 * h);end接下来,我们可以通过一个例题来演示牛顿法的应用。
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。
Langrage和Newton插值法的matlab实现

仅供参考1.已知数据如下:(1)用MATLAB语言编写按Langrage插值法和Newton插值法计算插值的程序,对以上数据进行插值;(2)利用MATLAB在第一个图中画出离散数据及插值函数曲线。
(1.1)langrage插值法编程实现syms xx0=[0.2,0.4,0.6,0.8,1.0];y0=[0.98,0.92,0.81,0.64,0.38];for i=1:5a=1;for j=1:5if j~=ia=expand(a*(x-x0(j)));endendb=1;for k=1:5if k~=ib=b*(x0(i)-x0(k));endendA(i)=expand(a/b);endL=0;for p=1:5L=L+y0(p)*A(p);endLL =-25/48*x^4+5/6*x^3-53/48*x^2+23/120*x+49/50(1.2)Newton插值程序实现clear allclcsyms xx0=[0.2,0.4,0.6,0.8,1.0];y0=[0.98,0.92,0.81,0.64,0.38];for k=1:5for i=1:ka=1;b=0;for j=1:kif j~=ia=a*(x0(i)-x0(j));endendb=b+y0(i)/a;endA(k)=b;endB=[1,(x-x0(1)),(x-x0(1))*(x-x0(2)),(x-x0(1))*(x-x0(2))*(x-x0(3)),(x-x 0(1))*(x-x0(2))*(x-x0(3))*(x-x0(4))];L1=A.*B;l=0;for m=1:5l=l+L1(m);endL=expand(l)L =61/100+13/30*x+383/48*x^2-155/24*x^3+475/48*x^4(2)画图x0=[0.2,0.4,0.6,0.8,1.0];y0=[0.98,0.92,0.81,0.64,0.38];subplot(1,2,1);plot(x0(1),y0(1),'+r',x0(2),y0(2),'+r',x0(3),y0(3),'+r',x0(4),y0(4),' +r',x0(5),y0(5),'+r')x=0:0.05:1;y=-25/48.*x.^4+5/6.*x.^3-53/48.*x.^2+23/120.*x+49/50;subplot(1,2,2);plot(x,y)2.给定函数21(),[1,1]125f x x x ,利用上题编好的Langrage 插值程序(或Newton 插值程序),分别取3个,5个、9个、11个等距节点作多项式插值,分别画出插值函数及原函数()f x 的图形,以验证Runge 现象、分析插值多项式的收敛性。
牛顿法matlab程序及例题

牛顿法matlab程序及例题牛顿法是一种求解非线性方程和优化问题的常用方法。
它利用函数的一阶和二阶导数信息来不断逼近函数的零点或极值点。
在MATLAB 中,可以用fzero函数实现非线性方程的求解,用fminunc函数实现优化问题的求解。
以下是一个简单的牛顿法的MATLAB程序示例:function [x, fx, n] = newton(f, df, x0, tol, max_iter) % f: 目标函数% df: 目标函数的一阶导数% x0: 初值% tol: 精度要求% max_iter: 最大迭代次数n = 0;while n < max_iterfx = f(x0);dfx = df(x0);if abs(dfx) < 1e-9error('牛顿法失败:一阶导数过小');endx = x0 - fx / dfx;if abs(x - x0) < tolreturn;endx0 = x;n = n + 1;enderror('牛顿法失败:达到最大迭代次数');下面是一个例题,通过牛顿法求解方程sin(x) = x / 2:f = @(x) sin(x) - x / 2;df = @(x) cos(x) - 1 / 2;[x, fx, n] = newton(f, df, 1, 1e-9, 100);fprintf('解:%.16f,函数值:%.16f,迭代次数:%d', x, fx, n);运行结果为:解:0.0000000000000000,函数值:0.0000000000000000,迭代次数:4可以看到,牛顿法很快就找到了方程的一个根。
需要注意的是,牛顿法可能会失败,特别是在一阶导数过小或初值离根太远的情况下。
因此,使用时需要谨慎,并进行必要的检查和处理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目一:多项式插值
某气象观测站在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 )可以用差商表示。
一般有
f k =α[
k
10x x x ⋯⋯,] (k=0,1,2,……,n )
(4)
把(4)代入(1)得到满足插值条件N )()
(i i n x f x =(i=0,1,2,……n )的n 次Newton 插值多项式
N n (x )=f (0x )+f[10x x ,](1x -x )+f[210x x x ,,](1x -x )(2x -x )+……+f[n 10x x x ⋯⋯,](1x -x )(2x -x )…(1-n x -x ).
其中插值余项为:
)
()!
()
()()()(x 1n f x N -x f x R 1n 1
n n +++==ωξ ξ介于k 10x x x ⋯⋯,之间。
三、程序设计
function [y,A,C,L]=newdscg(X,Y,x,M)
% y 为对应x 的值,A 为差商表,C 为多项式系数,L 为多项式 % X 为给定节点,Y 为节点值,x 为待求节点 n=length(X); m=length(x); % n 为X 的长度 for t=1:m
z=x(t); A=zeros(n,n);A(:,1)=Y'; s=; p=; q1=; c1=;
for j=2:n for i=j:n
A(i,j)=(A(i,j-1)- A(i-1,j-1))/(X(i)-X(i-j+1)); end
q1=abs(q1*(z-X(j-1)));c1=c1*j; end
C=A(n,n);q1=abs(q1*(z-X(n))); for k=(n-1):-1:1
C=conv(C,poly(X(k))); d=length(C);C(d)=C(d)+A(k,k); end
y(k)= polyval(C, z); %输出y 值
end
L(k,:)=poly2sym(C); %输出多项式
>> syms M,X=[1,3,5,7];Y=[,,,];x=10;
>> [y,A,C,L]=newdscg(X,Y,x,M)
y =
A =
0 0 0
0 0
C =
L =
- x^3/480 - (19*x^2)/160 + (697*x)/480 + 3387/160
四、结果分析和讨论
对于不超过三次的插值多项式,x如果选取1,3,5,7这三个点能够得到较好的三次插值多项式L=^^2++。
当x=10时,也即9点30分时的温度为度,结果分析知此值应是偏小的。
对于选取不同的插值节点,能够得到不同的插值多项式,误差也不尽相同。
五、完成题目的体会与收获
对于牛顿插值法有了更深的了解,合理选择插值节点很重要。
加深了对其原理的认识,学会了牛顿插值法的matlab编程,对matlab计算方法更加熟悉。
通过完成这道题使我受益匪浅。