数值分析实验报告-插值、三次样条(教育教学)
数值分析实验报告-插值、三次样条
实验报告:牛顿差值多项式&三次样条问题:在区间[-1,1]上分别取n=10、20用两组等距节点对龙格函数21()25f x x作多项式插值及三次样条插值,对每个n 值,分别画出插值函数及()f x 的图形。
实验目的:通过编程实现牛顿插值方法和三次样条方法,加深对多项式插值的理解。
应用所编程序解决实际算例。
实验要求:1. 认真分析问题,深刻理解相关理论知识并能熟练应用;2. 编写相关程序并进行实验;3. 调试程序,得到最终结果;4. 分析解释实验结果;5. 按照要求完成实验报告。
实验原理:详见《数值分析 第5版》第二章相关内容。
实验内容:(1)牛顿插值多项式1.1 当n=10时:在Matlab 下编写代码完成计算和画图。
结果如下:代码:clear allclcx1=-1:0.2:1;y1=1./(1+25.*x1.^2);n=length(x1);f=y1(:);for j=2:nfor i=n:-1:jf(i)=(f(i)-f(i-1))/(x1(i)-x1(i-j+1));endendsyms F x p ;F(1)=1;p(1)=y1(1);for i=2:nF(i)=F(i-1)*(x-x1(i-1));p(i)=f(i)*F(i);endsyms PP=sum(p);P10=vpa(expand(P),5);x0=-1:0.001:1;y0=subs(P,x,x0);y2=subs(1/(1+25*x^2),x,x0);plot(x0,y0,x0,y2)grid onxlabel('x')ylabel('y')P10即我们所求的牛顿插值多项式,其结果为:P10(x)=-220.94*x^10+494.91*x^8-9.5065e-14*x^7-381.43*x^6-8.504e-14*x^5+123.36*x^4+2.0202e-1 4*x^3-16.855*x^2-6.6594e-16*x+1.0并且这里也能得到该牛顿插值多项式的在[-1,1]上的图形,并和原函数进行对比(见Fig.1)。
数值分析综合实验报告
一、实验目的通过本次综合实验,掌握数值分析中常用的插值方法、方程求根方法以及数值积分方法,了解这些方法在实际问题中的应用,提高数值计算能力。
二、实验内容1. 插值方法(1)拉格朗日插值法:利用已知数据点构造多项式,以逼近未知函数。
(2)牛顿插值法:在拉格朗日插值法的基础上,通过增加基函数,提高逼近精度。
2. 方程求根方法(1)二分法:适用于函数在区间内有正负值的情况,通过不断缩小区间来逼近根。
(2)Newton法:利用函数的导数信息,通过迭代逼近根。
(3)不动点迭代法:将方程转化为不动点问题,通过迭代逼近根。
3. 数值积分方法(1)矩形法:将积分区间等分,近似计算函数值的和。
(2)梯形法:将积分区间分成若干等分,用梯形面积近似计算积分。
(3)辛普森法:在梯形法的基础上,将每个小区间再等分,提高逼近精度。
三、实验步骤1. 拉格朗日插值法(1)输入已知数据点,构造拉格朗日插值多项式。
(2)计算插值多项式在未知点的函数值。
2. 牛顿插值法(1)输入已知数据点,构造牛顿插值多项式。
(2)计算插值多项式在未知点的函数值。
3. 方程求根方法(1)输入方程和初始值。
(2)选择求解方法(二分法、Newton法、不动点迭代法)。
(3)迭代计算,直到满足精度要求。
4. 数值积分方法(1)输入被积函数和积分区间。
(2)选择积分方法(矩形法、梯形法、辛普森法)。
(3)计算积分值。
四、实验结果与分析1. 插值方法(1)拉格朗日插值法:通过构造多项式,可以较好地逼近已知数据点。
(2)牛顿插值法:在拉格朗日插值法的基础上,增加了基函数,提高了逼近精度。
2. 方程求根方法(1)二分法:适用于函数在区间内有正负值的情况,计算简单,但收敛速度较慢。
(2)Newton法:利用函数的导数信息,收敛速度较快,但可能存在数值不稳定问题。
(3)不动点迭代法:将方程转化为不动点问题,收敛速度较快,但可能存在初始值选择不当的问题。
3. 数值积分方法(1)矩形法:计算简单,但精度较低。
西北农林科技大学数值分析数值法实验报告
数值法实验报告专业班级:信息与计算科学121 姓名:金辉 学号:20120142801)实验目的本次实验的目的是熟练《数值分析》第二章“插值法”的相关内容,掌握三种插值方法:牛顿多项式插值,三次样条插值,拉格朗日插值,并比较三种插值方法的优劣。
本次试验要求编写牛顿多项式插值,三次样条插值,拉格朗日插值的程序编码,并在MATLAB 软件中去实现。
2)实验题目 实验一:试用44据进行插值。
用图给出{(x i ,y i ),x i =0.2+0.08i ,i=0,1, 11, 10},P 4(x )及S (x )。
实验二:在区间[-1,1]上分别取10,20n =用两组等距节点对龙格函数21()125f x x =+作多项式插值及三次样条插值,对每个n 值,分别画出插值函数即()f x 的图形。
实验三:可以得到平方根函数的近似,在区间[0,64]上作图。
(1)用这9各点作8次多项式插值L 8(x).(2)用三次样条(自然边界条件)程序求S (x )。
从结果看在[0,64]上,那个插值更精确;在区间[0,1]上,两种哪个更精确?3)实验原理与理论基础《数值分析》第二章“插值法”的相关内容,包括:牛顿多项式插值,三次样条插值,拉格朗日4)实验内容 实验一:试用44据进行插值。
用图给出{(xi ,yi),xi=0.2+0.08i,i=0,1, 11, 10},P4(x)及S(x)。
(1)首先我们先求牛顿插值多项式,此处要用4次牛顿插值多项式处理数据。
已知n次牛顿插值多项式如下:P n =f(x)+f[x,x1](x-x)+ f[x,x1,x2](x-x) (x-x1)+···+f[x0,x1, (x)n](x-x) ···(x-xn-1)我们要知道牛顿插值多项式的系数,即均差表中得部分均差。
在MATLAB的Editor中输入程序代码,计算牛顿插值中多项式系数的程序如下:function varargout=newtonliu(varargin)clear,clcx=[0.2 0.4 0.6 0.8 1.0];fx=[0.98 0.92 0.81 0.64 0.38];newtonchzh(x,fx);function newtonchzh(x,fx)%由此函数可得差分表n=length(x);fprintf('*****************差分表*****************************\n');FF=ones(n,n);FF(:,1)=fx';for i=2:nfor j=i:nFF(j,i)=(FF(j,i-1)-FF(j-1,i-1))/(x(j)-x(j-i+1));endendfor i=1:nfprintf('%4.2f',x(i));for j=1:ifprintf('%10.5f',FF(i,j));endfprintf('\n'); end由所以有四次插值牛顿多项式为:P 4(x )=0.98-0.3(x-0.2)-0.62500 (x-0.2)(x-0.4) -0.20833(x-0.2)(x-0.4)(x-0.6)-0.52083 (x-0.2)(x-0.4)(x-0.6)(x-0.8)(2)接下来我们求三次样条插值函数。
三次样条插值方法的应用
CENTRAL SOUTH UNIVERSITY数值分析实验报告三次样条插值方法的应用一、问题背景分段低次插值函数往往具有很好的收敛性,计算过程简单,稳定性好,并且易于在在电子计算机上实现,但其光滑性较差,对于像高速飞机的机翼形线船体放样等型值线往往要求具有二阶光滑度,即有二阶连续导数,早期工程师制图时,把富有弹性的细长木条(即所谓的样条)用压铁固定在样点上,在其他地方让他自由弯曲,然后沿木条画下曲线,称为样条曲线。
样条曲线实际上是由分段三次曲线并接而成,在连接点即样点上要求二阶导数连续,从数学上加以概括就得到数学样条这一概念。
下面我们讨论最常用的三次样条函数及其应用。
二、数学模型样条函数可以给出光滑的插值曲线(面),因此在数值逼近、常微分方程和偏微分方程的数值解及科学和工程的计算中起着重要的作用。
设区间[]b ,a 上给定有关划分b x x n =<<<=Λ10x a ,S 为[]b ,a 上满足下面条件的函数。
● )(b a C S ,2∈;● S 在每个子区间[]1,+i i x x 上是三次多项式。
则称S 为关于划分的三次样条函数。
常用的三次样条函数的边界条件有三种类型:● Ⅰ型 ()()n n n f x S f x S ''0'',==。
● Ⅱ型 ()()n n n f x S f x S ''''0'''',==,其特殊情况为()()0''''==n n x S x S 。
● Ⅲ型 ()()Λ3,2,1,0,0==j x S x S n j j ,此条件称为周期样条函数。
鉴于Ⅱ型三次样条插值函数在实际应用中的重要地位,在此主要对它进行详细介绍。
三、算法及流程按照传统的编程方法,可将公式直接转换为MATLAB可是别的语言即可;另一种是运用矩阵运算,发挥MATLAB在矩阵运算上的优势。
数值分析上机实验报告(插值)
数值分析第一次上机练习实验报告——Lagrange 插值与三次样条插值一、 问题的描述设()2119f x x =+, []1,1x ∈-,取15iix =-+,0,1,2,...,10i =.试求出10次Lagrange 插值多项式()10L x 和三次样条插值函数()S x (采用自然边界条件),并用图画出()f x ,()10L x ,()S x .二、 方法描述——Lagrange 插值与三次样条插值我们取15i ix =-+,0,1,2,...,10i =,通过在i x 点的函数值()2119i i f x x =+来对原函数进行插值,我们记插值函数为()g x ,要求它满足如下条件:()()21,0,1,2,...,1019i i i g x f x i x ===+ (1)我们在此处要分别通过Lagrange 插值(即多项式插值)与三次样条插值的方法对原函数()2119f x x=+进行插值,看两种方法的插值结果,并进行结果的比较。
10次的Lagrange 插值多项式为:()()10100i i i L x y l x ==∑ (2)其中:()21,0,1,2,...,1019i i iy f x i x ===+ 以及()()()()()()()()()011011......,0,1,2,...,10......i i n i i i i i i i n x x x x x x x x l x i x x x x x x x x -+-+----==----我们根据(2)进行程序的编写,我们可以通过几个循环很容易实现函数的Lagrange 插值。
理论上我们根据区间[]1,1-上给出的节点做出的插值多项式()n L x 近似于()f x ,而多项式()n L x 的次数n 越高逼近()f x 的精度就越好。
但实际上并非如此,而是对任意的插值节点,当n →+∞的时候()n L x 不一定收敛到()f x ;而是有时会在插值区间的两端点附近会出现严重的()n L x 偏离()f x 的现象,即所谓的Runge 现象。
插值数值实验报告(3篇)
第1篇一、实验目的1. 理解并掌握插值法的基本原理和常用方法。
2. 学习使用拉格朗日插值法、牛顿插值法等数值插值方法进行函数逼近。
3. 分析不同插值方法的优缺点,并比较其精度和效率。
4. 通过实验加深对数值分析理论的理解和应用。
二、实验原理插值法是一种通过已知数据点来构造近似函数的方法。
它广泛应用于科学计算、工程设计和数据分析等领域。
常用的插值方法包括拉格朗日插值法、牛顿插值法、样条插值法等。
1. 拉格朗日插值法拉格朗日插值法是一种基于多项式的插值方法。
其基本思想是:给定一组数据点,构造一个次数不超过n的多项式,使得该多项式在这些数据点上的函数值与已知数据点的函数值相等。
2. 牛顿插值法牛顿插值法是一种基于插值多项式的差商的插值方法。
其基本思想是:给定一组数据点,构造一个次数不超过n的多项式,使得该多项式在这些数据点上的函数值与已知数据点的函数值相等,并且满足一定的差商条件。
三、实验内容1. 拉格朗日插值法(1)给定一组数据点,如:$$\begin{align}x_0 &= 0, & y_0 &= 1, \\x_1 &= 1, & y_1 &= 4, \\x_2 &= 2, & y_2 &= 9, \\x_3 &= 3, & y_3 &= 16.\end{align}$$(2)根据拉格朗日插值公式,构造插值多项式:$$P(x) = \frac{(x-x_1)(x-x_2)(x-x_3)}{(x_0-x_1)(x_0-x_2)(x_0-x_3)}y_0 + \frac{(x-x_0)(x-x_2)(x-x_3)}{(x_1-x_0)(x_1-x_2)(x_1-x_3)}y_1 + \frac{(x-x_0)(x-x_1)(x-x_3)}{(x_2-x_0)(x_2-x_1)(x_2-x_3)}y_2 + \frac{(x-x_0)(x-x_1)(x-x_2)}{(x_3-x_0)(x_3-x_1)(x_3-x_2)}y_3.$$(3)计算插值多项式在不同点的函数值,并与实际值进行比较。
数值分析实验报告(插值法)
武汉理工大学学生实验报告书实验课程名称数值分析开课学院计算机科学与技术学院指导老师姓名学生姓名学生专业班级2010—2010学年第一学期实验课程名称:数值分析第二部分:实验调试与结果分析(可加页)一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)(1)用拉格朗日插值法计算时,输入及运行结果如下:拉格朗日插值法牛顿插值法(2)利用二次插值计算时,输入及运行结果如下:拉格朗日插值法牛顿插值法(3)用艾尔米特插值法计算时,f(x)的插值多项式H5(x)=(1+4*x)*(x-0.5)*(x-0.5)*(x-2)*(x-2)+(3.90807-6.03838*x)*(x-2)*(x-2)*x*x+(2.34573-4.16674*x)*x*x*(x-0.5)*(x-0.5)(4)各插值算法的精度差异比较经过比较,拉格朗日插值法要比牛顿插值法算法的计算量多一些,拉格朗日插值法后一次计算时用到了前一次计算的结果,提高了运算的效率,但拉格朗日插值法在构造艾尔米特插值法时很方便,将坐标点和对应的导数结合起来的精度比线性插值的精度又要高一些。
但从实验数据来看,在坐标不是很多的情况下,已知的点越多精度也就相对较高。
对于实验要求的第二组数据用拉格朗日插值法(或者牛顿插值法)实验结果如下:一下分别是二阶、三阶、四阶、五阶插值得到的结果以上只是实验结果的一部分,改变插值的位置时,得到的实验结果精度也是有所不同的。
由以上结果分析可知,插值次数并不是越多越好,多了反而会让结果更加偏离真实结果,这充分说明了高次插值存在“病态性质”,在已知点很多的情况下应该采用分段低次插值,将拉格朗日插值法和牛顿插值法运用到分段低次插值法当中,这样得到的结果可能胡更加精确。
数值分析插值实验报告
数值分析插值实验报告引言插值是数值分析中常用的一种技术,通过已知点的函数值来推测未知点的函数值。
在实际应用中,我们经常需要根据有限的数据点来估计连续函数的值,这时插值就起到了关键作用。
本实验旨在通过插值方法来推测未知数据点的函数值,并对比不同插值方法的精度和效果。
实验目的1.了解插值的基本概念和方法;2.掌握常见的插值方法,如拉格朗日插值、牛顿插值等;3.对比不同插值方法的精度和效果,分析其优缺点。
实验步骤1.数据采集:选取一组已知数据点,作为插值的基础。
这些数据点可以是从实际场景中测量得到的,也可以是人为设定的。
2.插值方法选择:根据实验要求和数据特点,选择适合的插值方法。
常见的插值方法包括拉格朗日插值、牛顿插值、分段线性插值等。
3.插值计算:根据选定的插值方法,利用已知数据点进行计算,并得到插值结果。
4.结果分析:比较插值结果与实际数据的差异,并评估插值方法的精度和效果。
可以使用误差分析等方法进行评估。
5.优化调整:根据实验结果和需求,对插值方法进行优化调整,以提高插值的准确性和可靠性。
实验结果与讨论通过实验,我们得到了不同插值方法的结果,并进行了对比和分析。
根据实验数据和误差分析,我们可以得出以下结论:1.拉格朗日插值方法具有较高的插值精度,在一定程度上能够准确地模拟实际数据。
2.牛顿插值方法相对于拉格朗日插值方法而言,对于大量数据点的计算速度更快,但在少量数据点的情况下,两者的精度差异较小。
3.分段线性插值方法适用于数据点较为离散的情况,能够提供较为平滑的插值结果。
4.插值方法的选择应根据具体需求和数据特点进行,没有一种插值方法适用于所有情况。
实验总结通过本次实验,我们对插值方法有了更深入的了解,并掌握了常见的插值方法的原理和应用。
实验结果表明,插值方法在数值分析中起到了重要的作用,能够准确地推测未知点的函数值。
然而,在实际应用中,我们还需要考虑数据的特点、插值方法的适用性以及计算效率等因素。
三次样条实验报告范文三次样条插值的实验报告范文
三次样条实验报告范文三次样条插值的实验报告范文湘潭大学实验报告课程名称计算机图形学实验名称参数三次样条的绘制页数专业计算机科学与技术班级一班同组者姓名学号2022551208姓名刘兆臣实验日期2022.05.05实验目的使学生掌握三次参数样条的定义、画法和程序的编写。
实验内容和要求给定型值点,要求用VC++6.0画出通过给定型值点的参数三次样条曲线。
实验方案设计给定型值点,计算出参数三次样条曲线的每个区间段的代数式,由Hermit曲线定义画出每个区间的曲线。
开始开始给定型值点给定型值点计算出参数计算出参数ifn=1Yifn=1N给系数矩阵赋值给系数矩阵赋值Ifn=2YIfn=2给定系数值给定系数值N求解方程组,计算出各点导数求解方程组,计算出各点导数Ifi<ni=0Ifi<ni=0Y计算第i段的二次项,三次项系数计算第i段的二次项,三次项系数结束结束t=0t=0Ift<tt[i-1]Ift<tt[i-1]NYt=t+et=t+e计算出第i段中各点的某,y值计算出第i段中各点的某,y值连线段连线段i++i++程序运行和实验结果说明和分析。
使用VC++6.0运行程序后得到如下图形图为四段曲线组成的三次参数样条曲线,其中各段的绘制是通过给定了型值点的相关参数计算出型值点的导数,再由Hermit曲线知识,在各段上以直代曲绘制出每段的图形。
基本达到了实验目的,完成实验要求。
性能、扩展性等方面存在的不足和可能的改进之处。
不足:在源代码中的n个点采用了数据初始化的方法给出且给定了型值点的个数。
由于给定型值点较少,三次参数样条曲线看起来不够明显。
可改进:可将初始化的型值点数据去除,采用手动键盘输入或文件输入的方法导入多个型值点数据。
附件一源程序,执行程序,符号列表文件。
#include<graphic.h>#include<math.h>#include<conio.h>main(){intgdriver=DETECT,gmode;float某[100],y[100],a[100],b[100],c[100];floatp某[100],py[100],q某[100],qy[100],tt[100];floatd某[100],dy[100];inti,n=4,t,e=3;floatb某3,b某4=0.0,by3=0.0,by4,c某,cy;initgraph(&gdriver,&gmode,"");for(i=0;i<n;i++) {a[i]=0.0;b[i]=0.0;c[i]=0.0;p某[i]=0.0;py[i]=0.0;d某[i]=0.0;dy[i]=0.0;tt[i]=0.0;q某[i]=0.0;qy[i]=0.0;}p某[0]=1.0;py[0]=1.0;p某[4]=1.0;py[4]=1.0;某[0]=10.0;y[0]=110.0;某[1]=40.0;y[1]=100.0;某[2]=80.0;y[2]=90.0;某[3]=130.0;y[3]=95.0;某[4]=200.0;y[4]=105.0;moveto(某[0],y[0]);for(i=0;i<n;i++)putpi某el(某[i],y[i],15);putpi某el(某[0],y[0],15);for(i=0;i<n;i++)tt[i]=qrt((某[i]-某[i-1])某(某[i]-某[i-1])+(y[i]-y[i-1])某(y[i]-y[i-1]));if(n==1)gotopO;for(i=1;i<=n-1;i++){a[i]=2某(tt[i]+tt[i+1]);b[i]=tt[i+1];c[i]=tt[i];d某[i]=3某(tt[i]某(某[i+1]-某[i])/tt[i+1]+tt[i+1]某(y[i]-y[i+1])/tt[i]);}d某[i]=d某[1]-tt[2]某p某[0];d某[n-1]=d某[n-1]-tt[n-1]某p某[n];dy[1]=dy[1]-tt[2]某py[0];dy[n-1]=dy[n-1]-tt[n-1]某py[n];if(n==2){p某[1]=d某[1]/a[1];py[1]=dy[1]/a[1];gotopO;}c[1]=c[1]/a[1];for(i=2;i<=n-1;i++){a[i]=a[i]-b[i]某c[i-1];c[i]=c[i]/a[i];}q某[1]=d某[1]/a[1];qy[1]=dy[1]/a[1];for(i=2;i<=n-1;i++){q某[i]=(d某[i]-b[i]某q某[i-1])/a[i]; qy[i]=(dy[i]-b[i]某qy[i-1])/a[i];}p某[n-1]=q某[n-1];qy[n-1]=qy[n-1];for(i=n-2;i>=1;i--){p某[i]=q某[i]-c[i]某p某[i+1];py[i]=qy[i]-c[i]某py[i+1];}pO:for(i=0;i<=n-1;i++){b某3=(3某(某[i+1]-某[i])/tt[i+1]-2某p某[i]-p某[i+1])/tt[i+1];b某4=((2某(某[i]-某[i+1])/tt[i+1]+p某[i]+p某[i+1])/tt[i+1])/tt[i+1];by3=(3某(y[i+1]-y[i])/tt[i+1]-2某py[i]-py[i+1])/tt[i+1];by4=((2某(y[i]-y[i+1])/tt[i+1]+py[i]+py[i+1])/tt[i+1])/tt[i+1];t=0;do{t=t+e;c某=某[i]+(p某[i]+(b某3+b某4某t)某t)某t;cy=y[i]+(py[i]+(by3+by4某t)某t)某t;lineto(c某,cy);}while(t<tt[i+1]);}getch();cloegraph();}某[i]i型值点某坐标y[i]i型值点Y坐标a[i]初始赋值方程组系数矩阵mi,i的值b[i]初始赋值方程组系数矩阵mi,i+1的值c[i]初始赋值方程组系数矩阵mi,i-1的值p某[i]i型值点导函数某值py[i]i型值点导函数Y值q某[i],qy[i],d某[i],dy[i]均为解方程组中的各项系数tt[i]第i段参数范围(型值点i-1到型值点i的距离)b某,y3每段函数中二次项的系数b某,y4每段函数中三次项的系数c某每段函数中各点的某值cy每段函数中各点的Y值e作图时每段‘以直代曲’中的参数增量其中方程矩阵形式为:m1,1m1,2p1C1m2,1m2,2m2,3p2C2m3,2m3,3m3,4p3C3............=...mn-1,n-2mn-1,n-1mn-1,npn-1Cn-1mn,n-1mn,npnCn将系数矩阵改写为:其中方程矩阵形式为:(变量与代码变量不对应,如a2不等于a[2]) m1,1m1,2l11u1m2,1m2,2m2,3a2l21u2m3,2m3,3m3,4a3l31u3.........=.........mn-1,n-2mn-1,n-1mn-1,nan-1ln-11un-1mn,n-1mn,nanln1pi对应代码中p某[i],py[i]的值Ci对应代码中q某[i],qy[i]的值附件二运行结果文件。
关于三次样条插值函数的学习报告
关于三次样条插值函数的学习报告三次样条插值函数是一种广泛应用于数值分析领域的插值方法,用于逼近一组已知数据点构成的函数。
在这篇学习报告中,我将介绍三次样条插值函数的定义、原理、应用及其优缺点,并通过实际例子说明其如何在实际问题中使用。
一、三次样条插值函数的定义三次样条插值函数是指用分段三次多项式对一组已知数据点进行插值的方法。
具体来说,对于已知数据点$(x_0,y_0),(x_1,y_1),...,(x_n,y_n)$,三次样条插值函数会在每相邻两个数据点之间构造一个三次多项式,使得这些多项式在相应的数据点上满足插值条件,并且在相邻两个多项式之间满足一定的连续性条件。
二、三次样条插值函数的原理三次样条插值函数的原理是利用三次多项式在每个数据点上的取值和导数值来确定三次多项式的系数,从而构造出满足插值条件和连续性条件的插值函数。
具体来说,对于每个相邻的数据点$(x_i,y_i),(x_{i+1},y_{i+1})$,我们可以构造一个三次多项式$S_i(x)$,满足以下条件:1.$S_i(x_i)=y_i$,$S_i(x_{i+1})=y_{i+1}$,即在数据点上满足插值条件;2.$S_i'(x_{i+1})=S_{i+1}'(x_{i+1})$,$S_i''(x_{i+1})=S_{i+1}''(x_{i+1})$,即在数据点上满足连续性条件。
通过求解上述条件,可以得到每个相邻数据点之间的三次多项式$S_i(x)$,从而得到整个插值函数。
三、三次样条插值函数的应用三次样条插值函数在数值分析领域有广泛的应用,尤其在曲线拟合、数据逼近等问题中起到重要作用。
例如,当我们需要根据已知的离散数据点绘制平滑的曲线图形时,可以使用三次样条插值函数来进行插值,从而得到更加连续和光滑的曲线。
另外,在信号处理、图像处理等领域也常常会用到三次样条插值函数。
例如,在数字图像处理中,我们需要对像素点进行插值以得到更高分辨率的图像,三次样条插值函数可以很好地满足这个需求,使图像更加清晰和真实。
三次样条插值报告
三次样条插值多项式实验的目的及意义:为了取得理想结果:在不增加更多的插值条件下,能够求得一个插值多项式,既有良好的逼近效果,又有好的光滑性,引进三次样条插值 多项式。
如果已知函数y=f(x)在节点a=x0<x1<…<xn=b 处的函数值和导数值:()i i x f y =,i=0,1,2,…,n如果S(x)满足条件:1. S(x)是一个分段的三次多项式且()i i y x S =;2. S(x)在[a,b]具有二阶连续导数。
则称S(x)是三次样条插值函数。
S(x)的具体形式为:()()()()⎪⎪⎩⎪⎪⎨⎧∈∈∈=-]12,121,01,[,...............][,][,n n n x x x x s x x x x s x x x x s x s其中()x S i 在[]i i x x ,1-上是三次多项式()iiiiid x c x b x a x S +++=23由插值条件()ii y x S =,i=0,1,2,…,n ,得n+1个条件。
边界条件一:()()nn y x S y x S '',''00== 边界条件二:()()nn y x S y x S '''',''''00==数学公式:()()2211133[2]()[2()]()i i i i i i i i i i ih x x x x h x x x x H x y y h h ---+-----=++2211122()()()()i i i i i i i ix x x x x x x x m m h h -------+ 算法描述:Step1:输入未知数X 及(xi,yi),i=0,1,…,n ; Step2:计算步长H[i]; Step3:计算[][]()⎪⎪⎪⎩⎪⎪⎪⎨⎧+=-=+=-+++i i i i i i i ii i i i i x x f x x f u g u hh h ,,311111λλλStep4:根据边界条件,求解相应的方程得到m0,m1,…, mn Step5:判断X 属于[]i i x x ,1-,i=1,2,…,n 中的哪一个Step6:计算()x s y i i ≈Step7:输出y. 程序原代码如下: #include "stdio.h" #define N 5 void main() { int i,k; float X,s,y0,yn;float a[N][N+1],h[N],u[N],v[N],g[N],m[N],p[N],q[N],w[N];printf("please input X:"); //X 为未知数的大小scanf("%f",&X);printf("please input x:"); //输入x的大小for(i=0;i<N;i++)scanf("%f",&a[i][0]);printf("please input y:"); //输入y的大小for(i=0;i<N;i++)scanf("%f",&a[i][1]);for(i=1;i<N;i++)h[i]=a[i][0]-a[i-1][0]; //计算步长for(i=1;i<N;i++){v[i]=h[i+1]/(h[i]+h[i+1]);u[i]=1-v[i];g[i]=3*u[i]*(a[i+1][1]-a[i][1])/h[i+1]+3*v[i]*(a[i][1]-a[i-1][1])/h[i]; }printf("\t(1)已知边界条件1\n");printf("\t(2)已知边界条件2\n");printf("请选择边界条件序号:");scanf("%d",&k);if(k==1){printf("请输入y0和yn的一阶导:"); //输入边界条件一scanf("%f%f",&m[0],&m[N-1]);p[0]=0; //用追赶法求解m[N]q[0]=0;g[1]=g[1]-v[1]*m[0];g[N-2]=g[N-2]-u[N-2]*m[N-1];for(i=1;i<N;i++){w[i]=2-u[i]*p[i-1];p[i]=v[i]/w[i];q[i]=(g[i]-u[i]*q[i-1])/w[i];}m[N-2]=q[N-2];for(i=N-3;i>0;i--)m[i]=q[i]-p[i]*m[i+1];printf("输出m[i]的值:\n");for(i=0;i<N;i++)printf("%f\n",m[i]);for(i=1;i<N;i++) //计算最终结果if(X>a[i-1][0]&&X<a[i][0])s=(h[i]+2*(X-a[i-1][0]))*(X-a[i][0])*(X-a[i][0])*a[i-1][1]/(h[i]*h[i]*h[i]) +(h[i]-2*(X-a[i][0]))*(X-a[i-1][0])*(X-a[i-1][0])*a[i][1]/(h[i]*h[i]*h[i])+ (X-a[i-1][0])*(X-a[i][0])*(X-a[i][0])*m[i-1]/(h[i]*h[i])+(X-a[i-1][0])*(X-a[i-1][0])*(X-a[i][0])*m[i]/(h[i]*h[i]);printf("s(%f)=%f\n",X,s);}if(k==2){printf("请输入y0和yn的二阶导:"); //输入边界条件二scanf("%f%f",&y0,&yn);g[0]=3*(a[1][1]-a[0][1])/h[1]-h[1]*y0/2;g[N-1]=3*(a[N-1][1]-a[N-2][1])/h[N-1]+h[N-1]*yn/2;q[0]=g[0];u[0]=1;v[N-1]=1;w[0]=2;for(i=1;i<N;i++){w[i]=2-v[i]*u[i-1]/w[i-1];q[i]=g[i]-v[i]*q[i-1]/w[i-1];}m[N-1]=q[N-1]/w[N-1];for(i=N-2;i>=0;i--)m[i]=(q[i]-u[i]*m[i+1])/w[i];printf("输出m[i]的值:\n");for(i=0;i<N;i++)printf("%f\n",m[i]);for(i=1;i<N;i++)if(X>=a[i-1][0]&&X<=a[i][0])s=(h[i]+2*(X-a[i-1][0]))*(X-a[i][0])*(X-a[i][0])*a[i-1][1]/(h[i]*h[i]*h[i]) +(h[i]-2*(X-a[i][0]))*(X-a[i-1][0])*(X-a[i-1][0])*a[i][1]/(h[i]*h[i]*h[i])+ (X-a[i-1][0])*(X-a[i][0])*(X-a[i][0])*m[i-1]/(h[i]*h[i])+(X-a[i-1][0])*(X-a[i-1][0])*(X-a[i][0])*m[i]/(h[i]*h[i]);printf("s(%f)=%f\n",X,s);}}数值计算:已知y=f(x)的如下数值求三次样条插值函数S(x),满足条件1.s’(0)=0,s’(4)=482.s’’(0)=0,s’’(4)=24Please input X:2.5Please input x:0 1 2 3 4 Please input y:-8 -7 0 19 56(1)已知边界条件1(2)已知边界条件2请选择边界条件的序号:1请输入y0和yn的一阶导:0 48 0.0000003.00000012.00000027.00000048.000000s(2.500000)=7.625000press any key tocontinue请选择边界条件的序号:2请输入y0和yn的二阶导:0 24 -0.0000003.00000011.99999927.00000248.0000007.625000press any key tocontinue s(2.500000)=7.625000 对计算结果进行评价分析:()()443845h M x S x f ≤-三次样条插值函数与三次Hermite 插值函数相比,不仅光滑度有提高,而且要求求解时还不需要增加内节点处的导数值,因此比较实用。
数值分析实验报告-插值、三次样条
实验报告:牛顿差值多项式&三次样条问题:在区间[-1,1]上分别取n=10、20用两组等距节点对龙格函数21()25f x x作多项式插值及三次样条插值,对每个n 值,分别画出插值函数及()f x 的图形。
实验目的:通过编程实现牛顿插值方法和三次样条方法,加深对多项式插值的理解。
应用所编程序解决实际算例。
实验要求:1. 认真分析问题,深刻理解相关理论知识并能熟练应用; 2. 编写相关程序并进行实验; 3. 调试程序,得到最终结果; 4. 分析解释实验结果; 5. 按照要求完成实验报告。
实验原理:详见《数值分析 第5版》第二章相关内容。
实验内容:(1)牛顿插值多项式1.1 当n=10时:在Matlab 下编写代码完成计算和画图。
结果如下:代码:clear allclcx1=-1:0.2:1;y1=1./(1+25.*x1.^2);n=length(x1);f=y1(:);for j=2:nfor i=n:-1:jf(i)=(f(i)-f(i-1))/(x1(i)-x1(i-j+1));endendsyms F x p;F(1)=1;p(1)=y1(1);for i=2:nF(i)=F(i-1)*(x-x1(i-1));p(i)=f(i)*F(i);endsyms PP=sum(p);P10=vpa(expand(P),5);x0=-1:0.001:1;y0=subs(P,x,x0);y2=subs(1/(1+25*x^2),x,x0);plot(x0,y0,x0,y2)grid onxlabel('x')ylabel('y')P10即我们所求的牛顿插值多项式,其结果为:P10(x)=-220.94*x^10+494.91*x^8-9.5065e-14*x^7-381.43*x^6-8.504e-14*x^5+123.36* x^4+2.0202e-14*x^3-16.855*x^2-6.6594e-16*x+1.0并且这里也能得到该牛顿插值多项式的在[-1,1]上的图形,并和原函数进行对比(见Fig.1)。
实验报告-插值法
实验报告-插值法计算机上机实验报告专业和班级姓名成绩学号课程名称数值计算⽅法实验名称插值法实验⽬的和要求实验⽬的1、掌握⽤MATLAB计算拉格朗⽇、分段线性、三次样条三种插值的⽅法,改变节点的数⽬,对三种插值结果进⾏初步分析。
2、掌握⽤MAT L AB作线性最⼩⼆乘的⽅法。
3、通过实例学习如何⽤插值⽅法与拟合⽅法解决实际问题,注意⼆者的联系和区别。
实验内容和步骤实验的主要内容1、编制拉格朗⽇、⽜顿插值程序,并运⾏⼀个简单的实例。
(1)拉格朗⽇插值程序:function v=polyinterp(x,y,u)n=length(x);v=zeros(size(u));for k=1:nw=ones(size(u));for j=[1:k-1 k+1:n]w=(u-x(j))./(x(k)-x(j)).*w;endv=v+w*y(k);end实例:当x=144,169,225时,y=12,13,15,⽤拉格朗⽇差值法求根号175。
如下:(2)⽜顿插值程序:function y=newinterp(X,Y,x)% ⽜顿插值函数m=length(X);for k=2:mfor j=1:k-1Y(k)= (Y(k)- Y(j))/(X(k)-X(j));endendy=Y(m);for j=m-1:-1:1y=y.*(x-X(j))+Y(j);end实例:当x=144,169,225时,y=12,13,15,⽤⽜顿差值法求根号175。
如下:2、给定函数xxf=)(,已知:414214.1.)0.2(=f449138.1.)1.2(=f483240.1.)2.2(=f516575.1.)3.2(=f549193.1.)4.2(=f⽤⽜顿插值法求4次Newton插值多项式在2.15处的值,以此作为函3.选择函数y=exp(-x2) (-2≤x≤2),在n个节点上(n不要太⼤,如5~11)⽤拉格朗⽇、分段线性、三次样条三种插值⽅法,计算m 个插值点的函数值(m要适中,如50~100)。
第二类边界条件三次样条插值实验报告
数值计算实验—实验报告2一、实验项目:第二类边界条件三次样条插值二、实验目的和要求a.通过本实验深入地理解三次样条插值多项式的基本原理b.通过数值算例更好的领会三次样条插值多项式具有较高的准确性三、实验内容1.用调试好的程序解决如下问题:点中点处的函数值,并将计算结果与sinx在相应点的数值相比较。
n=8;p1=0.4794;pn=0.9463;u=[0.6,0.8,1.0,1.2,1.4,1.6,1.8];p=7;x=[0.5,0.7,0.9,1.1,1.3,1.5,1.7,1.9];y=[0.4794,0.6442,0.7833,0.8912,0.9636,0.9975,0.9917,0.9463];for i=1:n-1h(i)=x(i+1)-x(i);enda2(1)=1;g(1)=3*(y(2)-y(1))/h(1)-p1*h(1)/2;for k=2:n-1a1(k-1)=h(k)/(h(k)+h(k-1));a2(k)=h(k-1)/(h(k)+h(k-1));g(k)=3*a2(k)*(y(k+1)-y(k))/h(k)+3*a1(k-1)*(y(k)-y(k-1))/h(k-1); enda1(n-1)=1;g(n)=3*(y(n)-y(n-1))/h(n-1)+pn * h(n-1)/2;%追赶法求三转角方程b1(1)=2;m(1)=g(1)/2;b2(1)=a2(1)/b1(1);for i=2:nb1(i)=2-a1(i-1)*b2(i-1);if(i~=n)b2(i)=a2(i)/b1(i);endm(i)=(g(i)-a1(i-1)*m(i-1))/b1(i);endfor i=n-1:-1:1m(i)=m(i)-b2(i)*m(i+1);endfor j=1:pfor i=1:nif((u(j)>=x(i))&&(u(j)<x(i+1)))k=i;break;endends(j)=0;s(j)=s(j)+(h(k)+2*(u(j)-x(k)))*(u(j)-x(k+1))^2*y(k)/(h(k))^3;s(j)=s(j)+(h(k)-2*(u(j)-x(k+1)))*(u(j)-x(k))^2*y(k+1)/(h(k))^3;s(j)=s(j)+(u(j)-x(k))*(u(j)-x(k+1))^2*m(k)/(h(k))^2;s(j)=s(j)+(u(j)-x(k+1))*(u(j)-x(k))^2*m(k+1)/(h(k))^2;end(2).运行结果3. 根据Lagrange插值多项式基本原理编制程序,并计算下面的数值算例:=-5+kh,其中h=10/n,n=10,20,40.给定函数f(x)=1/(1+x^2)(-5≤x≤5),取等距节点xk边界条件为S''(x0)=f''(x0),S''(x n)=f''(x n).用上述算法计算S10(x),S20(x), S40(x),并与函数f(x)以及10次Lagrange插值多项式L10(x)在给定点处的函数值进行比较。
数值分析第一次实验报告
数值分析上机实验报告题目:插值法学生姓名学院名称计算机学院专业计算机科学与技术时间一. 实验目的1、掌握三种插值方法:牛顿多项式插值,三次样条插值,拉格朗日插值2、学会matlab提供的插值函数的使用方法二.实验内容1、已知函数在下列各点的值为试用4次牛顿插值多项式P4(x)及三次样条函数S(x)(自然边界条件)对数据进行插值。
用图给出{(x i,y i),x i=0.2+0.08i,i=0,1,11,10},P4(x)及S(x)。
2、在区间[-1,1]上分别取n=10,20用两组等距节点对龙格函数f(x)=1/(1+25x2)作多项式插值及三次样条插值,对每个n值,分别画出插值函数及f(x)的图形。
3、下列数据点的插值可以得到平方根函数的近似,在区间[0,64]上作图。
(1)用这9个点作8次多项式插值L8(x)(2)用三次样条(第一边界条件)程序求S(x)从得到结果看在[0,64]上,哪个插值更精确,在区间[0,1]上。
两种插值哪个更精确?三.实现方法1. 进入matlab开发环境2. 依据算法编写代码3. 调试程序4. 运行程序5. (1)牛顿插值多项式:P n=f(x0)+f[x0,x1](x-x0)+f[x0,x1,x2](x-x0)(x-x1)+…+f[x0,x1,…,x n] (x-x0)(x-x n-1)三次样条插值:用三次样条插值函数由题目分析知,要求各点的M值:6.实验代码如下:(1)牛顿插值多项式程序:function varargout=newton(varargin)clear,clcx=[0.2 0.4 0.6 0.8 1.0]; fx=[0.98 0.92 0.81 0.64 0.38]; newtonchzh(x,fx);function newtonchzh(x,fx)n=length(x);FF=ones(n,n); FF(:,1)=fx';for i=2:nfor j=i:nFF(j,i)=(FF(j,i-1)-FF(j-1,i-1))/(x(j)-x(j-i+1));endendfor i=1:nfprintf('%4.2f',x(i)); for j=1:ifprintf('%10.5f',FF(i,j)); endfprintf('\n');end三次样条插值程序:function sanciyangtiao(n,s,t)x=[0.2 0.4 0.6 0.8 1.0];y=[0.98 0.92 0.81 0.64 0.38];n=5for j=1:1:n-1h(j)=x(j+1)-x(j);endfor j=2:1:n-1r(j)=h(j)/(h(j)+h(j-1));endfor j=1:1:n-1u(j)=1-r(j);endfor j=1:1:n-1f(j)=(y(j+1)-y(j))/h(j);endfor j=2:1:n-1d(j)=6*(f(j)-f(j-1))/(h(j-1)+h(j));endd(1)=0d(n)=0a=zeros(n,n);for j=1:1:na(j,j)=2;endr(1)=0;u(n)=0;for j=1:1:n-1a(j+1,j)=u(j+1);a(j,j+1)=r(j);endb=inv(a)m=b*d'p=zeros(n-1,4);for j=1:1:n-1p(j,1)=m(j)/(6*h(j));p(j,2)=m(j+1)/(6*h(j));p(j,3)=(y(j)-m(j)*(h(j)^2/6))/h(j);p(j,4)=(y(j+1)-m(j+1)*(h(j)^2/6))/h(j);endend图程序:x=[0.2 0.4 0.6 0.8 1.0];y=[0.98 0.92 0.81 0.64 0.38];plot(x,y)hold onfor i=1:1:5y(i)=0.98-0.3*(x(i)-0.2)-0.62500*(x(i)-0.2)*(x(i)-0.4)-0.20833*(x(i)-0.2)*(x(i)-0.4)*(x(i)-0.6)-0.52083*(x(i)-0.2)*(x(i)-0.4)*(x(i)-0.6)*(x(i)-0.8)endk=[0 1 10 11]x0=0.2+0.08*kfor i=1:1:4y0(i)=0.98-0.3*(x(i)-0.2)-0.62500*(x(i)-0.2)*(x(i)-0.4)-0.20833*(x(i)-0.2)*(x(i)-0.4)*(x(i)-0.6)-0.52083*(x(i)-0.2)*(x(i)-0.4)*(x(i)-0.6)*(x(i)-0.8)endplot( x0,y0,'o',x0,y0 )hold ony1=spline(x,y,x0)plot(x0,y1,'o')hold ons=csape(x,y,'variational')fnplt(s,'r')hold ongtext('Èý´ÎÑùÌõ×ÔÈ»±ß½ç')gtext('Ô-ͼÏñ')gtext('4´ÎÅ£¶Ù²åÖµ')(2)多项式插值程序:function [C,D]=longge(X,Y)n=length(X);D=zeros(n,n)D(:,1)=Y'for j=2:nfor k=j:nD(k,j)=(D(k,j-1)- D(k-1,j-1))/(X(k)-X(k-j+1));endendC=D(n,n);for k=(n-1):-1:1C=conv(C,poly(X(k)))m=length(C);C(m)= C(m)+D(k,k);endend三次样条插值程序:function S=longgesanci(X,Y,dx0,dxn)N=length(X)-1;H=diff(X);D=diff(Y)./H;A=H(2:N-1);B=2*(H(1:N-1)+H(2:N));C=H(2:N);U=6*diff(D);B(1)=B(1)-H(1)/2;U(1)=U(1)-3*(D(1));B(N-1)=B(N-1)-H(N)/2;U(N-1)=U(N-1)-3*(-D(N));for k=2:N-1temp=A(k-1)/B(k-1);B(k)=B(k)-temp*C(k-1);U(k)=U(k)-temp*U(k-1);endM(N)=U(N-1)/B(N-1);for k=N-2:-1:1M(k+1)=(U(k)-C(k)*M(k+2))/B(k);endM(1)=3*(D(1)-dx0)/H(1)-M(2)/2;M(N+1)=3*(dxn-D(N))/H(N)-M(N)/2;for k=0:N-1S(k+1,1)=(M(k+2)-M(k+1))/(6*H(k+1));S(k+1,2)=M(k+1)/2;S(k+1,3)=D(k+1)-H(k+1)*(2*M(k+1)+M(k+2))/6; S(k+1,4)=Y(k+1);endend(3)三次样条函数程序代码:function sanci3(n,s,t)y=[0 1 2 3 4 5 6 7 8];x=[0 1 4 9 16 25 36 49 64];n=9for j=1:1:n-1h(j)=x(j+1)-x(j);endfor j=2:1:n-1r(j)=h(j)/(h(j)+h(j-1));endfor j=1:1:n-1u(j)=1-r(j);endfor j=1:1:n-1f(j)=(y(j+1)-y(j))/h(j);endfor j=2:1:n-1d(j)=6*(f(j)-f(j-1))/(h(j-1)+h(j));endd(1)=0d(n)=0a=zeros(n,n);for j=1:1:na(j,j)=2;endr(1)=0;u(n)=0;for j=1:1:n-1a(j+1,j)=u(j+1);a(j,j+1)=r(j);endb=inv(a) m=b*d' t=ap=zeros(n-1,4);p(j,1)=m(j)/(6*h(j));p(j,2)=m(j+1)/(6*h(j));p(j,3)=(y(j)-m(j)*(h(j)^2/6))/h(j);p(j,4)=(y(j+1)-m(j+1)*(h(j)^2/6))/h(j); end拉格朗日插值程序:function y=lagrange(x0,y0,x)n=length(x0);m=length(x);for i=1:mz=x(i);s=0.0;for k=1:np=1.0;for j=1:nif j~=kp=p*(z-x0(j))/(x0(k)-x0(j));endends=p*y0(k)+s;endy(i)=s;endend四.实验结果1.牛顿插值多项式结果:所以有四次插值牛顿多项式为: P4(x)=0.98-0.3(x-0.2)-0.62500(x-0.2)(x-0.4)-0.20833(x-0.2)(x-0.4)(x-0.6)-0.52083(x-0.2)(x-0.4)(x-0.6)(x-0.8)三次样条插值结果:得到m=(0 -1.6071 -1.0714 -3.1071 0),则可得:图形为:2.多项式插值,n=10时:n=20时:三次样条插值,n=10时:n=20时:3.三次样条插值程序结果:解得:M0=0;M1=-0.5209;M2=0.0558;M3=-0.0261;M4=0.0006;M5=-0.0029;M6=-0.0008;M7=--0.0009;M8=0;则三次样条函数:图形:[0,64]:在区间[0,64]上从图3-2中可以看出蓝色虚线条和绿色线条是几乎重合的,而红色线条在[30,70]之间有很大的起伏,所在在区间[0,64]三次样条插值更精确。
关于三次样条插值函数的学习报告
关于三次样条插值函数的学习报告三次样条插值函数是一种常用的插值方法,它利用多项式函数的特性来逼近一组数据点,并且具有较高的精度和平滑性。
本学习报告将对三次样条插值函数进行详细介绍,并探讨其在实际应用中的优缺点。
首先,三次样条插值函数的数学表达式可以表示为:S(x) = \sum_{i=0}^n {a_i(x-x_i)^3 + b_i(x-x_i)^2 + c_i(x-x_i) + d_i}其中,n是数据点的数量,a_i、b_i、c_i、d_i是通过求解一系列方程得到的系数。
这些方程的目标是使得插值函数在每个数据点之间的一阶和二阶导数连续。
对于每个区间[x_i,x_{i+1}],我们可以得到一个关于未知系数a_i、b_i、c_i、d_i的线性方程组。
通过求解这些方程组,我们可以确定插值函数在每个区间的系数。
最终,我们得到一个全局的三次插值函数,它在整个插值区域内都具有较高的拟合精度。
三次样条插值函数的优点之一是它可以通过调整插值区间的数量来灵活控制插值的精度。
当插值区间数量增加时,插值函数与原始数据点之间的误差会减小,从而获得更精确的插值结果。
另外,三次样条插值函数还具有较好的平滑性,能够克服其他插值方法中可能出现的震荡现象,使得插值函数更加平滑。
然而,三次样条插值函数也存在一些缺点。
首先,它对于数据点分布较为密集的情况下,有时会出现振荡现象,导致插值函数不够平滑。
其次,三次样条插值函数在插值区间的两个端点附近可能无法很好地逼近原始数据。
这是因为在每个区间的端点处,插值函数需要满足特定的边界条件,通常是一阶或二阶导数为零。
这种约束可能导致插值函数在端点处的拟合程度较低。
为了解决上述问题,可以使用更高阶的样条插值函数,如五次样条插值函数。
五次样条插值函数通过增加插值函数的阶数,以获取更高的拟合精度和平滑性。
此外,还可以尝试使用其他插值方法,如非均匀插值、基函数插值等,以应对不同的插值需求。
总结来说,三次样条插值函数是一种精度较高且平滑的插值方法,具有较好的数学属性。
三次样条插值实验报告
x1=0:.01:1;y1=polyval(S1(1,:),x1-X(1)); x2=1:.01:2;y2=polyval(S1(2,:),x2-X(2)); x3=2:.01:3;y3=polyval(S1(3,:),x3-X(3)); x4=3:.01:4;y4=polyval(S1(4,:),x4-X(4)); x5=4:.01:5;y5=polyval(S1(5,:),x5-X(5)); x6=5:.01:6;y6=polyval(S1(6,:),x6-X(6)); >> plot(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6,X,Y,'.') >> hold on >> x1=0:.01:1;y1=polyval(S2(1,:),x1-X(1)); x2=1:.01:2;y2=polyval(S2(2,:),x2-X(2)); x3=2:.01:3;y3=polyval(S2(3,:),x3-X(3)); x4=3:.01:4;y4=polyval(S2(4,:),x4-X(4)); x5=4:.01:5;y5=polyval(S2(5,:),x5-X(5)); x6=5:.01:6;y6=polyval(S2(6,:),x6-X(6)); >> plot(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6,X,Y,'.') >> hold on >> x1=0:.01:1;y1=polyval(S3(1,:),x1-X(1)); x2=1:.01:2;y2=polyval(S3(2,:),x2-X(2)); x3=2:.01:3;y3=polyval(S3(3,:),x3-X(3)); x4=3:.01:4;y4=polyval(S3(4,:),x4-X(4)); x5=4:.01:5;y5=polyval(S3(5,:),x5-X(5)); x6=5:.01:6;y6=polyval(S3(6,:),x6-X(6)); >> plot(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6,X,Y,'.')
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告:牛顿差值多项式&三次样条
问题:在区间[-1,1]上分别取n=10、20用两组等距节点对龙格函数2
1()25f x x 作多项式插值及三次样条插值,对每个n 值,分别画出插值函数及()f x 的图形。
实验目的:通过编程实现牛顿插值方法和三次样条方法,加深对多项式插值的理解。
应用所编程序解决实际算例。
实验要求:
1. 认真分析问题,深刻理解相关理论知识并能熟练应用;
2. 编写相关程序并进行实验;
3. 调试程序,得到最终结果;
4. 分析解释实验结果;
5. 按照要求完成实验报告。
实验原理:
详见《数值分析 第5版》第二章相关内容。
实验内容:
(1)牛顿插值多项式
1.1 当n=10时:
在Matlab 下编写代码完成计算和画图。
结果如下:
代码:
clear all
clc
x1=-1:0.2:1;
y1=1./(1+25.*x1.^2);
n=length(x1);
f=y1(:);
for j=2:n
for i=n:-1:j
f(i)=(f(i)-f(i-1))/(x1(i)-x1(i-j+1));
end
end
syms F x p ;
F(1)=1;p(1)=y1(1);
for i=2:n
F(i)=F(i-1)*(x-x1(i-1));
p(i)=f(i)*F(i);
end
syms P
P=sum(p);
P10=vpa(expand(P),5);
x0=-1:0.001:1;
y0=subs(P,x,x0);
y2=subs(1/(1+25*x^2),x,x0);
plot(x0,y0,x0,y2)
grid on
xlabel('x')
ylabel('y')
P10即我们所求的牛顿插值多项式,其结果为:P10(x)=-220.94*x^10+494.91*x^8-9.5065e-14*x^7-381.43*x^6-8.504e-14*x^5+123.36*x^4+2.0202e-1 4*x^3-16.855*x^2-6.6594e-16*x+1.0
并且这里也能得到该牛顿插值多项式的在[-1,1]上的图形,并和原函数进行对比(见Fig.1)。
Fig.1 牛顿插值多项式(n=10)函数和原函数图形
从图形中我们可以明显的观察出插值函数在两端点处发生了剧烈的波动,产生了极大的误差,即龙格现象,当n=20时,这一现象将更加明显。
1.2 当n=20时:
对n=10的代码进行修改就可以得到n=20时的代码。
将“x1=-1:0.2:1;”改为“x1=-1:0.1:1;”即可。
运行程序,我们得到n=20时的牛顿插值多项式,结果为:P20(x)= 260188.0*x^20 - 1.0121e6*x^18 + 2.6193e-12*x^17 + 1.6392e6*x^16 + 2.248e-11*x^15 - 1.4429e6*x^14 - 4.6331e-11*x^13 + 757299.0*x^12 + 1.7687e-11*x^11 - 245255.0*x^10 + 2.1019e-11*x^9 + 49318.0*x^8 + 3.5903e-12*x^7 - 6119.2*x^6 - 1.5935e-12*x^5 + 470.85*x^4 + 1.3597e-14*x^3 - 24.143*x^2 - 1.738e-14*x + 1.0
同样的,这里得到了该牛顿插值多项式的在[-1,1]上的图形,并和原函数进行对比(见Fig.2)。
Fig.2牛顿插值多项式(n=20)函数和原函数图形
当n=20时,端点处发生了更加剧烈的震荡。
表明随着分段不断增加,牛顿插值多项式与原函数的误差不但没有减少,反而变得更大了。
(2)三次样条
2.1 当n=10时:
在Matlab下编写代码完成计算和画图。
结果如下:
代码:
clear all
clc
x1=-1:0.2:1;
y1=1./(1+25.*x1.^2);
syms x
m1=subs(diff(1/(1+25*x^2)),-1);
m2=subs(diff(1/(1+25*x^2)),1);
n=length(x1);
syms a b h f d
for i=1:n-1
h(i)=x1(i+1)-x1(i);
f(i)=(y1(i+1)-y1(i))/(x1(i+1)-x1(i));
end
a(n)=1;
b(1)=1;
for i=2:n-1
a(i)=h(i-1)/(h(i-1)+h(i));
b(i)=h(i)/(h(i-1)+h(i));
end
d(1)=6/h(1)*(f(1)-m1);
d(n)=6/h(n-1)*(m2-f(n-1));
for i=2:n-1
d(i)=6*(f(i)-f(i-1))/(h(i-1)+h(i));
end
D=d';
A=2.*eye(n);
for i=1:n-1
A(i,i+1)=b(i);
A(i+1,i)=a(i+1);
end
M=A^-1*D;
for i=1:n-1
s(i)=M(i)*(x1(i+1)-x)^3/h(i)/6+M(i+1)*(x-x1(i))^3/h(i)/6+(y1(i)-M(i)* h(i)^2/6)*(x1(i+1)-x)/h(i)+(y1(i+1)-M(i+1)*h(i)^2/6)*(x-x1(i))/h(i); end
S=vpa(expand(s.'),5);
for i=1:n-1
x0=-1-(2/(n-1))+(2/(n-1))*i:0.001:-1+(2/(n-1))*i;
y0=subs(s(i),x,x0);
plot(x0,y0)
hold on
end
y2=subs(1/(1+25*x^2),x,-1:0.001:1);
plot(-1:0.001:1,y2,'r')
grid on
xlabel('x')
ylabel('y')
S即为我们所求的三次样条,其结果为:
S10(x) =
0.08225*x^3+0.36953*x^2+0.56627*x+0.31745 [-1,-0.8]
0.96279*x^3+2.4828*x^2+2.2569*x+0.76829 [-0.8,-0.6]
0.81773*x^3+2.2217*x^2+2.1002*x+0.73696 [-0.6,-0.4]
13.413*x^3+17.336*x^2+8.1461*x+1.5431 [-0.4,-0.2]
-54.471*x^3-23.394*x^2-1.8741e-17*x+1.0 [-0.2,0]
54.471*x^3-23.394*x^2+1.9683e-17*x+1.0 [0,0.2]
-13.413*x^3+17.336*x^2-8.1461*x+1.5431 [0.2,0.4]
-0.81773*x^3+2.2217*x^2-2.1002*x+0.73696 [0.4,0.6]
-0.96279*x^3+2.4828*x^2-2.2569*x+0.76829 [0.6,0.8]
-0.08225*x^3+0.36953*x^2-0.56627*x+0.31745 [0.8,1] 并且这里可以得到该三次样条的在[-1,1]上的图形,并和原函数进行对比(见Fig.3)。