三次样条插值实验报告
- 格式:docx
- 大小:276.33 KB
- 文档页数:9
实验报告:牛顿差值多项式&三次样条问题:在区间[-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)。
实验目的:学会运用三次样条函数进行函数插值实验内容:给定插值条件如下:i 0 1 2 3 4 5 6 7X i8.125 8.4 9.0 9.485 9.6 9.959 10.166 10.2 Y i0.0774 0.099 0.280 0.60 0.708 1.200 1.800 2.177 作三次样条函数插值,取第一类边界条件Y0’=0.01087 Y7’=1001.画出插值曲线的图像。
程序如下:%将插值点的坐标值输入matlabx=[8.125 8.4 9.0 9.485 9.6 9.959 10.166 10.2];y=[0.0774 0.099 0.280 0.60 0.708 1.200 1.800 2.177];%调用三次样条函数,并给出第一类边界条件即 Y0’=0.01087 Y7’=100 cs = spline(x,[0.01087 y 100]);%给定x(0)到x(7)之间的作图点数,即1000xx=linspace(8.125,10.2,1000);%绘制图像plot(x,y,'o',xx,ppval(cs,xx),'-')grid on插值曲线:2.逆时针旋转座标轴45o保持(1.)中结点和边界条件的几何关系不变,再次作三次样条函数插值,画出插值曲线的图像。
程序如下:x=[8.125 8.4 9.0 9.485 9.6 9.959 10.166 10.2];y=[0.0774 0.099 0.280 0.60 0.708 1.200 1.800 2.177];%用坐标转换求出坐标轴旋转45度后插值点新的坐标值x1=x*cos(pi/4)+y*sin(pi/4);y1=-x*cos(pi/4)+y*sin(pi/4);%求出坐标轴转换后新的边界值Y0=(0.01087-1)/(0.01087+1);Y7=(100-1)/(100+1);cs = spline(x1,[Y0 y1 Y7]);xx=linspace(x1(1),x1(8),1000);plot(x1,y1,'o',xx,ppval(cs,xx),'-')grid on其中在求解边界条件用转换关系tan(45)θ-,θ为在原图像中边界点的切线与原x坐标轴的夹角差值曲线:。
Lab03.三次样条插值实验【实验目的和要求】1.使学生深入理解三次样条插值法,深入进行程序设计能力训练;2.对第一与第二种边界条件,按三弯矩法,通过用Matlab 语言设计计算三次样条插值的程序,以提高学生程序设计的能力。
【实验内容】1.根据Matlab 语言特点,描述三次样条插值法。
2.对第一与第二种边界条件,按三弯矩法,用Matlab 语言设计计算三次样条插值的程序。
3对(1) 自然边界条件0)0.1()2.0(=''=''S S ;(2) 第一种边界条件55741.1)0.1( ,20271.0)2.0(='='S S . 输出用追赶法解出的弯矩向量),,(521M M M 和)1.02.0(i S + (i =0,1,…,8)的值,并画出)(x S y =的图形。
4.完成教材P45例8的计算,并将计算结果与Langrage 插值法计算的结果进行比较,由此说明三次样条插值的优越性。
【实验仪器与软件】1.CPU 主频在1GHz 以上,内存在128Mb 以上的PC ;2.Matlab 6.0及以上版本。
实验讲评:实验成绩:评阅教师:2011 年 月 日Lab03.三次样条插值实验一、算法描述1.根据Matlab语言特点,描述三次样条插值法.答:S(x) 在[x j, x j+1](j=1,2,⋯,n-1)上是三次多项式,于是S"(x)在[x j, x j+1] 上是一次多项式,如果S"(x) 在[x j,x j+1](j=1,2,⋯,n-1)两端点上的值已知,设S"(x j)=M j,S"(x j+1)=M j+1,则S"(x) 的表达式为:= ,其中h j =x j+1-x j,对S"(x) 进行两次积分,则得到1 个具有2二、程序设计2.对第一与第二种边界条件,按三弯矩法,用Matlab语言设计计算三次样条插值的程序。
三次样条插值的数值实验姓名: 王维滨 学号:0842011157 姓名: 李佳乐 学号:0842011034 姓名: 谢朝 学号:0842011062 姓名: 杨其荣 学号:08420110721.实验项目的性质和任务对三次样条插值进一步理解,并编写matlab 程序,实现这些功能2.算法设计和matlab 编程。
总前提:x i 第i 点的横坐标i y 第i 点的纵坐标i M ,,s 的记号,,,,,,23()()()()()()()2!3!i i i i i i i s x s x s x y s x x x x x x x =+-+-+- 有数值逼近书上的推导,我们令:111i i i i i x x u x x -+--=-,111i i i i i x x x x λ++--=-,11111111f (,,)i i i i i i i i i i i i i y y y y x x x x x x x x x +-+--++------=- 由于未知数的数目多于方程的个数,我们需要增加两个条件才能唯一确定一个分段三次函数1)D1的三次样条插值a .实验方案与原理:我们加上条件:,,,,11()(),()()n n s x f x s x f x ==我们建立三弯矩方程组:1211211111126(,,)26(,,),2,3.....126(,,)i i i i i i i i n n n n n M M f x x x u M M M f x x x i n M M f x x x λ-+-+--+=⎧⎪++==-⎨⎪+=⎩然后采用追赶法迭代求方程组,但是我们在程序中采用简单的方法(矩阵计算)直接求解降低编程难度,2)D2三次样条插值223123211i 11112111126(,,)26(,,),3,4.....226(,,)i i i i i i i n n n n n n n n M M f x x x u M u M M M f x x x i n u M M f x x x M λλλ-+-+----+-+=-⎧⎪++==-⎨⎪++=-⎩3)D3三次样条插值22321231i 111211126(,,)26(,,),3,4.....126(,,)n i i i i i i i n n n n n n n M M u M f x x x u M M M f x x x i n M u M M f x x x λλλ-+-+--+++=⎧⎪++==-⎨⎪++=⎩b .编写程序:见附录调用test,每次显示一个图像,关闭后按回车继续显示下一幅。
关于三次样条插值函数的学习报告三次样条插值函数是一种广泛应用于数值分析领域的插值方法,用于逼近一组已知数据点构成的函数。
在这篇学习报告中,我将介绍三次样条插值函数的定义、原理、应用及其优缺点,并通过实际例子说明其如何在实际问题中使用。
一、三次样条插值函数的定义三次样条插值函数是指用分段三次多项式对一组已知数据点进行插值的方法。
具体来说,对于已知数据点$(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)。
关于三次样条插值的教学研究摘要:三次样条插值是一种常用的数据拟合方法,可以在数据点之间建立平滑的曲线。
本研究旨在探讨三次样条插值的教学方法和效果。
通过案例分析和实验研究,我们发现三次样条插值的教学可以通过让学生理解插值原理、掌握插值算法和应用样条插值进行实际问题的求解等多方面的方法来实现。
此外,我们还分析了教学评价问题,并提出了提高三次样条插值教学质量的建议。
关键词:三次样条插值、教学、案例分析、实验研究、教学评价。
正文:引言三次样条插值是一种常用的数据拟合方法,它可以在数据点之间建立平滑的曲线。
这种方法广泛应用于数学、物理、工程等领域中的数据处理和分析。
因此,三次样条插值的教学需要让学生掌握它的原理和算法,并能够应用它解决实际问题。
本研究旨在探讨三次样条插值的教学方法和效果。
一、案例分析我们收集了一些案例,旨在通过实际应用的方式帮助学生理解三次样条插值的原理和算法。
例如,我们可以让学生通过拟合已知数据点,建立一个目标函数来预测未知数据点的取值。
通过这样的案例,学生可以掌握插值算法以及插值方法的优缺点等。
二、实验研究在教学过程中,我们进行了实验研究,旨在评估学生对三次样条插值的学习效果和应用情况。
我们利用实验数据、模拟数据和真实数据等,让学生自己编写程序来应用三次样条插值算法进行拟合和预测。
通过实验研究,我们发现学生的应用水平和创新能力都得到了提高,同时我们也发现了一些教学方法上的问题和改进点。
三、教学评价问题在教学评价方面,我们注意到学生的评价可能受到误导或者缺乏意义。
例如,学生可能会过于关注算法的细节而忽略了方法的实际应用,或者过于依赖某一种插值方法而缺乏对多种插值方法的比较和评价。
因此,我们需要引导学生关注实际应用和方法评价等方面。
结论与建议通过案例分析和实验研究,我们认为三次样条插值的教学可以通过多种方法来实现,包括让学生理解插值原理、掌握插值算法和应用样条插值进行实际问题的求解等。
同时,我们也发现了一些教学评价问题,并提出了一些建议,希望能够提高三次样条插值教学的质量。
数值计算实验—实验报告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)在给定点处的函数值进行比较。
实验7 代数插值实验-(2)实验类型:●验证性实验 ○综合性实验 ○设计性实验实验目的:进一步熟练掌握spline(样条)插值算法,提高编程能力和解决插值问题的实践技能。
实验内容:编写程序用计算机求解三次压紧样条曲线,经过点(0,0.0),(1,0.5),(2,2.0)和(3,1.5),而且一阶导数边界条件S ’(0)=0.2和S ’(3)=-1实验原理 若已知N+1个点的{}N k k k y x 0),(=及其一阶导数的边界条件S ’(a)=0d 和S ’(b)=N d ,则存在唯一的三次样条曲线。
构造并求解下列线性方程组01112100111122211113(2)3('())22()(2,3,,2)3(2)3('())2k k k k k k k k N N N N N N N N h h m h m u d S x h m h h m h m u k N h m h h m u S x d ---+-------⎧++=--⎪⎪+++==-⎨⎪⎪++=--⎩ 构造分段函数S(x):23,0,1,2,31()()()()()[,]k k k k k k k k k k S x S x s s x x s x x s x x x x x +==+-+-+-∈ k k y s =0, ; 6)2(11,++-=k k k k k m m h d s ; 22,k k m s = ; kk k k h m m s 613,-=+ 实验说明 需要建立两个数组X ,Y 分别存放(1x ,…,)n x ,(1y ,…,)n y ,建立两个变量dxo 、 dxn 分别存放左右端点的一阶导数 dxo = S'(x0) , dxn = S'(xn),上述方程组中10,1,,1k k k h x x k N +=-=- 其中;1()/0,1,,1k k k k d y y h k N +=-=- 16(),1,2,,1k k k u d d k N -=-=- 实验步骤1 要求上机实验前先编写出程序代码2 编辑录入程序3 调试程序并记录调试过程中出现的问题及修改程序的过程4 经反复调试后,运行程序并验证程序运行是否正确。
LAB03_三次样条插值实验实验内容1.用三次样条插值的三弯矩法,编制第一与第二种边界条件的程序.已知数据如下:求)(x f 的三次样条插值函数)(x S 满足: (1)自然边界条件''(0.2)''(1.0)0;S S ==(2)第一种边界条件.55741.1)0.1(',20271.0)2.0('==S S 要求输出用追赶法解出的弯矩向量(0M ,1M ,2M ,3M ,4M )及)1.02.0(i S +(i=0,1,2,3,4,5,6,7,8)的值.并画出)(x S y =的图形.实验原理简述我们先利用一阶导数)(x s ''在节点i x (i=1,2,…n-1)上的连 性以及边界条件,列出确定二阶导数)(i i x s M ''=(i=0,1,2,…n-1)的线性方程组(三弯矩方程),并由此解出i M 然后用i M 表达是)`(x s 即可i i i i i i g M M M =+++-112λμ(三弯矩方程) jj j i h h h +=--11μ,jj j i h h h +=-1λ, ,,,1,0n i =[][][]11111,,6,,6+---+=+-=j j j jj jj j j i x x xf h h x x f x x fg .其中有(1+n )个未知数n M M M ,...,10,而方程只有(n-1)个,当满足第一种边界条件时,可的另两个方程[]()010010,62f x x f h M M '-=+, []()n n n n n n x x f f h M M ,62111----'=+如果令[]()[]()n n n n n n x x f f h g f x x f h d ,6,1,,6,111010000---'=='-==μλ,将上述方程综合后的一下矩阵形式:222211110nn n μλμλμλ--nn M M M M 110- =n n g g g g 110-可以证明此方程组满足追赶法的条件,我们用追赶法可得M 的)1(+n 值,将其带入公式即得)(x s对第二种边界条件,直接的端点方程n n f M f M ''=''=,00并且令n n n f d f d ''=''===2,2,0000μλ,则又得三弯矩方程同理即可求得解。
关于三次样条插值函数的学习报告三次样条插值函数是一种常用的插值方法,它利用多项式函数的特性来逼近一组数据点,并且具有较高的精度和平滑性。
本学习报告将对三次样条插值函数进行详细介绍,并探讨其在实际应用中的优缺点。
首先,三次样条插值函数的数学表达式可以表示为: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的线性方程组。
通过求解这些方程组,我们可以确定插值函数在每个区间的系数。
最终,我们得到一个全局的三次插值函数,它在整个插值区域内都具有较高的拟合精度。
三次样条插值函数的优点之一是它可以通过调整插值区间的数量来灵活控制插值的精度。
当插值区间数量增加时,插值函数与原始数据点之间的误差会减小,从而获得更精确的插值结果。
另外,三次样条插值函数还具有较好的平滑性,能够克服其他插值方法中可能出现的震荡现象,使得插值函数更加平滑。
然而,三次样条插值函数也存在一些缺点。
首先,它对于数据点分布较为密集的情况下,有时会出现振荡现象,导致插值函数不够平滑。
其次,三次样条插值函数在插值区间的两个端点附近可能无法很好地逼近原始数据。
这是因为在每个区间的端点处,插值函数需要满足特定的边界条件,通常是一阶或二阶导数为零。
这种约束可能导致插值函数在端点处的拟合程度较低。
为了解决上述问题,可以使用更高阶的样条插值函数,如五次样条插值函数。
五次样条插值函数通过增加插值函数的阶数,以获取更高的拟合精度和平滑性。
此外,还可以尝试使用其他插值方法,如非均匀插值、基函数插值等,以应对不同的插值需求。
总结来说,三次样条插值函数是一种精度较高且平滑的插值方法,具有较好的数学属性。
数值逼近实习报告题目:三次样条插值II班级:计算111班学号:3110811009姓名:刘艳平指导老师:秦新强2013-3题目:三次样条插值(三转角算法) 姓名:刘艳平 学号:3110811009 一、目的意义以上我们讨论的分段线性插值,逼近程度虽然好,但光滑性差,分段三次Hermite 插值,逼近程度好,光滑性也有所提高,但也增加了更多的条件,不太实用。
接下来我们研究的三次样条插值多项式,这就结合二者的优点,即逼近程度虽然好,光滑性强,不需要增加太多的条件,很实用。
当已知区间两个端点的导数值时,既满足边界条件1,用三弯矩算法来求解,相对简单,且很准确。
二、数学公式⎪⎪⎩⎪⎪⎨⎧∈∈∈-],[),(............],[),(],[),(1212101n n nx x x x s x x x x s x x x x s 具体:iii i i ii i iii i i i ii i i i m h x x x x m h x x x x y h x x x x h y h x x x x h x s 22112213211321))(())(())]((2[))]((2[)(--------+--+---+--+=其中:n i x x x x x h i i i i i ,...,2,1],,[,11=∈-=-- i i i i y x s y x s ==--)(,)(11需要求出:ii i i m x s m xs ='='--)(,)(11三、计算流程 Step 1:输入节点n x x x ,...,,10,函数值ny y y ,...,,10,边界条件及x.Step 2:计算⎪⎪⎪⎩⎪⎪⎪⎨⎧+=+=-=+=-++++]),[],[(3111111i i i i i i i ii i ii i i i i x x f x x f g h h h h h h λμλμλStep 3:根据边界条件,求解相应的方程得到nm m m ,...,,10.Step 4:判断x 属于],[1i i x x -,i=1,2,...,n中的那一个.Step 5:计算)(x s y i ≈.Step 6:输出y. 四、代码#include <iostream.h> //三次样条三转角边界条件1 #include "process.h" #define N 2 #define M 4double a[N],d[N],c[N],p[N],q[N],b[N],xx[N]; void p_q() { int k; if(d[0]==0) {cout<<"Method failed"<<endl;exit(0);}p[0]=d[0];q[0]=c[0]/p[0];for(k=1;k<N-1;k++){p[k]=d[k]-a[k]*q[k-1];if(p[k]==0){cout<<"Method failed"<<endl; exit(0);}q[k]=c[k]/p[k];}p[N-1]=d[N-1]-a[N-1]*q[N-2]; if(p[N-1]==0){cout<<"Method failed"<<endl; exit(0);}}void jisuan(){int k;double y[N];y[0]=b[0]/p[0];for(k=1;k<=N-1;k++)y[k]=(b[k]-a[k]*y[k-1])/p[k];xx[N-1]=y[N-1];for(k=N-2;k>=0;k--)xx[k]=y[k]-q[k]*xx[k+1];for(k=0;k<N;k++)cout<<"m的值为:"<<xx[k]<<'\t'<<endl;}void main(){double X[M],Y[M],h[M],v[M],u[M],m[M],g[M],mm[M]; int i;double x,y1,y2,w1,w2,w3,w4,w,hh;cout<<"输入已知点的X坐标:"<<endl;for(i=0;i<M;i++)cin>>X[i];cout<<"输入已知点的Y坐标:"<<endl;for(i=0;i<M;i++)cin>>Y[i];cout<<"输入边界条件:"<<endl;cin>>y1>>y2;cout<<"输入需要计算的x值:"<<endl;cin>>x;for(i=1;i<M;i++){h[i]=X[i]-X[i-1];}for(i=1;i<M-1;i++){v[i]=h[i+1]/(h[i]+h[i+1]);u[i]=h[i]/(h[i]+h[i+1]);g[i]=3*((v[i]*(Y[i+1]-Y[i])/(X[i+1]-X[i]))+(u[i]*(Y[i]-Y[i-1])/(X[i]-X[i-1])));}a[0]=0;b[0]=g[1]-v[1]*y1;for(i=1;i<N;i++)a[i]=v[i+1];for(i=0;i<N;i++)d[i]=2;for(i=0;i<N;i++)c[i]=u[i+1];for(i=1;i<N;i++)b[i]=g[i+1];p_q();jisuan();mm[0]=y1;mm[1]=xx[0];mm[2]=xx[1];mm[3]=y2;for(i=1;i<M;i++){hh=X[i]-X[i-1];if(x>=X[i-1]){w1=((hh+(x-X[i-1])*2)*(x-X[i])*(x-X[i])*Y[i-1])/(hh*hh*hh);w2=((hh-(x-X[i])*2)*(x-X[i-1])*(x-X[i-1])*Y[i])/(hh*hh*hh);w3=((x-X[i-1])*(x-X[i])*(x-X[i])*mm[i-1])/(hh*hh);w4=((x-X[i])*(x-X[i-1])*(x-X[i-1])*mm[i])/(hh*hh);w=w1+w2+w3+w4;}}cout<<"x 点的结果为"<<w<<endl; }五、数值实例已知函数y=f(x),的如下数据,试求其在区间]3,0[上的三次样条插值函数S(x). X 0 1 2 3 Y0 1 0 1 y '1解:在此题中,解得:151,15421=-=m m其中:0,130==m m ,一起带入上边公式即可得到所求的三次样条函数如下⎪⎪⎪⎩⎪⎪⎪⎨⎧∈--+---=∈--+------=∈---+--=]3,2[,)3)(2(151)2)](3(21[)(]2,0[),2()1(151)2)(1(154)2)](1(21[)(]1,0[),1(154)1()]1(21[)(22322222221x x x x x x s x x x x x x x x s x x x x x x x x s 假设,求出x=1.5处的函数值为:0.458333 程序运行结果截图如下:六、对计算机结果进行分析评价三次样条插值函数与三次Hermite插值函数相比,不仅光滑度有提高,而且要求求解时还不需要增加内节点处的导数值,因此比较实用。
四、三次样条插值1. 样条函数插值的原理给定区间[a,b]上划分A:a=x<x<<x<x=b,若分段函数S(x)满足:01n-1n1.S(x)在各个子区间[x,x],i=0,1,,n-1上均为x的三次多项式;ii+12.S(x)在整个区间[a,b]上有直至二阶的连续导数。
则称S(x)为[a,b]上依次划分的三次样条函数,简称样条函数。
具体地有分段表达式:ax3+bx2+cx+d,x G[x,x]000001ax3+bx2+cx+d,x G[x,x]111112S(x)=\ax3+bx2+cx+d,x G[x,x](1)222223ax3+bx2+cx+d,x G[x,x]、°*n-1n—T•••n-1n-1n-1n共有4n个参数a,b,c,d,i=0,1,,n,它们在内节点处满足iiii'S(x)=S(x),…i-0i+0<S'(x)=S'(x),i=1,2,,n-1.(2)i-0i-0S''(x)=S''(x),Ji-0i+0满足样条函数定义的函数集合称为分划A上的三次样条函数空间,记为S(3,A),可以证明S(3,A)为线性空间。
若S(x)G S(3,A),且进一步满足插值条件S(x)=y=f(x),i=0,1,,n(3)iii其中y为节点x处的给定函数值(若被插函数了(x)已知;••则用了(x)代替之),iii则称S(x)为以x,x,,x,x为节点的三次样条函数。
01n-1n其中式(3)插值节点提供了n+1个约束条件;加上式(2)的3n-3个,合起来共有4n-2个;欲求4n个待定参数的唯一解;尚缺两个条件。
这两个条件一般由样条函数的边界条件提供。
常用三类边界条件;他们分别与三次样条函数;构成不同边界条件的样条函数插值问题。
2. 三类样条函数插值问题2.1第二类边界条件给定边界条件两端的一阶导数值:S'(x)=y'=m,S'(x)=y'=m000nnn这相当于样条两短处的方向给定(压铁在两端点的压力方向确定),对应的插值问题如下:对于分划A:a=x<x<<x<x=b,给定节点对应的函数值01n—1ny,y,y,,y,以及两端点处的一阶导数值y'=m,y'=m,求三次样条函数012n00nnS(x),使…f S(x)=y,i=0,1,,n2iiI S'(x)=m,S'(x)=mJ00n…n2.2第一类边界条件给定边界两端的二阶导数值:S''(x)=y''=M,S''(x)=y''=M000nnn这相当于在样条两端处外加一个力矩,使梁两端点处有相应的曲率。
三次样条插值实验报告专业班级学号姓名一、 实验内容和要求1、阅读上面的文字和程序,试运行,检验程序和上面叙述的正确性。
2、阅读上面的 MATLAB 程序;查资料,了解各 MATLAB 语句及命令。
3、画程序流程图,理解并描述算法。
4、修改上面的程序,能根据给定数据点,求(1)自然样条插值,边界 S ′′(a )=0, S ′′(b )=0 (2)第二类边界条件,S ′′(a )和S ′′(b )是确定的。
5、使用上面的程序,根据数据点(0,1),(1,0),(2,0),(3,1),(4,2), (5,2),和(6,1),求三种不同的三次样条插值,其中S ′(0)=−0.6,S ′(6)=-1.8,S ′′(0)=1,S ′′(6)=−1;S ′′(0),S ′′(6)=0.在同一坐标系中,画出这 3 个三次样条插值和这些数据点。
6、写实验报告(实验内容+算法描述+程序+写成分段函数的结果描述+截图)。
二、 算法说明定义:设有N+1个点 ,其中 。
如果存在N 个三次多项式 ,系数为 ,满足如下性质: (1)(2)01n a x x x b =<<<=()k S x 1[,],0,1,,1k k x x x k N +∈=-0[,]Nk k k x y =,0,1,2,3(),(),(),()k k k k S x S x S x S x 23,0,1,2,3()S ()()()()k k k k k k k k S x x s s x x s x x s x x ==+-+-+-()k k S x y =0,1,,k N =(3)则称函数 为三次样条函数。
因为是分段三次多项式,所以 在区间 上是分段线性的。
(1)用 代入上式,可得(2)将(2)式积分两次,会引入两个积分常数,并得到(3) 将 代入上(3),并使用 ,可分别得到包含的方程: (4)求解这两个方程,求出 ,而且将这些值代入方程(3)中,可得到三次多项式方程:(5)表达式5可以简化成只包含未知系数的形式。
为求这些值,必须使用(5)式的导数,即(6) 1lim ()lim ()kkk k x x x x S x S x +--→→=1,2,,1k n =-1lim ()lim ()kkkk x x x x S x S x +--→→''=1,2,,1k n =-1lim ()lim ()kkkk x x x x S x S x +--→→''''=1,2,,1k n =-()S x 1111()S (x )S (x )k kkk k k k k k x x x x S x x x x x ++++--''''''=+--()S x ()S x ''[,]a b 111(),()kkk k kk kM S x M S x h x x +++''''===-和11()M k kkk k k k x x x x S x M h h ++--''=+1,0,1,, 1.k k x x x k N +≤≤=-33111()()()()()66k k k k k k k k k kkMM S x x x x x p x x q x x h h +++=-+-+-+-1,k k x x +和+1+1()()k k k k k k S x y S x y ==和k k p q 和2211,66k k k k k k k k k k M M y h p h y h q h ++=+=+k k p q 和3311111()()()()()6666k k k k k k k kk k k k k k k kkM M y M hy M h S x x x x x x x x x h h h h +++++⎛⎫⎛⎫=--+-+--+-- ⎪⎪⎝⎭⎝⎭{}k M 221111()()()226k k k k k k k kkk k k k k k k M M y M h y m hS x x x x x h h h h h ++++⎛⎫'=--+---+- ⎪⎝⎭在处计算(6),并简化结果可得到 ,其中 (7) 同理,在式(6)中用 并计算在 处的解,可得 (8)利用节点处一阶导函数连续及方程(6)、(7),可得到包含的重要关系式(9)其中方程组(9)中的未知数是要求的值 ,其他的项可通过数据点集 进行简单的计算得到的常量。
因此方程(9)是包含N+1个未知数,具有N-1个线性方程的不定方程组。
所以需要另外两个方程组才能求解,即边界条件。
如果已知,则 100001113(())23(())2N N N N N MM d S x h M M S x d h ---'=--'=--(10)(11) 根据(9)(10)求出 后,可利用下面的公式计算 的样条系数 。
k x 1()36k k k k k k k M m S x h h d +'=--+1k k k k y y d h +-=11,(),k k k S x -'-代替可得到k x 11111()36k k k k k k k Mm S x h h d -----'=++11,,k k k M M M -+11112()k k k k k k k k h M h h M h M μ---++++=16(),1,2,, 1.k k k d d k N μ-=-=-{}0Nk M {}0(,)Nk k k x y =0(),()n S x S x ''{}0Nk M ()k S x 111112222322222111N N N N N N N N N b c M a b c M a b C M a b M μμμμ---------⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦,0k k s y =,1,1(2)6k k k k k h M M s d ++=-,,22k k Ms =,1,36k k k k M M s h +-=,1k k k k y y d h +-=,1k k k h x x +=-三、 源程序csfit1:第一类边界条件function S=csfit1(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); C=H(2:N); U=6*diff(D);B(1)=B(1)-H(1)/2;U(1)=U(1)-3*(D(1)-dx0); B(N-1)=B(N-1)-H(N)/2;U(N-1)=U(N-1)-3*(dxn-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;{},k jsfor 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);endcsfit2:第二类边界条件function S=csfit2(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);C=H(2:N);U=6*diff(D);U(1)=U(1)-dx0;U(N-1)=U(N-1)-dxn;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)=dx0;M(N+1)=dxn;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);end画图: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,'.')四、实验结果第一类边界条件:第二类边界条件:自然边界条件:图像:五、说明与分析实验结果显示,对同一组数据,不同边界条件,会导致形成曲线有一定差距,但总体趋势不变。