实验一 --插值方法

实验一 --插值方法
实验一 --插值方法

实验一—插值方法

实验学时:4

实验类型:设计 实验要求:必修

一 实验目的

通过本次上机实习,能够进一步加深对各种插值算法的理解;学会使用用三种类型的插值函数的数学模型、基本算法,结合相应软件(如VC/VB/Delphi/Matlab/JAVA/Turbo C )编程实现数值方法的求解。并用该软件的绘图功能来显示插值函数,使其计算结果更加直观和形象化。

二 实验内容

通过程序求出插值函数的表达式是比较麻烦的,常用的方法是描出插值曲线上尽量密集的有限个采样点,并用这有限个采样点的连线,即折线,近似插值曲线。取点越密集,所得折线就越逼近理论上的插值曲线。本实验中将所取的点的横坐标存放于动态数组[]X n 中,通过插值方法计算得到的对应纵坐标存放

于动态数组[]Y n 中。

以Visual C++.Net 2005为例。

本实验将Lagrange 插值、Newton 插值和三次样条插值实现为一个C++类CInterpolation ,并在Button 单击事件中调用该类相应函数,得出插值结果并画出图像。CInterpolation 类为 class CInterpolation { public :

CInterpolation();//构造函数

CInterpolation(float *x1, float *y1, int n1);//结点横坐标、纵坐标、下标上限 ~ CInterpolation();//析构函数 ………… …………

int n, N;//结点下标上限,采样点下标上限

float *x, *y, *X;//分别存放结点横坐标、结点纵坐标、采样点横坐标

float *p_H,*p_Alpha,*p_Beta,*p_a,*p_b,*p_c,*p_d,*p_m;//样条插值用到的公有指针,分别存放

i h ,i α,i β,i a ,i b ,i c ,i d 和i m

};

其中,有参数的构造函数为

CInterpolation(float *x1, float *y1, int n1) {

//动态数组x1,y1中存放结点的横、纵坐标,n1是结点下标上限(即n1+1个结点) n=n1;

N=x1[n]-x1[0]; X=new float [N+1]; x=new float [n+1]; y=new float [n+1]; for (int i=0;i<=n;i++) {

x[i]=x1[i]; y[i]=y1[i]; }

for (int i=0;i<=N;i++) X[i]=x[0]+i; }

2.1 Lagrange 插值

()()n

n i i i P x y l x ==∑,其中0,()n

j i j j n

i j

x x l x x x =≠-=

-∏

对于一个自变量x ,要求插值函数值()n P x ,首先需要计算对应的Lagrange 插值基函数值()i l x float l(float xv,int i) //求插值基函数()i l x 的值 {

float t=1;

for (int j=0;j<=n;j++) if (j!=i)

t=t*(xv-x[j])/(x[i]-x[j]); return t; }

调用函数l(float x,int i),可求出()n P x

float p_l(float x) //求()n P x 在一个点的插值结果 {

float t=0;

for (int i=0;i<=n;i++) t+=y[i]*l(x,i); return t; }

调用p_l(float x)可实现整个区间的插值

float *Lagrange() //求整个插值区间上所有采样点的插值结果 {

float *Y=new float [N+1]; for (int k=0;k<=N;k++) Y[k]=p_l(x[0]+k*h);

return Y; } 2.2

Newton 插值

010

()(,,)()n

n i i i P x f x x x x ω==∑ ,

其中1

01,0()(),0i i j j i x x x i ω-==??=?-≠??

∏,0100,()

(,,)()

i k i n

k k j j j k

f x f x x x x x ==≠=-∑∏

对于一个自变量x ,要求插值函数值()n P x ,首先需要计算出01(,,)i f x x x 和()i x ω

float *f() {

//该函数的返回值是一个长度为n +1的动态数组,存放各阶差商 }

float w(float x, int i) {

//该函数计算()i x ω }

在求()n P x 的函数中调用*f()得到各阶差商,然后在循环中调用w(float x)可得出插值结果 float p_n(float x) {

//该函数计算()n P x 在一点的值 }

调用p_n(float x)可实现整个区间的插值 float *Newton() {

//该函数计算出插值区间内所有点的值 }

2.3 三次样条插值

三次样条插值程序可分为以下四步编写: (1) 计算结点间的步长i hi 、i α、i β;

(2) 利用i hi 、i α、i β产生三对角方程组的系数矩阵和常数向量; (3) 通过求解三对角方程组,得出中间结点的导数i m ; (4)

对自变量x ,在对应区间1[,]i i x x +上,使用Hermite 插值;

(5)调用上述函数,实现样条插值。将每步写成函数:

(1)

void GetH(void)

{

hi

//该函数计算数组

i

}

void GetAlpha(void)

{

α

//该函数计算数组

i

}

void GetBeta(void)

{

β

//该函数计算数组

i

}

(2)

void Geta(void)

{

a

//该函数计算数组下对角线

i

}

void Getb(void)

{

b

//该函数计算数组主对角线

i

}

void Getc(void)

{

c

//该函数计算数组上对角线

i

}

void Getd(void)

{

d

//该函数计算方程组右端常数项

i

}

(3)

float *Chasing(float *pa,float *pb,float *pc,float *pd,int n) {

//追赶过程,计算各点斜率

i

m

}

(4)

float F0(float x)

{

//该函数计算函数

0()x

?的值}

float F1(float x)

{

//该函数计算函数

1()x

?的值}

float P0(float x)

{

//该函数计算函数

0()x

ψ的值}

float P1(float x)

{

//该函数计算函数

1()x

ψ的值

}

调用上述函数,实现三次样条插值

float *Cubic_Spline()

{

//该函数计算所有点的插值结果

}

三实验组织运行要求

实验前,由任课教师落实实验任务,每个学生事先编写好算法设计源程序代码。集中上机、调试并通过计算机图形可视化演示操作实例来测试、验证所学的数值分析理论。

四实验条件

为每个学生提供一台具有WINDOWS 98/XP/NT/2000操作系统的计算机;同时提供VC++/VB/JAVA/TC等集成语言开发环境来编程设计计算方法的上机实验。

五实验步骤

1.根据实验内容和算法流程图预先编好程序初稿,上机调试、运行,输出正确的结果。

2.三种类型的插值函数所生成的图形要显示在同一坐标轴上,并用三种不同的颜色分别表示出来。

3.分析它们的运行结果,并比较三种插值函数各自不同的特点。

4.实验完毕后提交实验报告

六实验报告

实验报告的内容包括:实验目的、实验内容、源程序清单和结果分析及心得体会。并分析它们的运行结果,并比较三种插值函数各自不同的特点。

上述是第一个实验——插值方法程序的构思和编写过程。将其简单概括,可分为以下几步:

(1)按照本实验指导书的开篇——“集成开发环境Visual C++.Net的使用”中的第一部分——“开发环境介绍”建立项目。

(2)为项目添加一个类,在该类中编写插值算法。该类需要一个有参数的构造函数将类外的插值条件数据传递到类中。

(3)按照“集成开发环境Visual C++.Net的使用”所述为项目添加对话框双击事件响应程序,将鼠标双击的坐标存放于数组或线性表中,用于插值,并将双击的点用小圆圈标出。

(4)在对话框上添加一个Button(按钮),双击改按钮,添加响应程序,调用拉格朗日插值函数,并将得到的相邻插值点用直线连接起来。连线的方法在“集成开发环境Visual C++.Net的使用”有介绍。

(5)用与(4)类似的方法添加牛顿插值和三次样条插值的Button和相应的响应程序。

对于插值结点的存储,可以采用线性表。为了通过插值结点确定插值区间,可将这些点按照横坐标递增排序。

务必熟练实验一程序编写的每一步骤,做到能够从头至尾独立编写。在项目的建立、画图、类的添加和编程思维各方面,后面的四个实验与实验一都是类似的。本实验指导书对后面的四个实验不再如此赘述。

实验二——数值积分

实验学时:2

实验类型:设计

实验要求:必修

一实验目的

通过该课程实习,学会使用数值积分的各种方法求解定积分计算的问题,体会各种方法的精度差异。二实验内容

本实验将梯形法的递推化和龙贝格算法编写为类CIntegration,在工程中调用该类得出积分结果并画出区间二分图像。首先画出被积函数图像,并储存被积函数在图像中每个像素对应的采样点的横坐标(存放于float型指针p_X中)和纵坐标(存放于int型指针p_Y中);然后调用CIntegration类中相应函数,计算积分结果;最后将x轴上的区间二分点与其对应的被积函数值的点连线。

CIntegration有公有变量和指针float a,b,h,*x;int n和带参数的构造函数

CIntegration::CIntegration(float ma,float mb)

{

a=ma; //a、b分别为积分区间左右端点

b=mb;

n=1; //区间二分个数

h=b-a; //步长

x=new float [n+1]; //存放区间二分点 x[0]=a; x[1]=b;

}

另需被积函数

float CIntegration::f(float x) { float mTemp=sin(x); //可替换为其他函数 return mTemp;

}

绘制函数图像时,需要将图像按照比例放大。 2.1 梯形法的递推化

梯形法递推化公式为

1

2102

1()22n n n k k h T T f x -+==+∑

该过程是下列过程的往复循环 ①

求已有各区间中点函数值的和

1

1

2

()n k k f x

-+

=∑;

② 求积分值2n T 。

区间二分,即更新结点,并将步长h 减半。

要实现该算法过程,需要先编写下面两个函数 float CIntegration::Sum(void ) { //该函数求

1

10

2

()n k k f x

-+

=∑的值

}

void CIntegration::Divide(void ) {

//该函数实现区间二分和步长更新 float *px=new float[2*n+1]; for(int i=0;i

px[2*i+1]=(x[i]+x[i+1])/2;

}

px[2*n]=x[n]; delete x; x=px;

n=n*2;

h=h/2;

}

为了后面编程的方便,可将单次二分过程写为函数 float CIntegration::T1ToT2(float T1) { }

最后,调用T1ToT2,可实现梯形法递推化的函数 float CIntegration::Trapezium_Recurrence(float e) { }

在后面的Romberg 函数中,还需要用到迭代一定次数的梯形法递推函数 float CIntegration::Trapezium_Recurrence(int N) { }

2.2 龙贝格算法

其中

1

2102

1()22n n n k k h T T f x -+==+∑

243n n n T T S -=

21615n n

n S S C -=

26463n n

n C C R -=

调用梯形法递推函数Trapezium_Recurrence(int N)可以很方便的实现单次龙贝格算法的函数 float CIntegration::R1(float * T) { }

调用函数R1可实现迭代的龙贝格函数 float CIntegration::Romberg(float e) {

}

三实验组织运行要求

实验前,由任课教师落实实验任务,每个学生事先编写好算法设计源程序代码。集中上机、调试并通过计算机图形可视化演示操作实例来测试、验证所学的数值分析理论。

四实验条件

为每个学生提供一台具有WINDOWS 98/XP/NT/2000操作系统的计算机;同时提供VC++/VB/JAVA/TC等集成语言开发环境来编程设计计算方法的上机实验。

五实验步骤

1、根据实验内容和算法流程图预先编好程序初稿,上机调试、运行。

2、用绘图函数绘出曲边梯形的面积并计算其值并输出正确的结果。

3、测试、分析它们的运行结果,比较两种方法的精度差异。

4、实验完毕后提交实验报告。

六实验报告

实验报告的内容包括:实验目的、实验内容、源程序清单和结果分析及心得体会。并分析它们的运行结果,并比较两种数值积分不同的特点和精度差异。

实验三——微分方程

实验学时:2

实验类型:综合/设计

实验要求:必修

一实验目的

通过本次实验,熟悉求解常微分方程初值问题的有关方法和理论,主要是欧拉法、改进欧拉法、四阶龙格库塔法,学会编制这三种方法的计算程序。体会这三种解法的功能、优缺点及适用场合。

二实验内容

本实验将欧拉法、改进欧拉法和经典四阶龙哥库塔法编写为一个类CDifferential_Equation,调用该类实现一阶微分方程初值问题的求解,并画出解函数的图像。CDifferential_Equation的框架如下class CDifferential_Equation

{

public:

CDifferential_Equation(float ma,float mb,float mh,float my0);

~CDifferential_Equation(void);

float f(float x, float y);

void Euler(void); //欧拉法

void Euler_Improved(void); //改进欧拉法

void Classical_Forth_Order_Runge_Kutta(void); //经典四阶龙哥库塔法

float a,b,h,y0; //分别为区间左端点、区间右端点、步长

float *x,*y; //存放各个结点和横、纵坐标

int n; //结点个数,构造函数中得到

};

其中有参数的构造函数为

CDifferential_Equation::CDifferential_Equation(float ma,float mb,float mh,float my0)

{

a=ma;b=mb;h=mh;

n=(b-a)/h;

x=new float[n+1];

y=new float[n+1];

for(int i=0;i<=n;i++)

x[i]=a+h*i;

y[0]=my0;

}

三实验组织运行要求

实验前,由任课教师落实实验任务,每个学生事先编写好算法设计源程序代码。集中上机、调试并通过计算机图形可视化演示操作实例来测试、验证所学的数值分析理论。

四实验条件

为每个学生提供一台具有WINDOWS 98/XP/NT/2000操作系统的计算机;同时提供VC++/VB/JAVA/TC等集成语言开发环境来编程设计计算方法的上机实验。

五实验步骤

1、根据实验内容和算法流程图预先编好程序初稿,上机调试、运行。

2、在屏幕上按适当比例和位置画出坐标轴及解的函数曲线输出正确的结果。

3、测试、分析它们的运行结果,比较三种方法的精度和误差。

4、实验完毕后提交实验报告。

六实验报告

实验报告的内容包括:实验目的、实验内容、源程序清单和结果分析及心得体会。并分析它们的运行结果,比较三种常微分方程求初值的精度和误差。

实验四——非线性方程

实验学时:2

实验类型:设计

实验要求:必修

一实验目的

通过本次实验,熟练的掌握方程求根的最基本、常用的运算方法和理论。主要有二分法、牛顿法、弦截法,并体会它们各自不同的特点及收敛速率。

二 实验内容

2.1 算法原理与底层计算程序

非线性方程f(x)=0。

(1)二分法

对于单根区间[a,b],f(a)f(b)<0:

① 区间中点m 为(a+b)/2,如果|b-a|

② 如果f(a)=0(或f(b)=0),则a (或b )即为方程的解(注意:程序中,两浮点数不可判断相等,即使两浮点数a 和b 理论上相等,但“a==b;”一般不成立);

③ 如果f(a)f(m)<0,则对区间[a,m]调用函数自身(递归),或将m 赋值给b (循环),跳转①,

如果f(m)f(b)<0,则对区间[m,b]调用函数自身(递归),或将m 赋值给a (循环),跳转①。 float Bisection(float a, float b,float e)

{//a 和b 分别为区间左右端点,e 为容许误差,返回值为方程的解 //建议该函数用递归实现

//函数在[a,b]区间须连续、端点函数值异号且函数在该区间有唯一解 //每步的区间中点存入顺序表中,以备后面画图之用 }

(2)牛顿法 1()

'()

k k k k f x x x f x +=-

,0x 已知

float Newton(float x, float e)

{//x 为初值x0,e 为容许误差,返回值为方程的解

//每次得到的近似解存入顺序表中,以备后面画图之用 }

(3)快速弦截法

1

11()

()()

k k k k k k k x x x x f x f x f x -+--=--,0x 和1x 已知

float Secant(float x0, float x1, float e)

{//x0,x1分别为前两个近似解,用于启动迭代过程,e 为容许误差,返回值为方程的解 //将每次迭代结果存入顺序表中,以备后面画图之用 }

也可以定义多个待求解方程为函数,在二分法、牛顿法和弦截法的函数中增加函数指针参数,用以调用不同的待求解方程。

2.2 可视化交互式对话框设计

(1)绘制直角坐标系,并画出待求解方程的函数图象。

(2)使用文本编辑框向程序传递a 、b 、x 、x0、x1、e 等条件初始值。

(3)使用三个按钮分别调用三种算法的函数,用静态文本框显示计算结果。对于区间二分法,用小圆圈在x 轴标出每次得到的区间中点;对于牛顿法,对每个k ,用直线连接(,

())k k x f x 和+1(,0)k x ;对于弦

截法,对每个k ,用直线连接(,())k k x f x 和2(,0)k x +。

图4 非线性方程

三实验组织运行要求

实验前,由任课教师落实实验任务,每个学生事先编写好算法设计源程序代码。集中上机、调试并通过计算机图形可视化演示操作实例来测试、验证所学的数值分析理论。

四实验条件

为每个学生提供一台具有WINDOWS 98/XP/NT/2000操作系统的计算机;同时提供VC++/VB/JAVA/TC等集成语言开发环境来编程设计计算方法的上机实验。

五实验步骤

1、根据实验内容和算法流程图预先编好程序初稿,上机调试、运行。

2、按适当的比例在屏幕上画出f(x)的函数曲线以及根在x轴上的逼近过程。

3、测试、分析它们的运行结果并比较三种方法的运算速率及精度误差。

4、实验完毕后提交实验报告。

六实验报告

实验报告的内容包括:实验目的、实验内容、源程序清单和结果分析及心得体会。并分析它们的运行结果,比较三种方程求根的运算速率及精度误差。

实验五——线性方程组

实验学时:2

实验类型:设计

实验要求:必修

一实验目的

通过本课程的实习,学会编写全主元消去法的计算程序。掌握解线性方程组的最基本算法及其运用,

进一步了解该解法的功能、优缺点,领会系数矩阵对解的影响。

二 实验内容

求解n 元线性方程组

1112131112122232223132333331

2

3n n n n n n nn n n a a a a x b a a a a x b a a a a x b a a a a x b ??????

????????????

??????=??????

??????????????????

即AX B =

其中第k 个方程表示为

),2,1(1

n i b x a

i

n

j j ij

==∑=

2.1 算法原理与底层计算程序

表9 线性方程组初始数据

(1)高斯——赛德尔迭代法

(1)()()()()

1

1221331441111

(1)(1)()()()

2

2112332442222

(1)(1)(1)()()3

3113223443333

(1)(1)4411441()1()1()1(k k k k k n n k k k k k n n k k k k k n n k k x a x a x a x a x b a x a x a x a x a x b a x a x a x a x a x b a x a x a a ++++++++=------+=------+=------+=-- (1)(1)()42243344(1)(1)(1)(1)(1)

1122331,11)

1()k k k n n k k k k k n n n n n n n n nn x a x a x b x a x a x a x a x b a +++++++---???

????????----+?

??

?=------+??

对于第i 个方程,表达式为

)(11

)(11)

1()

1(∑∑+=-=++--=n

i j k j ij i j k j ij i ii k i

x a x a b a x

该算法可以通过编写三个函数实现。

float *Adjust(float *pX0) 该函数计算一次迭代,pX0数组为上次迭代结果,返回值为本次迭代结果(数组) { //已有条件数据:系数矩阵数组A ,常数数组B ,未知数个数n

//计算结果数据:根据参数pX0数组(表示某步迭代结果)计算下一步迭代数组 float *pX1=(float *)malloc((n+1)*sizeof(float)); //不使用第0个元素

for(int i=1;i<=n;i++) //求每个(1)

k i

x +

{

//)(11

)(11)

1()1(∑∑+=-=++--=n

i j k j ij i j k j ij i ii k i

x a x a b a x

,两个一重循环 }

return pX1;

}

float Distance(float *pX0,float *pX1) //该函数计算两个向量的距离(即计算两个向量之差的范数) { //已有条件数据:向量维数n

}

float *Gauss_Seidel(float *pX0,float e) //该函数计算以pX0为初值,精度为e 的迭代解 { //已有条件数据:系数矩阵数组A ,常数数组B ,未知数个数n

//计算结果数据:根据参数pX0数组和e (表示某步迭代结果)计算迭代结果 //该函数调用Adjust(float *pX0)和Distance(float *pX0,float *pX1) }

(2)高斯列主元消去法

将线性方程组写成增广矩阵形式

11

12131121222322313233331

2

3n n n n n n nn n a a a a b a a a a b a a a a b a a a a b ??

????????

??????

将该增广矩阵作为全局数据或类的数据成员。

表10 高斯列主元消去法数据

所谓消去法,就是通过行初等变换,将增广矩阵化为对角矩阵的方法,最后一列就是方程组的解。因

此,首先编写对数组G 进行行初等变换的三个函数。 void Exchange(int i,int j) //交换G 的第i 行和第j 行 {

}

void Mult(int i,float r) //将G 的第i 行乘以r { }

void AddTo(int i,int j,float r) //将第i 行乘以r 加到第j 行 { } 另外还需选主元函数。

int GetMaxElem(int i) //查找G[i][i]……G[n][i]中最大元素的行标

{ }

有了这些函数,可以很方便的实现高斯列主元消去法。

void GaussEliminate()

{

for(int y=1;y<=n;y++) //将G化为上三角矩阵

{

//消掉G[y][y]以下的元素(简单起见,可以先将第y行除以G[y][y])

}

for(int y=n;y>=1;y--) //将上三角矩阵化为对角矩阵

{

//消掉G[y][y]以上的元素

}

//G的最后一列就是方程组的解

}

对于C++语言,为了方便,使用二维动态数组。可调用下面的函数为二维指针分配动态存储空间和销毁空间。为了方便程序的移植和重复利用,可将这两个函数写在一个文件MatrixAllocate.h中。C#和Java可以直接使用二维数组。

template

bool New(T **&ppData,int H,int W)

{//该函数为二维指针ppData分配动态存储空间

T *ppData1 = new T[W*H];

ppData=new T*[H];

for(int i=0;i

{

ppData[i]=ppData1+i*W;

}

return true;

}

template

bool Delete(T **&ppData)

{//该函数销毁二维指针ppData

T *ppData1=ppData[0];

delete ppData1;

delete ppData;

ppData=NULL;

return true;

}

2.2 可视化交互式对话框设计

该实验不需要对话框,建立控制台应用程序,将结果输出即可。

三实验组织运行要求

实验前,由任课教师落实实验任务,每个学生事先编写好算法设计源程序代码。集中上机、调试并通过计算机图形可视化演示操作实例来测试、验证所学的数值分析理论。

四实验条件

为每个学生提供一台具有WINDOWS 98/XP/NT/2000操作系统的计算机;同时提供VC++/VB/JAVA/TC等集成语言开发环境来编程设计计算方法的上机实验。

数值计算方法比较

有限差分方法(FDM:Finite Difference Method)是计算机数值模拟最早采用的方法,至今仍被广泛运用。该方法将求解域划分为差分网格,用有限个网格节点代替连续的求解域。有限差分法以Taylor级数展开等方法,把控制方程中的导数用网格节点上的函数值的差商代替进行离散,从而建立以网格节点上的值为未知数的代数方程组。有限差分法主要集中在依赖于时间的问题(双曲型和抛物型方程)。有限差分法方面的经典文献有Richtmeyer & Morton的《Difference Methods for Initial-Value Problems》;R. LeVeque《Finite Difference Method for Differential Equations》;《Numerical Methods for C onservation Laws》。 注:差分格式: (1)从格式的精度来划分,有一阶格式、二阶格式和高阶格式。 (2)从差分的空间形式来考虑,可分为中心格式和逆风格式。 (3)考虑时间因子的影响,差分格式还可以分为显格式、隐格式、显隐交替格式等。 目前常见的差分格式,主要是上述几种形式的组合,不同的组合构成不同的差分格式。差分方法主要适用于有结构网格,网格的步长一般根据实际地形的情况和柯朗稳定条件来决定。 构造差分的方法: 构造差分的方法有多种形式,目前主要采用的是泰勒级数展开方法。其基本的差分表达式主要有三种形式:一阶向前差分、一阶向后差分、一阶中心差分和二阶中心差分等,其中前两种格式为一阶计算精度,后两种格式为二阶计算精度。通过对时间和空间这几种不同差分格式的组合,可以组合成不同的差分计算格式。 有限差分法的不足:由于采用的是直交网格,因此较难适应区域形状的任意性,而且区分不出场函数在区域中的轻重缓急之差异,缺乏统一有效的处理自然边值条件和内边值条件的方法,难以构造高精度(指收敛阶)差分格式,除非允许差分方程联系更多的节点(这又进一步增加处理边值条件韵困难)。另外它还有编制不出通用程序的困难。 有限差分法的优点:该方法是一种直接将微分问题变为代数问题的近似数值解法,数学概念 直观,表达简单,精度可选而且在一个时间步内,对于一个给定点来说其相关的空间点只是 与该相邻的几点,而不是全部的空间点。是发展较早且比较成熟的数值方法 广义差分法(有限体积法)(GDM:Generalized Difference Method):1953年,Mac—Neal 利用积分插值法(也称积分均衡法)建立了三角网格上的差分格 式,这就是以后通称的不规划网格上的差分法.这种方法的几何误差小,特别是给出了处理自然边值条件(及内边值条件)的有效方法,堪称差分法的一大进步。1978年,李荣华利用有限元空间和对偶单元上特征函数的推广——局部Taylor展式的公项,将积分插值法改写成广义Galerkin法形式,从而将不规则网格差分法推广为广义差分法.其基本思路是,将计算区域划分为一系列不重复的控制体积,并使每个网格点周围有

插值法和拟合实验报告(数值计算)

插值法和拟合实验报告 一、 实验目的 1.通过进行不同类型的插值,比较各种插值的效果,明确各种插值的优越性; 2.通过比较不同次数的多项式拟合效果,了解多项式拟合的原理; 3.利用matlab 编程,学会matlab 命令; 4.掌握拉格朗日插值法; 5.掌握多项式拟合的特点和方法。 二、 实验题目 1.、插值法实验 将区间[-5,5]10等分,对下列函数分别计算插值节点 k x 的值,进行不同类型 的插值,作出插值函数的图形并与)(x f y =的图形进行比较: ;11)(2x x f += ;a r c t a n )(x x f = .1)(42 x x x f += (1) 做拉格朗日插值; (2) 做分段线性插值; (3) 做三次样条插值. 2、拟合实验 给定数据点如下表所示: 分别对上述数据作三次多项式和五次多项式拟合,并求平方误差,作出离散函数 ),(i i y x 和拟合函数的图形。 三、 实验原理 1.、插值法实验

∏∑∏∏∏∑∑≠==≠=≠=≠=+-==--= =-= ==-=-=----==++==j i j j i i i i i n i i n n j i j j n j i j j i i n j i j j n i i i n i i n n n o i n i i n x x x x x y x l x L x x c n i x x c x x x c x x x x x x x x c y x l x L y x l y x l y x l x L ,00 ,0,0,01100 00 )(l )()() (1 ,1,0, 1)()(l ) ()())(()()()()()()()(, 故, 得 再由,设 2、拟合实验

计算方法 课内实验 插值法与函数逼近

《计算方法》课内实验报告 学生姓名:张学阳1009300132 及学号: 学院: 理学院 班级: 数学101 课程名称:计算方法 实验题目:插值法与函数逼近 指导教师 宋云飞讲师 姓名及职称: 朱秀丽讲师 尚宝欣讲师 2012年10月15日

目录 一、实验题目.......................................................... 错误!未定义书签。 二、实验目的.......................................................... 错误!未定义书签。 三、实验内容.......................................................... 错误!未定义书签。 四、实现结果.......................................................... 错误!未定义书签。 五、实验体会或遇到问题 (6)

插值法与函数逼近 二、实验目的 1.熟悉matlab 编写及运行数值计算程序的方法。 2.进一步理解插值法及函数逼近方法的理论基础。 3.进一步掌握给定数据后应用插值法及函数逼近方法进行数据处理并给出图示结果的实际操作过程。 三、实验内容 1.已知函数在下列各点的值为 试用4次牛顿插值多项式)(4x P 及三次样条函数)(x S (自然边界条件)对数据进行插值。给出求解过程,并用图给出 (){},10,1,0),()(,08.02.0,,4 ===+=i x S y x P y i x y x i i i i i 及。 2.下列数据点的插值 可以得到平方根函数的近似。 (1)用这9个点作8次多项式插值)(8x L 。 (2)用三次样条(第一类边界条件)插值给出)(x S 。 给出求解过程,在区间[0,64]上作图,从得到的结果看,在区间[0,64]上哪种插值结果更精确?在区间[0,1]上两种插值哪个更精确? 3.由实验给出数据表 试求3次、4次多项式的曲线拟合,再根据数据曲线形状,求一个另外函数的拟合曲线。给出求解过程,用图表示实验数据曲线及三种拟合曲线。

插值法实验报告

实验二插值法 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次拉格朗日插值多项式为:L n (x)=y l (x)+y 1 l 1 (x)+y 2 l 2 (x)+…+y n l n (x)

n=1时,称为线性插值, L 1(x)=y (x-x 1 )/(x -x 1 )+y 1 (x-x )/(x 1 -x )=y +(y 1 -x )(x-x )/(x 1 -x ) n=2时,称为二次插值或抛物线插值, L 2(x)=y (x-x 1 )(x-x 2 )/(x -x 1 )/(x -x 2 )+y 1 (x-x )(x-x 2 )/(x 1 -x )/(x 1 -x 2 )+y 2 (x -x 0)(x-x 1 )/(x 2 -x )/(x 2 -x 1 ) 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)的算法。 7、对应程序: 1 ) 三次拉格朗日插值多项式求x=0.5635时函数近似值 #include"stdio.h" #define n 5 void main() { int i,j; float x[n],y[n]; float x1; float a=1; float b=1; float lx=0; printf("\n请输入想要求解的X:\n x="); scanf("%f",&x1); printf("请输入所有点的横纵坐标:\n"); for(i=1;i

实验四插值法

实验四、插值法 插值法是函数逼近的一种重要方法,它是数值积分、微分方程数值解等数值计算的基础与工具,其中多项式插值是最常用和最基本的方法。拉格朗日插值多项式的优点是表达式简单明确,形式对称,便于记忆,它的缺点是如果想要增加插值节点,公式必须整个改变,这就增加了计算工作量。而牛顿插值多项式对此做了改进,当增加一个节点时只需在原牛顿插值多项式基础上增加一项,此时原有的项无需改变,从而达到节省计算次数、节约存储单元、应用较少节点达到应有精度的目的。 一、实验目的 1、理解插值的基本概念,掌握各种插值方法,包括拉格朗日插值和牛顿插值等,注意其不同特点; 2、通过实验进一步理解并掌握各种插值的基本算法。 二、Matlab命令和程序 命令poly:创建一个向量,其分量为一个多项式的系数,该多项式具有给定的根。 命令polyval:求多项式的值, 命令 conv: 创建一个向量,其分量为一个多项式的系数,该多项式是另外两个多项式的积 polyval(C,2> >> P=poly(2> P=1 -2

Q=poly(3> Q=1 -3 >> conv(P,Q> ans= 1 -5 6 >> polyval(P,2> ans= 1、拉格朗日插值( 基于N+1个点,计算拉格朗日多项式> function [C,L]=lagran(X,Y> %input --X is a vector that contains a list of abscissasb5E2RGbCAP % Y is a vector that contains a list of ordinatesp1EanqFDPw %output--C is a matrix that contains the coefficient of the lagraneDXDiTa9E3d % interplatory polynomial % -- L is a matrix that contains the Lagrange coefficent polynomialsRTCrpUDGiT w=length(X>。 n=w-1。

数值分析插值算法源程序

#include #include float f(float x) //计算ex的值 { return (exp(x)); } float g(float x) //计算根号x的值 { return (pow(x,0.5)); } void linerity () //线性插值 { float px,x; float x0,x1; printf("请输入x0,x1的值\n"); scanf("%f,%f",&x0,&x1); printf("请输入x的值: "); scanf("%f",&x); px=(x-x1)/(x0-x1)*f(x0)+(x-x0)/(x1-x0)*f(x1); printf("f(%f)=%f \n",x,px); } void second () //二次插值 { float x0,x1,x2,x,px; x0=0; x1=0.5; x2=2; printf("请输入x的值:"); scanf("%f",&x); px=((x-x1)*(x-x2))/((x0-x1)*(x0-x2))*f(x0)+((x-x0)*(x-x2))/((x1-x0)*(x1-x2))*f(x1)+((x-x0)* (x-x1))/((x2-x0)*(x2-x1))*f(x2);

printf("f(%f)=%f\n",x,px); } void Hermite () //Hermite插值 { int i,k,n=2; int flag1=0; printf("Hermite插值多项式H5(x)="); for(i=0;i<=n;i++) { int flag=0; flag1++; if(flag1==1) { printf("y%d[1-2(x-x%d)*(",i,i); } else { printf("+y%d[1-2(x-x%d)*(",i,i); } for(k=0;k<=n;k++) { if(k!=i) { flag++; if(flag==1) { printf("(1/x%d-x%d)",i,k); } else { printf("+(1/x%d-x%d)",i,k);

实验3 插值方法

0实验3 Matlab编程实现Lagrange插值算法 复习: 1、输出一个正整数,求该正整数的阶乘。 函数参考: 2、编写函数实现对任意输入一个向量的排序(向量里的元素从小到大)函数参考:

Lagrange 插值算法 一、理论知识: 1、线性插值 101001011)(y x x x x y x x x x x L ???? ??--+???? ??--= 2、二次插值 2211002)()()()(y x l y x l y x l x L ++= ))(() )(()(2010210x x x x x x x x x l ----= ,) )(())(()(2101201x x x x x x x x x l ----=, ))(())(()(1202102x x x x x x x x x l ----= 3、n 次Lagrange 插值 ∑==+++=n k k k n n n y x l y x l y x l y x l x L 01100)()()()()( ) ())(())(() ())(())(()(111111n k k k k k k o k n k k o k x x x x x x x x x x x x x x x x x x x x x l ----------= +-+- ∑∏=≠=???? ? ?????--=n k k n k j j j k j n y x x x x x L 00)()()( 二、实验题目: 1、 已知11=,24=,39=,用线性和二次插值求5的近似值。 线性插值 你选择的节点是: 你的程序: 插值结果:

计算方法实验

算方法实验指导 姓名学号院系专业哈尔滨工业大学

计算方法实验指导 根据实际问题建立的数学模型,一般不能求出所谓的解析解,必须针对数学模型 的特点确定适当的计算方法,编制出计算机能够执行的计算程序,输入计算机,进行 调试,完成运算,如果计算结果存在问题或不知是否正确,还需要重新确定新的计算 方法,再编制出计算程序,输入计算机,重新调试,完成运算,直至获得正确的计算 结果,这就是数值计算的全部过程。 学生在学习“计算方法”和“高级语言”等课程时普遍存在的问题是:只会套用 教科书中的标准程序进行数值计算,很少有人能够独立地将学过的数值算法编制成计 算机程序,至于灵活应用已经掌握的算法求解综合性较大的课题,则更是困难的事情。 编写《计算方法实验指导》的目的是:突出数值计算程序结构化的思想。提高学 生的编程能力,加深对“计算方法”课程内容的理解和掌握,为”计算方法“课程的 教学服务,进一步奠定从事数值计算工作的基础。具体地 1. 根据“计算方法”课程内容的特点,给出五个典型算法的分析流程,学生可以 利用所掌握的 “高级语言”顺利地编制出计算机程序,上机实习,完成实验环节的教 学要求。 2. 所有的计算实习题目都经过任课教师逐一检验,准确无误。 3. 充分利用循环的思想、 迭代的思想, 给出算法结构描述和程序语言的对应关系, 有利于学生编 制相应的程序。 4. 结合实习题目,提出实验要求,要求学生按规范格式写出相应的实验报告,实 验报告成绩记入 期末总成绩。需要提醒学生:不能简单地套用现成的标准程序完成实 验题目,应当把重点放在对算法的理解、程序的优化设计、上机调试和计算结果分析 上,否则就失去实验课的目的啦。 5. 五个具体的实验题目是: 实验题目 实验题目 实验题目 实验题目 实验题目 要求必须完 成其中三个(如果全部完成更好) 。 1 拉格朗日 (Lagrange) 插值 2 龙贝格 (Romberg) 积分法 3 四阶龙格—库塔 (Runge — Kutta) 方法 4 牛顿 (Newton) 迭代法 5 高斯 (Gauss) 列主元消去法

计算方法-插值方法实验

实验一插值方法 一. 实验目的 (1)熟悉数值插值方法的基本思想,解决某些实际插值问题,加深对数值插值方法 的理解。 (2)熟悉Matlab 编程环境,利用Matlab 实现具体的插值算法,并进行可视化显示。 二. 实验要求 用Matlab 软件实现Lagrange 插值、分段线性插值、三次Hermite 插值、Aitken 逐步插值算法,并用实例在计算机上计算和作图。 三. 实验内容 1. 实验题目 (1 ) 已 知概 率积 分dx e y x x ?-= 2 2 π 的数据表 构造适合该数据表的一次、二次和三次Lagrange 插值公式,输出公式及其图形,并计算x =0.472时的积分值。 答: ①一次插值公式: 输入下面内容就可以得到一次插值结果 >> X=[0.47,0.48];Y=[0.4937452,0.5027498]; >> x=0.472; >> (x-X(2))/(X(1)-X(2))*Y(1)+(x-X(1))/(X(2)-X(1))*Y(2) ans =0.495546120000000 >> ②两次插值公式为: 输入下面内容就可以得到两次插值结果 >> X=[0.46,0.47,0.48];Y=[0.4846555,0.4937452,0.5027498]; >> x=0.472; >>(x-X(2))*(x-X(3))/((X(1)-X(2))*(X(1)-X(3)))*Y(1)+(x-X(1))*(x-X(3))/((X(2)-X(1))*(X(2)-X(3)))*Y(2)+(x-X(2))*(x-X(1))/((X(3)-X(2))*(X(3)-X(1)))*Y(3) i 0 1 2 3 x 0.46 047 0.48 0.49 y 0.4846555 0.4937452 0.5027498 0.5116683

数值分析(计算方法)实验一

《数值分析》 课程实验指导书 实验一 函数插值方法 一、问题提出 对于给定的一元函数)(x f y =的n+1个节点值(),0,1,,j j y f x j n == 。试用Lagrange 公式求其插值多项式或分段二次Lagrange 插值多项式。 数据如下: (1) j x 0.4 0.55 0.65 0.80 0.95 1.05 j y 0.41075 0.57815 0.69675 0.90 1.00 1.25382 求五次Lagrange 多项式5L ()x ,和分段三次插值多项式,计算(0.596)f ,(0.99)f 的值。(提示:结果为(0.596)0.625732f ≈, (0.99) 1.05423f ≈ ) (2) j x 1 2 3 4 5 6 7 j y 0.368 0.135 0.050 0.018 0.007 0.002 0.001 试构造Lagrange 多项式6L ()x ,计算的(1.8)f ,(6.15)f 值。(提示:结果为(1.8)0.164762f ≈, (6.15)0.001266f ≈ ) 二、要求 1、 利用Lagrange 插值公式 00,()n n i n k k i i k k i x x L x y x x ==≠??-= ?-??∑∏编写出插值多项式程序; 2、 给出插值多项式或分段三次插值多项式的表达式; 3、 根据节点选取原则,对问题(2)用三点插值或二点插值,其结果如何; 4、 对此插值问题用Newton 插值多项式其结果如何。

四、实验分析: Lagrange 插值多项式的表达式: 1,,2,1,)()()(, )()(1111+=--==∏∑+≠=+=n i x x x x x l x l y x L n i j j j i j i n i i i 。 其中)(x l i 被称为插值基函数,实际上是一个n 次多项式。)(x l i 的这种表示具有较好的对称性。公式具有两大优点:(1)求插值多项式,不需要求解线性方程组,当已知数据点较多时,此公式更能显示出优越性。(2)函数值可以用符号形式表示,数据点未确定的纵坐标可用多项式表示。 Newton 插值多项式如下: 10010,()()[,,]()k n n j k k j j k N x f x f x x x x -==≠=+?-∑∏ 其中: 00,0()()[,,]k i k i i j j j i k f x x x f x x ==≠-=∑∏ Newton 插值多项式的优点是:当每增加一个节点时,只增加一项多项式。 三、实验程序及注释 1、m 程序: function [c,l]=lagran(x,y) % x 为n 个节点的横坐标组成的向量,y 为纵坐标所组成的向量 % c 为所得插值函数的系数所组成的向量 w=length(x); n=w-1; l=zeros(w,w); for k=1:n+1 v=1; for j=1:n+1 if k~=j v=conv(v,poly(x(j)))/(x(k)-x(j)); end end l(k,:)=v; end c=y*l; function fi=Lagran_(x,f,xi) fi=zeros(size(xi)); n=length(f); for i=1:n

实验5 插值方法

实验5 插值方法 一、实验目的及意义 [1] 了解插值的基本原理 [2] 了解拉格朗日插值、线性插值、样条插值的基本思想; [3] 了解三种网格节点数据的插值方法的基本思想; [4] 掌握用MATLAB 计算三种一维插值和两种二维插值的方法; [5] 通过范例展现求解实际问题的初步建模过程; 通过自己动手作实验学习如何用插值方法解决实际问题,提高探索和解决问题的能力。通过撰写实验报告,促使自己提炼思想,按逻辑顺序进行整理,并以他人能领会的方式表达自己思想形成的过程和理由。提高写作、文字处理、排版等方面的能力。二、实验内 容 1.编写拉格朗日插值方法的函数M 文件;2.用三种插值方法对已知函数进行插值计算,通过数值和图形输出,比较它们的效果;3.针对实际问题,试建立数学模型,并求解。 三、实验步骤 1.开启软件平台——MATLAB ,开启MATLAB 编辑窗口; 2.根据各种数值解法步骤编写M 文件 3.保存文件并运行; 4.观察运行结果(数值或图形); 5.写出实验报告,并浅谈学习心得体会。 四、实验要求与任务 根据实验内容和步骤,完成以下具体实验,要求写出实验报告(实验目的→问题→数学模型→算法与编程→计算结果→分析、检验和结论→心得体会) 基础实验 1. 一维插值 利用以下一些具体函数,考察分段线性插值、三次样条插值和拉格朗日多项式插值等三种插值方法的差异。 1) 2 11 x +,x ∈[-5,5]; 2)sin x , x ∈[0,2π]; 3)cos 10 x , x ∈[0,2π]. 注意:适当选取节点及插值点的个数;比较时可以采用插值点的函数值与真实函数值的 差异,或采用两个函数之间的某种距离。 2.高维插值 对于二维插值的几种方法:最邻近插值、分片线性插值、双线性插值、三次插值等,利用如下函数进行插值计算,观察其插值效果变化,得出什么结论? 1) ())(sin ),(px t t x f -=ω,参数p =1/2000~1/200;采样步长为:t =4ms~4s ;

计算方法实验报告 插值

实验名称:插值计算 1引言 在生产和科研中出现的函数是多种多样的。常常会遇到这样的情况:在某个实际问题中,虽然可以断定所考虑的函数f(x)在区间[a,b]上存在且连续,但却难以找到它的解析表达式,只能通过实验和观测得到在有限个点上的函数值。用这张函数表来直接求出其他点的函数值是非常困难的,在有些情况下,虽然可以写出f(x)的解析表达式,但由于结构十分复杂,使用起来很不方便。面对这些情况,构造函数P(x)作为f(x)的近似,插值法是解决此类问题比较古老却目前常用的方法,不仅直接广泛地应用与生产实际和科学研究中,而且是进一步学习数值计算方法的基础。 设函数y=f(x)在区间[a,b]上连续,且在n+1个不同的点a≤x0,x1……,xn≤b上分别取值y0,y1……,yn. 插值的目的就是要在一个性质优良、便于计算的函数φ中,求一简单函数P(x),使P(xi)=yi(i=0,1…,n)而在其他点x≠xi上,作为f(x)的近似。 通常,称区间[a,b]为插值区间,称点x0,x1,…,xn为插值节点,上式为插值条件,称函数类φ为插值函数类,称P(x)为函数f(x)在节点x0,x1,…,xn处的插值函数,求插值函数P(x)的方法称为插值法。 2实验目的和要求 用matlab定义分段线性插值函数、分段二次插值函数、拉格朗日插值函数,输入所给函 数表,并利用计算机选择在插值计算中所需的节点,计算f(0.15),f(0.31),f(0.47)的近似值。

3算法描述 1.分段线性插值流程图

2.分段二次插值流程图

3.拉格朗日插值流程图

4程序代码及注释 1.分段线性插值

插值与多项式逼近的数组计算方法实验讲解

插值与多项式逼近的数组计算方法实验 郑发进 2012042020022 【摘要】计算机软件中经常要用到库函数,如) cos,x e,它们 (x (x sin,) 是用多项式逼近来计算的。虽然目前最先进的逼近方法是有理函数(即多项式的商),但多项式逼近理论更适于作为数值分析的入门课程。在已知数据具有高精度的情况下,通常用组合多项式来构造过给定数据点的多项式。构造组合多项式的方法有许多种,如线性方程求解、拉格朗日系数多项式以及构造牛顿多项式的方分和系数表。 关键字泰勒级数、拉格朗日插值法、牛顿插值法、帕德逼近 一、实验目的 1.通过具体实验,掌握泰勒级数、拉格朗日插值法、牛顿插值法、帕德逼近的编程技巧。 2.比较各插值方法的优劣并掌握。 二、实验原理 1.泰勒级数 在数学中,泰勒级数(英语:Taylor series)用无限项连加式——级数来表示一个函数,这些相加的项由函数在某一点的导数求得。 如果在点x=x 具有任意阶导数,则幂级数 称为在点x 处的泰勒级数。 =0,得到的级数 在泰勒公式中,取x 称为麦克劳林级数。函数的麦克劳林级数是x的幂级数,那么这种展开

是唯一的,且必然与的麦克劳林级数一致。 2.拉格朗日插值法 如对实践中的某个物理量进行观测,在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。这样的多项式称为拉格朗日(插值)多项式。数学上来说,拉格朗日插值法可以给出一个恰好穿过二维平面上若干个已知点的多项式函数。 在平面上有(x 1,y 1)(x 2,y 2)...(x n ,y n )共n 个点,现作一条函数f (x )使其图像经过这n 个点。 作n 个多项式p i (x),i=1,2,3...,n,使得 最后可得 3.牛顿插值法 插值法利用函数f (x)在某区间中若干点的函数值,作出适当的特定函数,在这些点上取已知值,在区间的其他点上用这特定函数的值作为函数f (x)的近似值。如果这特定函数是多项式,就称它为插值多项式。利用插值基函数很容易得到拉格朗日插值多项式,公式结构紧凑,在理论分析中甚为方便,但当插值节点增减时全部插值基函数均要随之变化,整个公式也将发生变化, 这在实际计算中是很不方便的,为了克服这一缺点,提出了牛顿插值。 牛顿插值通过求各阶差商,递推得到的一个公式: 10121()()()()()()N N N N P x P x a x x x x x x x x --=+---- 牛顿插值与拉格朗日插值具有唯一性。 4.帕德逼近 它不仅与逼近论中其他许多方法有着密切的关系,而且在实际问题特别是许多物理问题中有着广泛的应用。设是在原点某邻域内收敛的、具有复系数的麦克劳林级数。欲确定一个有理函数,式中,使得前次方的系数为0,即使得 此处约定qk =0(k>n )。虽然所求得的Pm(z)和Qn(z)不惟一,但是比式却总是惟一的。有理函数称为F(z)的(m,n)级帕德逼近,记为(m/n)。由(m/n)所形成的阵列称为帕德表。

数值分析常用的插值方法

数值分析报告 班级: 专业: 流水号: 学号: 姓名:

常用的插值方法 序言 在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。 早在6世纪,中国的刘焯已将等距二次插值用于天文计算。17世纪之后,牛顿、拉格朗日分别讨论了等距和非等距的一般插值公式。在近代,插值法仍然是数据处理和编制函数表的常用工具,又是数值积分、数值微分、非线性方程求根和微分方程数值解法的重要基础,许多求解计算公式都是以插值为基础导出的。 插值问题的提法是:假定区间[a,b〕上的实值函数f(x)在该区间上n+1个互不相同点x0,x1……x n处的值是f(x0),……f(x n),要求估算f(x)在[a,b〕中某点的值。其做法是:在事先选定的一个由简单函数构成的有n+1个参数C0, C1,……C n的函数类Φ(C0,C1,……C n)中求出满足条件P(x i)=f(x i)(i=0,1,……n)的函数P(x),并以P(x)作为f(x)的估值。此处f(x)称为被插值函数,x0,x1,……xn 称为插值结(节)点,Φ(C0,C1,……C n)称为插值函数类,上面等式称为插值条件,Φ(C0,……C n)中满足上式的函数称为插值函数,R(x)=f(x)-P(x)称为插值余项。

求解这类问题,它有很多种插值法,其中以拉格朗日(Lagrange)插值和牛顿(Newton)插值为代表的多项式插值最有特点,常用的插值还有Hermit 插值,分段插值和样条插值。 一.拉格朗日插值 1.问题提出: 已知函数()y f x =在n+1个点01,,,n x x x L 上的函数值01,,,n y y y L ,求任意一点 x '的函数值()f x '。 说明:函数()y f x =可能是未知的;也可能是已知的,但它比较复杂,很难计算其函数值()f x '。 2.解决方法: 构造一个n 次代数多项式函数()n P x 来替代未知(或复杂)函数()y f x =,则 用()n P x '作为函数值()f x '的近似值。 设()2012n n n P x a a x a x a x =++++L ,构造()n P x 即是确定n+1个多项式的系数 012,,,,n a a a a L 。 3.构造()n P x 的依据: 当多项式函数()n P x 也同时过已知的n+1个点时,我们可以认为多项式函数 ()n P x 逼近于原来的函数()f x 。根据这个条件,可以写出非齐次线性方程组: 20102000 20112111 2012n n n n n n n n n n a a x a x a x y a a x a x a x y a a x a x a x y ?++++=?++++=?? ? ?++++=?L L L L L 其系数矩阵的行列式D 为范德萌行列式: ()20 0021110 2111n n i j n i j n n n n x x x x x x D x x x x x ≥>≥= = -∏L L M M M M L

计算方法--插值法与拟合实验

实验三 插值法与拟合实验 一、实验目的 1. 通过本实验学会利用程序画出插值函数,并和原图形相比较 2. 通过本实验学会拟合函数图形的画法,并会求平方误差 二、实验题目 1. 插值效果的比较 实验题目:区间[]5,5-10等分,对下列函数分别计算插值节点k x 的值,进行不同类型的插值,作出插值函数的图形并与)(x f y =的图形进行比较: 2 11)(x x f +=; x x f arctan )(=; 4 41)(x x x f += (1) 做拉格朗日插值; (2) 做三次样条插值. 2. 拟合多项式实验 实验题目:给定数据点如下表所示: 分别对上述数据作三次多项式和五次多项式拟合,并求平方误差,作出离散函数),(i i y x 和拟合函数的图形. 三、实验原理 本实验应用了拉格朗日插值程序、三次样条插值程序、多项式拟合程序等实验原理. 四、实验内容 1(1) figure x=-5:0.2:5; y=1./(1+x.^2); plot(x,y,'r'); hold on %拉格朗日插值 x1=-5:1:5; y1=1./(1+x1.^2); xx=-4.5:0.5:4.5; yy=malagr(x1,y1,xx); plot(xx,yy,'+') %三次样条插值 dy0=1./(1+25); dyn=1./(1+25);

m=maspline(x1,y1,dy0,dyn,xx); plot(xx,m,'ok') 1(2) x=-5:0.2:5; y=atan(x); plot(x,y,'r'); hold on %拉格朗日插值 x1=-5:1:5; y1=atan(x1); xx=-4.5:0.5:4.5; yy=malagr(x1,y1,xx); plot(xx,yy,'+') %三次样条插值 dy0=1./(1+25); dyn=1./(1+25); m=maspline(x1,y1,dy0,dyn,xx); plot(xx,m,'ok') 1(3) x=-5:0.2:5; y=x.^2./(1+x.^4); plot(x,y,'r'); hold on %拉格朗日插值 x1=-5:1:5; y1=x1.^2./(1+x1.^4); xx=-4.5:0.5:4.5; yy=malagr(x1,y1,xx); plot(xx,yy,'+') %三次样条插值 dy0=1./(1+25); dyn=1./(1+25); m=maspline(x1,y1,dy0,dyn,xx); plot(xx,m,'ok') 2. x=[-1.5 -1.0 -0.5 0.0 0.5 1.0 1.5]'; y=[-4.45 -0.45 0.55 0.05 -0.44 0.54 4.55]'; plot(x,y,'or'); hold on %三次多项式拟合 p1=mafit(x,y,3);

数值计算方法实验报告

差值法实验日志 实验题目:插值法 实验目的: 1.掌握拉格朗日插值、牛顿插值、分段低次插值和样条插值的方法。 2.对四种插值结果进行初步分析。 实验要求: (1)写出算法设计思想; (2)程序清单; (3)运行的结果; (4)所得图形; (5)四种插值的比较; (6)对运行情况所作的分析以及本次调试程序所取的经验。如果程序未通过,应分析其原因。 实验主要步骤: 1.已知函数) f满足: (x x0.0 0.1 0.195 0.3 0.401 0.5 f(0.39894 0.39695 0.39142 0.38138 0.36812 x ) 0.35206 (1)用分段线性插值; 打开MATLAB,按以下程序输入: x0=-5:5; y0=1./(1+x0.^2); x=-5:0.1:5; y=1./(1+x.^2); y1=lagr(x0,y0,x); y2=interp1(x0,y0,x); y3=spline(x0,y0,x);

for k=1:11 xx(k)=x(46+5*k); yy(k)=y(46+5*k); yy1(k)=y1(46+5*k); yy2(k)=y2(46+5*k); yy3(k)=y3(46+5*k); end [xx;yy;yy2;yy3]' z=0*x; plot(x,z,x,y,'k--',x,y2,'r') plot(x,z,x,y,'k--',x,y1,'r') pause plot(x,z,x,y,'k--',x,y3,'r') 回车得以下图形:

(2) 拉格朗日插值。 创建M 文件,建立lagr 函数: function y=lagr1(x0,y0,x) n=length(x0);m=length(x); for i=1:m z=x(i); s=0.0; for k=1:n p=1.0; for j=1:n if j~=k p=p*(z-x0(j))/(x0(k)-x0(j)); end end s=p*y0(k)+s; end y(i)=s; end 新建一个M 文件,输入: x0=[0.0 0.1 0.195 0.3 0.401 0.5]; y0=[0.39894 0.39695 0.39142 0.38138 0.36812 0.35206]; x=0.0:0.01:0.5; y1=lagr1(x0,y0,x); 00.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1

实验四 Lagrange函数插值方法(新)

实验四 Lagrange函数插值方法 一、问题提出 对于给定的一元函数的n+1个节点值 。试用Lagrange公式求其插值多项式或分段二次Lagrange 插值多项式。 数据如下: 试构造Lagrange多项式L,计算和的值。 二、要求 1、利用Lagrange插值公式 编写出插值多项式程序; 2、给出插值多项式或分段三次插值多项式的表达式; 3、根据节点选取原则,对问题(2)用三点插值或二点插值,其结果如何; 4、对此插值问题用Newton插值多项式其结果如何。 三、目的和意义 1、学会常用的插值方法,求函数的近似表达式,以解决其它实际问题; 2、明确插值多项式和分段插值多项式各自的优缺点; 3、熟悉插值方法的程序编制; 4、如果绘出插值函数的曲线,观察其光滑性。 四、实验源代码 #include #define N 7 float x[] = {1,2,3,4,5,6,7}; float y[] = {0.368,0.135,0.050,0.018,0.007,0.002,0.001}; float p(float xx)

{ int i,k; _______________ for( i=0; i

计算方法实验一

江苏科技大学 电子信息学院 实验报告 实验名称:插值方法 学号:姓名:班级: 完成日期:2014年10月20日

实验一 插值方法 一、实验目的及意义 [1] 了解插值的基本原理 [2] 了解拉格朗日插值、线性插值、样条插值的基本思想; [3] 了解三种网格节点数据的插值方法的基本思想; [4] 掌握用MATLAB 计算三种一维插值和两种二维插值的方法; [5] 通过范例展现求解实际问题的初步建模过程; 通过自己动手作实验学习如何用插值方法解决实际问题,提高探索和解决问题的能力。通过撰写实验报告,促使自己提炼思想,按逻辑顺序进行整理,并以他人能领会的方式表达自己思想形成的过程和理由。提高写作、文字处理、排版等方面的能力。 二、实验内容 1.用MATLAB 或Visual C++实现拉格朗日插值方法;2.用三种插值方法对已知函数进行插值计算,通过数值和图形输出,比较它们的效果;3.针对实际问题,试建立数学模型, 并求解。 三、实验步骤 1.开启软件平台——MATLAB 或Visual C++,开启其编辑窗口; 2.根据各种数值解法步骤编写成代码文件; 3.保存文件并运行; 4.观察运行结果(数值或图形); 5.写出实验报告,并浅谈学习心得体会。 四、实验要求与任务 根据实验内容和步骤,完成以下具体实验,要求写出实验报告(实验目的→问题→数学模型→算法与编程→计算结果→分析、检验和结论→心得体会) 基础实验 1. 一维插值 利用以下一些具体函数,考察分段线性插值、三次样条插值和拉格朗日多项式插值等三种插值方法的差异。 1) 2 11 x +,x ∈[-5,5]; 2)sin x , x ∈[0,2π]; 3)cos 10 x , x ∈[0,2π]. 注意:适当选取节点及插值点的个数;比较时可以采用插值点的函数值与真实函数值的 差异,或采用两个函数之间的某种距离。 附上你的源代码和比较结果。

相关文档
最新文档