插值法数值上机实验报告
- 格式:docx
- 大小:185.26 KB
- 文档页数:8
实验二插值法1、实验目的:1、掌握直接利用拉格郎日插值多项式计算函数在已知点的函数值;观察拉格郎日插值的龙格现象。
2、了解Hermite插值法、三次样条插值法原理,结合计算公式,确定函数值。
2、实验要求:1)认真分析题目的条件和要求,复习相关的理论知识,选择适当的解决方案和算法;2)编写上机实验程序,作好上机前的准备工作;3)上机调试程序,并试算各种方案,记录计算的结果(包括必要的中间结果);4)分析和解释计算结果;5)按照要求书写实验报告;3、实验内容:1) 用拉格郎日插值公式确定函数值;对函数f(x)进行拉格郎日插值,并对f(x)与插值多项式的曲线作比较。
已知函数表:(0.56160,0.82741)、(0.56280,0.82659)、(0.56401,0.82577)、(0.56521,0.82495)用三次拉格朗日插值多项式求x=0.5635时函数近似值。
2) 求满足插值条件的插值多项式及余项1)4、题目:插值法5、原理:拉格郎日插值原理:n次拉格朗日插值多项式为:Ln (x)=yl(x)+y1l1(x)+y2l2(x)+…+ynln(x)n=1时,称为线性插值,L 1(x)=y(x-x1)/(x-x1)+y1(x-x)/(x1-x)=y+(y1-x)(x-x)/(x1-x)n=2时,称为二次插值或抛物线插值,L 2(x)=y(x-x1)(x-x2)/(x-x1)/(x-x2)+y1(x-x)(x-x2)/(x1-x)/(x1-x2)+y2(x-x0)(x-x1)/(x2-x)/(x2-x1)n=i时,Li= (X-X0)……(X-X i-1)(x-x i+1) ……(x-x n)(X-X0)……(X-X i-1)(x-x i+1) ……(x-x n)6、设计思想:拉格朗日插值法是根据n + 1个点x0, x1, ... x n(x0 < x1 < ... x n)的函数值f (x0), f (x1) , ... , f (x n)推出n次多項式p(x),然后n次多項式p (x)求出任意的点x对应的函数值f (x)的算法。
#### 一、实验目的1. 理解插值运算的基本概念和原理。
2. 掌握几种常见的插值方法,如拉格朗日插值、牛顿插值等。
3. 通过实验,验证插值方法在数值计算中的应用效果。
4. 培养动手能力和分析问题的能力。
#### 二、实验原理插值运算是指根据已知数据点,构造一个近似函数来描述这些数据点之间的变化规律。
常见的插值方法有拉格朗日插值、牛顿插值、分段线性插值等。
#### 三、实验内容1. 数据准备准备一组数据点,例如:```x: [1, 2, 3, 4, 5]y: [2, 4, 6, 8, 10]```2. 拉格朗日插值根据给定的数据点,构造拉格朗日插值多项式。
以三次拉格朗日插值为例,其公式如下:```L(x) = y0 ((x - x1) (x - x2) (x - x3)) / ((x0 - x1) (x0 - x2) (x0 - x3))+ y1 ((x - x0) (x - x2) (x - x3)) / ((x1 - x0) (x1 - x2) (x1 - x3))+ y2 ((x - x0) (x - x1) (x - x3)) / ((x2 - x0) (x2 - x1) (x2 - x3))+ y3 ((x - x0) (x - x1) (x - x2)) / ((x3 - x0) (x3 - x1)(x3 - x2))```将数据点代入上述公式,得到拉格朗日插值多项式。
3. 牛顿插值根据给定的数据点,构造牛顿插值多项式。
以三次牛顿插值为例,其公式如下:```N(x) = y0 + (x - x0) (y1 - y0) / (x1 - x0) + (x - x0) (x - x1) (y2 - y1) / ((x1 - x0) (x2 - x1)) + (x - x0) (x - x1) (x - x2) (y3 - y2) / ((x1 - x0) (x2 - x1) (x3 - x2))```将数据点代入上述公式,得到牛顿插值多项式。
数值分析第一次上机练习实验报告——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 现象。
1 / 21数值分析实验二:插值法1 多项式插值的震荡现象1.1 问题描述考虑一个固定的区间上用插值逼近一个函数。
显然拉格朗日插值中使用的节点越多,插值多项式的次数就越高。
我们自然关心插值多项式的次数增加时, 是否也更加靠近被逼近的函数。
龙格(Runge )给出一个例子是极著名并富有启发性的。
设区间[-1,1]上函数21()125f x x=+ (1)考虑区间[-1,1]的一个等距划分,分点为n i nix i ,,2,1,0,21 =+-= 则拉格朗日插值多项式为201()()125nn ii iL x l x x ==+∑(2)其中的(),0,1,2,,i l x i n =是n 次拉格朗日插值基函数。
实验要求:(1) 选择不断增大的分点数目n=2, 3 …. ,画出原函数f(x)及插值多项式函数()n L x 在[-1,1]上的图像,比较并分析实验结果。
(2) 选择其他的函数,例如定义在区间[-5,5]上的函数x x g xxx h arctan )(,1)(4=+=重复上述的实验看其结果如何。
(3) 区间[a,b]上切比雪夫点的定义为 (21)cos ,1,2,,1222(1)k b a b ak x k n n π⎛⎫+--=+=+ ⎪+⎝⎭(3)以121,,n x x x +为插值节点构造上述各函数的拉格朗日插值多项式,比较其结果,试分析2 / 21原因。
1.2 算法设计使用Matlab 函数进行实验, 在理解了插值法的基础上,根据拉格朗日插值多项式编写Matlab 脚本,其中把拉格朗日插值部分单独编写为f_lagrange.m 函数,方便调用。
1.3 实验结果1.3.1 f(x)在[-1,1]上的拉格朗日插值函数依次取n=2、3、4、5、6、7、10、15、20,画出原函数和拉格朗日插值函数的图像,如图1所示。
Matlab 脚本文件为Experiment2_1_1fx.m 。
可以看出,当n 较小时,拉格朗日多项式插值的函数图像随着次数n 的增加而更加接近于f(x),即插值效果越来越好。
第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)各插值算法的精度差异比较经过比较,拉格朗日插值法要比牛顿插值法算法的计算量多一些,拉格朗日插值法后一次计算时用到了前一次计算的结果,提高了运算的效率,但拉格朗日插值法在构造艾尔米特插值法时很方便,将坐标点和对应的导数结合起来的精度比线性插值的精度又要高一些。
但从实验数据来看,在坐标不是很多的情况下,已知的点越多精度也就相对较高。
对于实验要求的第二组数据用拉格朗日插值法(或者牛顿插值法)实验结果如下:一下分别是二阶、三阶、四阶、五阶插值得到的结果以上只是实验结果的一部分,改变插值的位置时,得到的实验结果精度也是有所不同的。
由以上结果分析可知,插值次数并不是越多越好,多了反而会让结果更加偏离真实结果,这充分说明了高次插值存在“病态性质”,在已知点很多的情况下应该采用分段低次插值,将拉格朗日插值法和牛顿插值法运用到分段低次插值法当中,这样得到的结果可能胡更加精确。
插值法实验报告姓名:学号:专业:Matlab 中的一元插值函数为interp1( ),一元插值函数的几种调用格式如下表: 语法形式 说明y=interp1(x,y,x i )由已知点集(x ,y )插值计算x i 上的函数值y=interp1(x,y,x i,,method)用指定插值方法计算插值点x i 上的函数值y=interp1(x,y,x i ,method,’extrap ’)对x i 中超出已知点集的插值点用指定插值方法计算函数值y=interp1(x,y,x i , ’extrap ’ extrapval)用指定方法插值x i 上的函数值,超出已知点集处函数值取extrapval y=interp1(x,y,x i ’pp ’)用指定方法插值,但返回结果为分段多项式Matlab 中一维插值有多种算法,由interp1函数中的method 指定。
一维插值算法 Method方法描述‘nearest ’ 最邻近插值:插值点处函数值取与插值点最邻近的已知点的函数值 ‘liner ’分段线性插值:插值点处函数值由连接其最邻近的两侧点的线性函数预测,MATLAB 中interp1的默认方法‘spline ’ 样条插值:默认为三次样条插值。
可用spline 函数代替 ‘pchip ’ 三次Hermite 多项式插值,可用pchip 函数代替‘cubic’同‘pchip’,三次Hermite多项式插值用interp1对cos函数进行分段线性插值。
在MATLAB命令窗口中输入以下命令:>> x=-pi:pi;>> y=cos(x);>> xx=-pi:0.5:pi;>> yy=interp1(x,y,xx);>> plot(x,y,'s',xx,yy)用其他一维插值方法对以下7个离散数据点(1,3.5)、(2,2.1)、(3,1.3)、(4.0.8)、(5,2.9)、(6,4.2)、(7,5.7)进行一维插值方法。
数值分析上机实验报告导言:本次上机实验主要是针对数值分析课程中的一些基本算法进行实验验证。
实验内容包括迭代法、插值法、数值积分和常微分方程的数值解等。
在实验过程中,我们将会使用MATLAB进行算法的实现,并对结果进行分析。
一、迭代法迭代法是解决函数零点、方程解等问题的常用方法。
我们将选择几个常见的函数进行迭代求根的实验。
(1)二分法二分法是一种简单而有效的迭代求根法。
通过函数在区间两个端点处的函数值异号来确定函数在区间内存在零点,并通过不断缩小区间来逼近零点。
(2)牛顿法牛顿法利用函数的一阶导数和二阶导数的信息来逼近零点。
通过不断迭代更新逼近值,可以较快地求得零点。
实验结果表明,对于简单的函数,这两种迭代法都具有很好的收敛性和稳定性。
但对于一些复杂的函数,可能会出现迭代失效或者收敛速度很慢的情况。
二、插值法插值法是在给定一些离散数据点的情况下,通过构造一个插值函数来逼近未知函数的值。
本实验我们将使用拉格朗日插值和牛顿插值两种方法进行实验。
(1)拉格朗日插值拉格朗日插值通过构造一个多项式函数来逼近未知函数的值。
该多项式经过离散数据点,并且是唯一的。
该方法简单易懂,但插值点越多,多项式次数越高,插值函数的精度也就越高。
(2)牛顿插值牛顿插值利用差商的概念,通过构造一个插值多项式来逼近未知函数的值。
与拉格朗日插值相比,牛顿插值的计算过程更加高效。
但同样要求插值点的选择要合理,否则可能出现插值函数不收敛的情况。
实验结果表明,这两种插值方法都能够很好地逼近未知函数的值。
插值点的选择对插值结果有很大的影响,过多或者过少的插值点都可能导致插值结果偏离真实函数的值。
三、数值积分数值积分是一种将定积分问题转化为数值求和的方法。
本实验我们将使用复合梯形求积法和复合辛普森求积法进行实验。
(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)。
数值分析上机实验报告实验报告插值法与数值积分实验(数值计算方法,3学时)一实验目的1.掌握不等距节点下的牛顿插值公式以及拉格朗日插值公式。
2.掌握复化的梯形公式、辛扑生公式、牛顿-柯特斯公式计算积分。
3. 会用龙贝格公式和高斯公式计算积分。
二实验内容用拉格朗日插值公式计算01.54.1==y x 以及所对应的近似值。
用牛顿插值公式求)102(y 的近似值。
三实验步骤(算法)与结果1拉格朗日插值法:(C 语言版)#include "Stdio.h" #include "Conio.h"int main(void) {float X[20],Y[20],x; int n;void input(float *,float *,float *,int *); float F(float *,float *,float,int); input(X,Y,&x,&n);printf("F(%f)=%f",x,F(X,Y,x,n));getch(); return 0; }void input(float *X,float *Y,float *x,int *n) {int i;printf("Please input the number of the data:");scanf("%d",n);printf("\nPlease input the locate of each num:\n");for(i=0;i<*n;i++){scanf("%f,%f",X+i,Y+i);}printf("\nPlease input the chazhi:"); scanf("%f",x);}float F(float *X,float *Y,float x,int n){int i,j;float Lx,Fx=0;for(i=0;i<n;i++)< p="">{Lx=1;for(j=0;j<n;j++)< p="">{if(j!=i) Lx=Lx*((x-*(X+j))/(*(X+i)-*(X+j))); } Fx=Fx+Lx*(*(Y+i));}return Fx;}得出结果如图:所以Y(1.4)=3.7295252#include#define N 10double X[N], Y[N], A[N][N];int n;double Newton(double x);double f(double x);void main() {printf("请输入已知x与对应y=f(x)的个数: n = "); scanf("%d", &n);getchar();if(n>N||n<=0) {printf("由于该维数过于犀利, 导致程序退出!"); return;}printf("\n请输入X[%d]: ", n);for (int i=0; i<="" p="">scanf("%lf", &X[i]);getchar();printf("\n请输入Y[%d]: ", n);for (i=0; i<="" p="">scanf("%lf", &Y[i]);getchar();double x;printf("\n请输入所求结点坐标x = ");scanf("%lf", &x);getchar();printf("\nf(%.4lf)≈%lf\n\n", x, Newton(x));}double Newton(double x) {int i, j;// 求均差for (i =0; i<="" p="">A[i][0] = Y[i];for (i=1; i<="" p="">for (j =1; j<=i; j++)A[i][j] = (A[i][j-1] - A[i-1][j-1]) / (X[i] - X[i-j]); // 求结点double result = A[0][0];for (i=1; i<="">double tmp = 1.0;for (int j=0; j<="" p="">tmp *= (x - X[j]);result += tmp * A[i][i];}return result;}四实验收获与教师评语</n;j++)<></n;i++)<>。
课题一:拉格朗日插值法1.实验目的1.学习和掌握拉格朗日插值多项式。
2.运用拉格朗日插值多项式进行计算。
2.实验过程作出插值点(,),(,),(,)二、算法步骤已知:某些点的坐标以及点数。
输入:条件点数以及这些点的坐标。
输出:根据给定的点求出其对应的拉格朗日插值多项式的值。
3.程序流程:(1)输入已知点的个数;(2)分别输入已知点的X坐标;(3)分别输入已知点的Y坐标;程序如下:#include <iostream>#include <>#include <>拉格朗日float lagrange(float *x,float *y,float xx,int n) /*插值算法*/{int i,j;float *a,yy=; /*a作为临时变量,记录拉格朗日插值多项*/ a=(float*)malloc(n*sizeof(float));for(i=0;i<=n-1;i++){a[i]=y[i];for(j=0;j<=n-1;j++)if(j!=i)a[i]*=(xx-x[j])/(x[i]-x[j]);yy+=a[i];}free(a);return yy;}int main(){int i;int n;float x[20],y[20],xx,yy;printf(Input n:);scanf(%d,&n);if(n<=0){printf(Error! The value of n must in (0,20).);getch();return 1;}for(i=0;i<=n-1;i++){牰湩晴尨學搥???※scanf(%f,&x[i]);}printf(\);for(i=0;i<=n-1;i++) {printf(y[%d]:,i);scanf(%f,&y[i]); } printf(\);printf(Input xx:);scanf(%f,&xx);yy=lagrange(x,y,xx,n);牰湩晴尨?春礬┽屦湜?硸礬? getch();}运的值。
数值计算插值法实验报告
一、实验目标
本实验的目标是学习和掌握插值法的基本原理,通过实际操作,验证插值法的有效性,并利用插值法解决实际问题。
二、实验原理
插值法是一种数学方法,用于通过已知的离散数据点,构造一个连续的函数来近似地表示未知的函数值。
常用的插值法包括线性插值、多项式插值、样条插值等。
其中,多项式插值是一种常用的方法,其基本思想是选择一个多项式来逼近已知的数据点,从而得到未知点的近似值。
三、实验步骤
1.准备数据:收集一组已知的数据点,并将其整理成表格形式。
2.选择插值方法:根据实际情况选择适当的插值方法,如线性插值、多项式插值或样条插值等。
3.计算插值函数:根据选择的插值方法,利用已知的数据点计算插值函数的系数。
4.验证插值函数:利用已知的数据点对插值函数进行验证,检查其精度和误差。
5.应用插值函数:利用插值函数计算未知点的近似值,并将结果与实际值进行比较。
四、实验结果及分析
下面是本次实验的结果及分析:
1.已知数据点:。
数值分析上机实验报告题目:插值法学生姓名学院名称计算机学院专业计算机科学与技术时间一. 实验目的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]三次样条插值更精确。
计算方法实验题目:班级:学号:姓名:目录计算方法实验 (1)1 实验目的 (3)2 实验步骤 (3)2.1环境配置: (3)2.2添加头文件 (3)2.3主要模块 (3)3 代码 (4)3.1主程序部分 (4)3.2多项式方程部分 (4)3.3核心算法部分 (8)3.4数据结构部分 (13)4运行结果 (19)4.1拉格朗日插值法运行结果 (19)4.2牛顿插值法运行结果 (20)4.3多项式拟合运行结果 (20)5总结 (21)拉格朗日插值法 (21)牛顿插值法 (21)多项式拟合 (21)6参考资料 (22)1 实验目的1.通过编程对拉格朗日插值法、牛顿插值法以及多项式拟合数据的理解2.观察上述方法的计算稳定性和求解精度并比较各种方法利弊2 实验步骤2.1环境配置:VS2013,C++控制台程序2.2添加头文件#include "stdio.h"#include "stdlib.h"#include "stdafx.h"2.3主要模块程序一共分成三层,最底层是数据结构部分,负责存储数据,第二层是交互部分,即多项式方程部分,负责输入输出获得数据,最上层是核心的算法部分,负责处理已获得的数据。
具体功能如下:●数据结构部分数据结构部分是整个程序的最底层,负责存储部分。
因方程系数作为数据元素插入和删除操作较少,而顺序表空间利用率大且查看方便,故此程序选用顺序表保存系数。
数据结构文件中写的是有关顺序表的所有基本操作以供其他文件调用。
本次实验使用列主元高斯消元法作为求解方程组的方法,所以也用了二维顺序表存储数组。
综上,数据结构部分文件是前两个试验的文件内容和,稍作修改。
●常系数微分方程部分多项式方程部分是程序的第二层,内容主要是常系数微分方程导数的计算和显示菜单部分。
●算法部分算法部分分为两个文件,一个是插值部分,一个是拟合部分。
插值部分文件负责有关插值的核心算法,处于整个程序最上层部分,负责拉格朗日插值法和牛顿插值法的具体实现过程。
实验报告名称班级:学号:姓名:成绩:1实验目的1)熟悉拉格朗日插值多项式和牛顿插值多项式,注意其不同特点;2)会用三次样条插值解决一些实际问题;2 实验内容做二次插值,并求x1=-2,x2=0,x3=2.75时的函数近似值。
采用拉格朗日分段插值算法。
2)按下列数据做五次插值,并求x1=0.46,x2=0.55,x3=0.60时的函数近似值。
采用拉格朗日五次插值多项式3)编写一个用牛顿前插公式计算函数值的程序,要求先输出差分表,再计算x点的函数值,采用牛顿前插公式的算法。
3实验步骤1)根据插值公式的算法编写相应的函数程序;2)将题目中所给参数带入到插值函数中得出结果;3 程序设计1)2)拉格朗日插值算法function yi=Lagran(x,y,xi)m=length(xi);n=length(x);for i=1:mz=xi(i);s=0;for k=1:np=1;for j=1:nif j~=kp=p*(z-x(j))/(x(k)-x(j));endends=p*y(k)+s;endyi(i)=s;endend分段插值clcclearx=[-3.0 -1.0 1.0 2.0 3.0];y=[1.0 1.5 2.0 2.0 1.0];yi1=Lagran(x(1,1:3),y(1,1:3),-2);yi2=Lagran(x(1,2:4),y(1,2:4),0);3)function N=forwardchafennewton(x,y,xi)%Newton»ù±¾²åÖµ·½·¨format longn=length(x);m=length(y);t=ff(x,xi);if m~=nerror('x or y ÊäÈëÓÐÎó£¬ÔÙÀ´~');endA=zeros(n);Z=1.0;A(:,1)=y; %AµÚÒ»ÁÐÊÇyN=A(1,1);for k=2:n % k ΪÁбêfor i=k:n % i ΪÐбêA(i,k)=A(i,k-1)-A(i-1,k-1); %±ØÐëÊǺó-ǰendZ=Z*(t-(k-2))/(k-1);N=N+Z*A(k,k);enddisp('²îÉ̱í');disp(A);fprintf('t=%d',t);fprintf('Newton²åÖµµÄ½á¹û±£Áô6λСÊýÊÇ %10.6f\n',N); %function ni=ni(k)%ni=1;%if k==0% ni=1;%else if k<0% disp('error');% else% for i=1:k% ni=ni*i;% end% end%endfunction t=ff(x,xi)h=x(2)-x(1);t=(xi-x(1))/h;4实验结果及分析1)2)Lagran(x,y,[0.46 0.55 0.60])ans =1.1007 1.1413 1.16623)5总结通过本实验我掌握了拉格朗日和牛顿插值多项式的算法,拉格朗日插值多用于理论推导,而牛顿插值算法计算比较方便,特别对于等距节点。
插值法数值上机实验报告
实验题目:
利用下列条件做插值逼近,并与R (x) 的图像比较
考虑函数:R x y=1
1+x2
(1)用等距节点X i=−5+i,i=0,1,...,10.给出它的10次Newton插值多项式的图像;
π),i=0,1,...,20.给出它的20次Lagrange插值多项式(2)用节点X i=5cos(2i+1
42
的图像;
(3)用等距节点X i=−5+i,i=0,1,...,10.给出它的分段线性插值函数的图像;(4)用等距节点X i=−5+i,i=0,1,...,10.给出它的三次自然样条插值函数的图像;
(5)用等距节点X i=−5+i,i=0,1,...,10.给出它的分段三次Hermite插值函数的图像;
实验图像结果:
实验结果分析:
1.为了验证Range现象,我还特意做了10次牛顿插值多项式和20次牛顿插值多项式的对比图像,结果如下图(图对称,只截取一半)
可以看出,Range现象在高次时变得更加明显。
这也是由于高次多项式在端点处的最值随次数的变大很明显。
可以料定高次多项式在两侧端点处剧烈震荡,在更小的间距内急剧上升然后下降,Range现象非常明显。
2.分析实验(2)的结果,我们会惊讶地发现,由于取21个点逼近,原本预料的Range现象会很明显,但这里却和f(x)拟合的很好。
(即下图中Lagrange p(x)的图像)。
可是上图中取均匀节点的20次牛顿多项式逼近的效果在端点处却很差。
料想是由于节点X i=5cos2i+1
42
π ,i=0,1,...,20 取得很好。
由书上第五章的
知识,对于函数y=1
1+x ,y
1
2对应的cherbyshev多项式的根恰好为X i=
5cos2i+1
42
π ,i=0,1,...,20 。
由于所学限制,未能深入分析。
(3)比较三次样条插值图像和Hermit插值图像对原函数图像的逼近情形。
见下图:
初看上去,两者都逼近的很好,也都没有Range现象。
经放大后,局部来看:
在某些地方,分段三次Hermite插值比三次样条插值逼近效果更好。
分析如下:
三次样条插值函数只利用基点处的函数值,并未利用到导函数值,虽然要求二次连续可微,但这并不能保证逼近的好。
而分段三次Hermite插值在每段区间上不但要求函数值相等,还要求导函数值相等,这就保证了插值函数在基点处图像与原函数相切,所以逼近效果更好。
注意到分段三次Hermite插值比三次样条插值利用了更多的条件,这也从另一个方面说明了其逼近效果理论上应该更好。
(4)分析三次自然样条插值函数的图像,我们会发现逼近的效果很好,且没有实验(1)中的Range现象。
但同时我也发现了三次自然样条方法特别依赖于选点,如果少了点,影响会很大。
例如,在实现上图代码的基础上,将节点X i=−5+i,i=0,1,...,10.去除其中X=0的点,得到下面的图像:中间直接拟合的效果很差。
(见下图)
是左右对称的,而恰好实验同时很依赖于节点的选取,由于这里原函数y=1
1+x2
所给的是等距左右对称的节点,所以效果才这么好,如果非等距对称节点效果会差不少。
4.对比三次Hermit插值和三次样条插值的图像:
实验中碰到的问题:
1.在编写实现第四个实验的程序时,由于不想在MATLAB中使用大量的for循环,特意使用MATLAB的向量化编程技巧。
例如:
但这里便没用到Honor算法,去算函数在作图点的值。
所以此处应该还可以在优化。
2.在设计最后一题程序时,由于时间问题没有考虑优化算法,仅仅为了实现画图的功能,编的很冗杂。
应该可以做大幅度的优化。
如下图:
3.初始时对Matlab运用不熟,时常有语法问题,比如“:”一不小心错用成“;”,导致运行结果故障。
程序实现:
本实验由MATLAB编程实现。
程序代码见后附文件。
说明:(共有八个函数文件)
1.Hermit_figure: 生成分段三次Hermit插值函数图形,并与原图形对比。
grange_function: 构造Lagrange插值函数,在后续Plot和Plot2中调用。
3.Newton_function: 构造Lagrange插值函数,在后续Plot和Plot2中调用。
4.Nspline_figure: 生成三次自然样条插值函数的图像,并与原图形对比。
5.Plot: 在同一个图中画Newton插值多项式图形(调用3)、Lagrange插值多项式图像(调用2)、分段线性图形、原函数图形。
6.Plot2:此文件用来在整个图像中生成前三问对应的子图(调用2和3)。
7.Plot3: 验证Range现象:比较Newton10次多项式和Newton20次多项式的图像(调用2)。
8.Plot4:生成自然三次样条插值的图形、原函数图形和Hermit插值多项式图形,并进行比较效果。