当前位置:文档之家› 数值分析实验报告:拉格朗日插值法和牛顿插值法

数值分析实验报告:拉格朗日插值法和牛顿插值法

数值分析实验报告:拉格朗日插值法和牛顿插值法
数值分析实验报告:拉格朗日插值法和牛顿插值法

实验一报告

拉格朗日插值法

一、实验目的

1、学习和掌握拉格朗日插值多项式

2、运用拉格朗日插值多项式进行计算

二、实验原理

根据x0,x1,…xn;y0,y1,…yn构造插值多项式其表达式为:

将插值点x代入上式,就可得到函数f(x)在点x处的函数值的近似值。

三、运行结果

四、代码

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication3

{

class Program

{

static double lglr(double[] x, double[] y, double x1, int n) {

double result = 0.0;

for (int i = 0; i

{

double temp = y[i];

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

{

if (j == i)

continue;

temp = temp * (x1 - x[j]);

temp = temp / (x[i] - x[j]);

}

result = result + temp;

}

return result;

}

static void Main(string[] args)

{

double[] x;

double[] y;

Console.WriteLine("请输入插值点数:");

int length = Convert.ToInt32(Console.ReadLine());

x = new double[length];

y = new double[length];

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

{

Console.Write("请输入第{0}个点的x值:", i + 1);

x[i] = Convert.ToDouble(Console.ReadLine());

Console.Write("请输入第{0}个点的y值:", i + 1);

y[i] = Convert.ToDouble(Console.ReadLine());

}

Console.WriteLine("请输入x1值:");

double x1 = Convert.ToDouble(Console.ReadLine());

double result=lglr(x,y,x1,length);

Console.Write("插值计算结果为:{0}:", result);

Console.ReadLine();

}

牛顿插值法

一、实验目的

体会并了解牛顿插值法,用计算机插入x值,输出相应的y值。

二、实验原理

根据x0,x1,…x n;y0,y1,…y n构造插值多项式Nn(x)=f(x0)+f(x0,x1)(x-x0)+…

+f(x0,x1,…xn)(x-x0)(x-x1)…(x-xn-1)牛顿差值公式中各项的系数就是函f(x)的各阶均差(差商)f(x0),f(x0,x1),f(x0,x1,…xn),因此,在构造牛顿差值公式时,常常先把均差列成一个表,此表称为均差表。

三、运行结果

四、代码

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace newton

{

class Program

{

static double chashang(int n, double[] x, double[] y) {

double f = 0;

double temp = 0;

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

{

temp = y[i];

for (int j = 0; j < n + 1; j++)

if (i != j) temp /= (x[i] - x[j]);

f += temp;

}

return f;

}

static double niudun(double[] x, double[] y, double x1) {

double result = 0.0;

for (int i = 0; i < x.Length; i++)

{

double f = chashang(i, x, y);

double temp = 1.0;

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

{

temp = temp * (x1 - x[j]);

}

result = result + f * temp;

}

return result;

}

static void Main(string[] args)

{

double[] x;

double[] y;

Console.WriteLine("请输入插值点数:");

int length = Convert.ToInt32(Console.ReadLine());

x = new double[length];

y = new double[length];

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

{

Console.Write("请输入第{0}个点的x值:", i + 1);

x[i] = Convert.ToDouble(Console.ReadLine());

Console.Write("请输入第{0}个点的y值:", i + 1);

y[i] = Convert.ToDouble(Console.ReadLine());

}

Console.WriteLine("请输入x1值:");

double x1 = Convert.ToDouble(Console.ReadLine());

double result = niudun(x, y, x1);

Console.Write("插值计算结果为:{0}:", result);

Console.ReadLine();

}

}

}

五、分析

当插值多项式从n-1次增加到n次时,拉格朗日型插值必须重新计算所有的基本差值多项式;二对于牛顿插值,只需要表格再计算一个n阶均差,然后加上一项就可以了。这样大大减少了计算量,特别在计算结构复杂的多项式的时候,当然本实验中的数据组很少,计算机的计算速度快慢不明显而难以比较两种方法的优劣。

牛顿插值法原理及应用

牛顿插值法 插值法是利用函数f (x)在某区间中若干点的函数值,作出适当的特定函数,在这些点上取已知值,在区间的其他点上用这特定函数的值作为函数f (x)的近似值。如果这特定函数是多项式,就称它为插值多项式。当插值节点增减时全部插值基函数均要随之变化,这在实际计算中很不方便。为了克服这一缺点,提出了牛顿插值。牛顿插值通过求各阶差商,递推得到的一个公式: f(x)=f[x0]+f[x0,x1](x-x0)+f[x0,x1,x2](x-x0)(x-x1)+...f[x0,...xn](x-x0 )...(x-xn-1)+Rn(x)。 插值函数 插值函数的概念及相关性质[1] 定义:设连续函数y-f(x) 在区间[a,b]上有定义,已知在n+1个互异的点 x0,x1,…xn上取值分别为y0,y1,…yn (设a≤ x1≤x2……≤xn≤b)。若在函数类中存在以简单函数P(x) ,使得P(xi)=yi,则称P(x) 为f(x)的插值函数. 称x1,x2,…xn 为插值节点,称[a,b]为插值区间。 定理:n次代数插值问题的解存在且唯一。

牛顿插值法C程序 程序框图#include void main() { float x[11],y[11][11],xx,temp,newton; int i,j,n; printf("Newton插值:\n请输入要运算的值:x="); scanf("%f",&xx); printf("请输入插值的次数(n<11):n="); scanf("%d",&n); printf("请输入%d组值:\n",n+1); for(i=0;i

插值法数值上机实验报告

插值法数值上机实验报告 实验题目: 利用下列条件做插值逼近,并与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插值图像对原函数图像的逼近情形。见下图:

拉格朗日插值实验报告

实验名称: 实验一拉格朗日插值 1引言 我们在生产生活中常常会遇到这样的问题: 某个实际问题中,函数f(x)在区间[a,b ]上存在 且连续,但却很难找到其表达式,只能通过实验和观测得到有限点上的函数表。显然,根据 这些点的函数值来求其它点的函数值是非常困难的。有些情况虽然可以写出表达式,但结构 复杂,使用不方便。所以我们总是希望根据已有的数据点(或函数表)来构造某个简单函数 P(x)作为f(x)的近似值。插值法是解决此类问题的一种比较古老的、 但却很常用的方法。它不 仅直接广泛地应用于生产实际和科学研究中,而且也是进一步学习数值计算方法的基础。 2实验目的和要求 运用Matlab 编写三个.m 文件,定义三种插值函数,要求一次性输入整函数表,并利用 计算机选择在插值计算中所需的节点。分别通过分段线性插值、分段二次插值和全区间上拉 格朗日插值计算 f(0.15),f(0.31),f(0.47)的近似值。已知函数表如下: 3算法原理与流程图 (1)原理 设函数y=在插值区间[a,b ]上连续,且在n+1个不同的插值节点a^X o ,x 1,…,x wb 上分别取 值 y o ,y 1,…,y n 。目的是要在一个性质优良、便于计算的插值函数类 ①中,求一简单函数P(x), 满足插值条 件P(X i )=y i (i=0,1,…”n)而在其他点x I 上,作为f(x)近似值。求插值函数P(x)的 方法称为插值法。在本实验中,采用拉格朗日插值法。 ①分段低次插值 当给定了 n+1个点X 0VXK …

数值分析拉格朗日插值法上机实验报告

课题一:拉格朗日插值法 1.实验目的 1.学习和掌握拉格朗日插值多项式。 2.运用拉格朗日插值多项式进行计算。 2.实验过程 作出插值点(1.00,0.00),(-1.00,-3.00),(2.00,4.00)二、算法步骤 已知:某些点的坐标以及点数。 输入:条件点数以及这些点的坐标。 输出:根据给定的点求出其对应的拉格朗日插值多项式的值。 3.程序流程: (1)输入已知点的个数; (2)分别输入已知点的X坐标; (3)分别输入已知点的Y坐标; 程序如下: #include #include #include float lagrange(float *x,float *y,float xx,int n) /*拉格朗日

插值算法*/ { int i,j; float *a,yy=0.0; /*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++) { printf("x[%d]:",i); scanf("%f",&x[i]); } printf("\n"); for(i=0;i<=n-1;i++) { printf("y[%d]:",i);scanf("%f",&y[i]); } printf("\n"); printf("Input xx:"); scanf("%f",&xx); yy=lagrange(x,y,xx,n); printf("x=%f,y=%f\n",xx,yy); getch(); } 举例如下:已知当x=1,-1,2时f(x)=0,-3,4,求f(1.5)的值。

matlab实现Lagrange多项式插值观察龙格现象

Matlab进行Lagrange多项式插值 拉格朗日插值法对函数y=1./(1+25*x.^2)在区间[-1,1]进行5次、10次、15次插值观察龙格现象 主程序 1.拉格朗日 function [c,l]=lagran(x,y) %c为多项式函数输出的系数 %l为矩阵的系数多项式 %x为横坐标上的坐标向量 %y为纵坐标上的坐标向量 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; 2.在matlab窗口中输入: x=linspace(-1,1,6);y=1./(1+25*x.^2); lagran(x,y) 回车可得结果: ans = -0.0000 1.2019 -0.0000 -1.7308 -0.0000 0.5673 在matlab窗口中输入: x=linspace(-1,1,11);y=1./(1+25*x.^2); lagran(x,y) 回车可得结果: ans = -220.9417 0.0000 494.9095 -0.0000 -381.4338 -0.0000 123.3597 0.0000 -16.8552 0.0000 1.0000 在matlab窗口中输入: x=linspace(-1,1,16);y=1./(1+25*x.^2); lagran(x,y) 回车可得结果: ans =

1.0e+003 * Columns 1 through 14 0.0000 -1.5189 -0.0000 4.6511 -0.0000 -5.5700 0.0000 3.3477 0.0000 -1.0830 -0.0000 0.1901 -0.0000 -0.0180 Columns 15 through 16 0.0000 0.0010 3.由以上结果可定义一下函数: function y=f1(x) y=1./(1+25*x.^2); function y=f2(x) y=1.2019*x.^4 -1.7308*x.^2+0.5673; function y=f3(x) y=-220.9417*x.^10+494.9095*x.^8-381.4338*x.^6+123.3597*x.^4-16.8552*x.^2+1; function y=f4(x) y=1*10^3*(-1.5189*x.^14+4.6511*x.^12-5.5700*x.^10+3.3477*x.^8-1.0830*x.^6+0.1901*x.^4-0.0180*x.^2+0.0010) 4. 在matlab窗口中输入: s1=@f1;s2=@f2;s3=@f3;s4=@f4;fplot(s1,[-1 1],'r');hold on;fplot(s2,[-1 1],'k');hold on;fplot(s3,[-1 1],'g');hold on;fplot(s4,[-1 1],'b');xlabel('input');ylabel('output');title('龙格现象');legend('s1=f(x)','s2=L5(x)','s3=L10(x)','s4=L15(X)');grid on 可以得到下图:

数值分析实验报告记录

数值分析实验报告记录

————————————————————————————————作者:————————————————————————————————日期:

数值分析实验报告 (第二章) 实验题目: 分别用二分法、牛顿迭代法、割线法、史蒂芬森迭代法求方程 的根,观察不同初始值下的收敛性,并给出结论。 问题分析: 题目有以下几点要求: 1.不同的迭代法计算根,并比较收敛性。 2.选定不同的初始值,比较收敛性。 实验原理: 各个迭代法简述 二分法:取有根区间的重点,确定新的有根区间的区间长度仅为区间长度的一版。对压缩了的有根区间重复以上过程,又得到新的有根区间,其区间长度为的一半,如此反复,……,可得一系列有根区间,区间收敛到一个点即为根。 牛顿迭代法:不动点迭代法的一种特例,具有局部二次收敛的特性。迭代格式为 割线法:是牛顿法的改进,具有超线性收敛的特性,收敛阶为1.618. 迭代格式为 史蒂芬森迭代法:采用不动点迭代进行预估校正。至少是平方收敛的。迭代格式为 这里可采用牛顿迭代法的迭代函数。 实验内容:

1.写出该问题的函数代码如下: function py= f(x) syms k; y=(k^2+1)*(k-1)^5; yy=diff(y,k); py(1)=subs(y,k,x); py(2)=subs(yy,k,x); end 2.分别写出各个迭代法的迭代函数代码如下: 二分法: function y=dichotomie(a,b,e) i=2; m(1)=a; while abs(a-b)>e t=(a+b)/2; s1=f(a); s2=f(b); s3=f(t); if s1(1)*s3(1)<=0 b=t; else a=t; end m(i)=t; i=i+1; end y=[t,i+1,m]; end 牛顿迭代法: function y=NewtonIterative(x,e) i=2; en=2*e;m(1)=x; while abs(en)>=e s=f(x); t=x-s(1)/s(2); en=t-x; x=t; m(i)=t; i=i+1; end y=[x,i+1,m]; end 牛顿割线法: function y=Secant(x1,x2,e) i=3; m(1)=x1,m(2)=x2; while abs(x2-x1)>=e s1=f(x1); s2=f(x2); t=x2-(x2-x1)*s2(1)/(s2(1)-s1( 1)); x1=x2; x2=t; m(i)=t; i=i+1; end

插值法实验报告

实验二插值法 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

实验二 拉格朗日插值龙格现象

汕 头 大 学 实 验 报 告 学院: 工学院系: 计算机系专业: 计算机科学与技术年级:2010 姓名: 林金正学号:2010101032完成实验时间: 5月24日 一.实验名称:拉格朗日插值的龙格现象 二.实验目的: 通过matlab 处理,观察拉格朗日插值的龙格现象. 三.实验内容: (1)学习matlab 的使用 (2)以实验的方式,理解高阶插值的病态性,观察拉格朗日插值的龙格现象。 四.实验时间、地点,设备: 实验时间:5月24日 实验地点:宿舍 实验设备:笔记本电脑 五,实验任务 在区间[-5,5]上取节点数n=11,等距离h=1的节点为插值点,对于函数2 5()1f x x =+进行拉格朗日插值,把f(x)与插值多项式的曲线花在同一张图上。 六.实验过程 拉格朗日插值函数定义: 对某个多项式函数,已知有给定的k + 1个取值点: 其中对应著自变数的位置,而对应著函数在这个位置的取值。 假设任意两个不同的xj 都互不相同,那麼应用拉格朗日插值公式所得到的拉格朗日插值多项式为: 其中每个为拉格朗日基本多项式(或称插值基函数),其表达式为: [3] 拉格朗日基本多项式 的特点是在上取值为1,在其它的点上取值为0。

1.使用matlab,新建function.m 文件,使用老师所给代码,构建拉格朗日函数. %lagrange.m function y=lagrange(x0,y0,x) n=length(x0); m=length(x); fori=1:m z=x(i);s=0; for k=1:n L=1; for j=1:n if j~=k L=L*(z-x0(j))/(x0(k)-x0(j)); end end s=s+L*y0(k); end y(i)=s; end y; 程序解释: (x0,y0):已知点坐标 x:所求点的横坐标, y:由(x0,y0)所产生的插值函数,以x 为参数,所的到的值 2.再一次新建function.m 文件. 构建自定义函数:25()1f x x = + %f.m function y = f(x) y = 5/(1+x*x); end 3.在脚本窗口中输入: >>a = [-10:0.2:10] >>for I = 1:length(a) b(i) = f(a(i)) end ;%画出原函数(a,b) >>c = [-5:1:5] >>for i = 1:length( c) d(i) = f(c(i))

牛顿插值法试验报告

. 牛顿插值法一、实验目的:学会牛顿插值法,并应用算法于实际问题。 x?x)f(二、实验内容:给定函数,已知: 4832401.2)?.?1449138f(2.f.f(20)?1.414214(2.1) 549193.)?1f(2.4516575(f2.3)?1. 三、实验要求:以此作为函数2.15插值多项式在处的值,用牛顿插值法求4 次Newton( 1)2.15?N(2.15)。在MATLAB中用内部函数ezplot绘制出的近似值4次Newton插值多项式的函数图形。 (2)在MATLAB中用内部函数ezplot可直接绘制出以上函数的图形,并与作出的4次Newton插值多项式的图形进行比较。 四、实验过程: 1、编写主函数。打开Editor编辑器,输入Newton插值法主程序语句: function [y,L]=newdscg(X,Y,x) n=length(X); z=x; A=zeros(n,n);A(:,1)=Y';s=0.0; p=1.0; for j=2:n for i=j:n A(i,j)=(A(i,j-1)- A(i-1,j-1))/(X(i)-X(i-j+1)); end end C=A(n,n); for k=(n-1):-1:1 C=conv(C,poly(X(k))); d=length(C);C(d)=C(d)+A(k,k); end y(k)= polyval(C, z); L(k,:)=poly2sym(C); 0 / 3 . %%%%%%%%%%%%%%%%%% t=[2,2.1,2.2,2.3,2.4]; fx=sqrt(t); wucha=fx-Y; 以文件名newdscg.m保存。 2、运行程序。 (1)在MATLAB命令窗口输入: >> X=[2,2.1,2.2,2.3,2.4]; Y =[1.414214,1.449138,1.483240,1.516575,1.549193]; x=2.15;[y,P]=newdscg(X,Y,x) 回车得到:

数值分析实验报告-插值、三次样条(教育教学)

实验报告:牛顿差值多项式&三次样条 问题:在区间[-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)。

计算方法上机实验报告——拉格朗日插值问题

计算方法上机实验报告——拉格朗日插值问题 一、方法原理 n次拉格朗日插值多项式为:Ln(x)=y0l0(x)+y1l1(x)+y2l2(x)+…+ynln(x) n=1时,称为线性插值,L1(x)=y0(x-x1)/(x0-x1)+y1(x-x0)/(x1-x0)=y0+(y1-x0)(x-x0)/(x1-x0) n=2时,称为二次插值或抛物线插值,精度相对高些 L2(x)=y0(x-x1)(x-x2)/(x0-x1)/(x0-x2)+y1(x-x0)(x-x2)/(x1-x0)/(x1-x 2)+y2(x-x0)(x-x1)/(x2-x0)/(x2-x1) 二、主要思路 使用线性方程组求系数构造插值公式相对复杂,可改用构造方法来插值。 对节点xi(i=0,1,…,n)中任一点xk(0<=k<=n)作一n次多项式lk(xk),使它在该点上取值为1,而在其余点xi(i=0,1,…,k-1,k+1,…,n)上为0,则插值多项式为Ln(x)=y0l0(x)+y1l1(x)+y2l2(x)+…+ynln(x) 上式表明:n个点xi(i=0,1,…,k-1,k+1,…,n)都是lk(x)的零点。可求得lk 三.计算方法及过程:1.输入节点的个数n 2.输入各个节点的横纵坐标 3.输入插值点 4.调用函数,返回z 函数语句与形参说明 程序源代码如下: 形参与函数类型 参数意义 intn 节点的个数 doublex[n](double*x) 存放n个节点的值 doubley[n](double*y) 存放n个节点相对应的函数值 doublep 指定插值点的值 doublefun() 函数返回一个双精度实型函数值,即插值点p处的近似函数值 #include #include usingnamespacestd; #defineN100 doublefun(double*x,double*y,intn,doublep); voidmain() {inti,n; cout<<"输入节点的个数n:"; cin>>n;

matlab(迭代法-牛顿插值)Word版

实验报告内容: 一:不动点迭代法解方程 二:牛顿插值法的MATLAB实现 完成日期:2012年6月21日星期四 数学实验报告一 日期:2012-6-21

所以,确定初值为x0=1 二:不断迭代 算法: 第一步:将f(x0)赋值给x1 第二步:确定x1-x0的绝对值大小,若小于给定的误差值,则将x1当做方程的解,否则回到第一步 编写计算机程序: clear f=inline('0.5*sin(x)+0.4'); x0=1; x1=f(x0); k=1; while abs(x1-x0)>=1.0e-6 x0=x1; x1=f(x0); k=k+1; fprintf('k=%.0f,x0=%.9f,x1=%.9f\n',k,x0,x1) end 显示结果如下: k=2,x0=0.820735492,x1=0.765823700 k=3,x0=0.765823700,x1=0.746565483 k=4,x0=0.746565483,x1=0.739560873

k=6,x0=0.736981783,x1=0.736027993 k=7,x0=0.736027993,x1=0.735674699 k=8,x0=0.735674699,x1=0.735543758 k=9,x0=0.735543758,x1=0.735495216 k=10,x0=0.735495216,x1=0.735477220 k=11,x0=0.735477220,x1=0.735470548 k=12,x0=0.735470548,x1=0.735468074 k=13,x0=0.735468074,x1=0.735467157 >>。。。 以下是程序运行截图:

数值分析实验一——拉格朗日插值算法报告

拉格朗日插值算法的实现 实验报告 姓名:** 年级:****专业:计算机科学与技术科目:数值分析题目:拉格朗日插值算法的实现 实验时间: 2014年5月27日实验成绩: 实验教师: 一、实验名称:拉格朗日插值算法的实现 二、实验目的: a. 验证拉格朗日插值算法对于不同函数的插值 b. 验证随着插值结点的增多插值曲线的变化情况。 三、实验内容: 拉格朗日插值基函数的一般形式: 也即是: 所以可以得出拉格朗日插值公式的一般形式: 其中, n=1时,称为线性插值,P1(x) = y0*l0(x) + y1*l1(x) n=2时,称为二次插值或抛物插值,精度相对高些,P2(x) = y0*l0(x) + y1*l1(x) + y2*l2(x) 四、程序关键语句描写 double Lagrange(int n,double X[],double Y[],double x) { double result=0; for (int i=0;i

for(int j=0;j #include using namespace std; int main() { double Lagrange(int n,double X[],double Y[],double x); //插值函数double x;//要求插值的x的值 double result;//插值的结果 char a='n'; double X[20],Y[20]; do { cout<<"请输入插值次数n的值:"<>n; cout<<"请输入插值点对应的值及函数值(xi,yi):"<>X[k]>>Y[k]; } cout<<"请输入要求值x的值:"<>x; result=Lagrange(n,X,Y,x); cout<<"由拉格朗日插值法得出结果:"<>a; }while(a=='yes'); return 0; }

拉格朗日插值龙格现象的matlab实现

拉格朗日插值龙格现象的MATLAB 实现 姓名:袁宽 学号:2 专业:电气工程 题目:对于函数2 11)(x x f +=,55≤≤-x 进行拉格朗日插值。10=n ,按等距节点求分段线性插值,把)(x f 和插值多项式的曲线画在同一张图上进行比较。观察Lagrange 插值及数值积分中的分段性插值。 f.m : function f= f( x ) f=1./(1+x.^2); end Lagrange.m function y=Lagrange(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 拉格朗日插值的曲线: x=[-5:1:5]; y=1./(1+x.^2); x0=[-5:0.001:5]; y0=Lagrange(x,y,x0); y1=1./(1+x0.^2); plot(x0,y0,'b') hold on plot(x0,y1,'r') 使用龙格现象观察分段性插值的曲线:syms y x lx; y=1/(1+x^2); x0=-5:1:5; y0=zeros(1,length(x0)); for i=1:11 x=x0(i);

y0(i)=eval(y); end M = -5:0.01:5; y1 = zeros(1,length(M)); n = 1; for i=2:11 for x=-5:0.01:5 if x=x0(i-1) lx(1)=y0(i-1)*(x-x0(i))/(x0(i-1)-x0(i)); lx(2)=y0(i)*(x-x0(i-1))/(x0(i)-x0(i-1)); y1(n) = lx(1)+lx(2); n = n+1; end end end ezplot(y,[-5,5]) hold on A =-5:0.01:5; plot(A,y1,'r'); 分别运行两个文件后的得到两个图形曲线:

龙格现象实验报告1

数值分析实验报告 实验名称:观察龙格(Runge)现象实验 班级:12级信息与计算科学(1)班 姓名: 学号:33 16 17 59 实验日期: 2014.10.11 周次: 6 实验地点: A14-504

多种插值对比 function y=fun(x); y=5./(1+x.^2); end hours=-5:5; h=-5:0.1:5; temps=fun(hours); t1=interp1(hours,temps,h,'spline'); %(?±?óê?3?êy?Y??ê?oü?àμ?) t2=interp1(hours,temps,h, 'nearest'); t3=interp1(hours,temps,h, 'linear'); t4=interp1(hours,temps,h, 'cubic'); subplot(2,2,1); plot(hours,temps, ' bo',h,t1, 'r'); title('spline '); %×÷í? subplot(2,2,2); plot(hours,temps, 'bo',h,t2, 'r'); title(' nearest'); subplot(2,2,3); plot(hours,temps, 'bo',h,t3, 'r'); title('linear'); subplot(2,2,4); plot(hours,temps, 'bo',h,t4, 'r', h,t1, 'g'); title('cubic-spline'); -5 05 spline -5 05 nearest -5 05 linear -5 05 cubic-spline

数值分析课程实验报告-拉格朗日和牛顿插值法

《数值分析》课程实验报告 用拉格朗日和牛顿插值法求解函数值 算法名称用拉格朗日和牛顿插值法求函数值 学科专业xxxxx 作者姓名xxxx 作者学号xxxxx 作者班级xxxxxx xxx大学 二〇一五年十二月

《数值分析》课程实验报告

得到的近似值为。 拉格朗日插值模型简单,结构紧凑,是经典的插值法。但是由于拉格朗日的插值多项式和每个节点都有关,当改变节点个数时,需要重新计算。且当增大插值阶数时容易出现龙格现象。 2.牛顿插值法 在命令窗口输入: x=[ ]; y=[ ]; xt=; [yt,N]=NewtInterp(x,y,xt) z=::2; yz=subs(N,'t',z); figure; plot(z,sqrt(z),'--r',z,yz,'-b') hold on plot(x,y,'marker','+') hold on plot(xt,yt,'marker','o') h=legend('$\sqrt{x}$','牛顿','$(x_k,y_k)$','$x=$'); set(h,'Interpreter','latex') xlabel('x') ylabel('y') 得到结果及图像如下: yt = N = - *t^4 + *t^3 - *t^2 + *t +

得到√的近似值为,插值函数为 N =- *t^4 + *t^3 - *t^2 + *t + , 其计算精度是相当高的。 Lagrange插值法和Newton插值法解决实际问题中关于只提供复杂的离散数据的函数求值问题,通过将所考察的函数简单化,构造关于离散数据实际函数f(x)的近似函数P(x),从而可以计算未知点出的函数值,是插值法的基本思路。 实际上Lagrange插值法和Newton插值法是同一种方法的两种变形,其构造拟合函数的思路是相同的,而实验中两个实际问题用两种算法计算出结果是相同的。

拉格朗日插值、牛顿插值的matlab代码

实验五多项式插值逼近 信息与计算科学金融崔振威201002034031 一、实验目的: 拉格朗日插值和牛顿插值的数值实现 二、实验内容:p171.1、p178.1、龙格现象数值实现 三、实验要求: 1、根据所给题目构造相应的插值多项式, 2、编程实现两类插值多项式的计算 3、试分析多项式插值造成龙格现象的原因 主程序 1、拉格朗日 function [c,l]=lagran(x,y) %c为多项式函数输出的系数 %l为矩阵的系数多项式 %x为横坐标上的坐标向量 %y为纵坐标上的坐标向量 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 [p2,z]=newTon(x,y,t) %输入参数中x,y为元素个数相等的向量 %t为插入的定点 %p2为所求得的牛顿插值多项式 %z为利用多项式所得的t的函数值。 n=length(x); chaS(1)=y(1); for i=2:n x1=x;y1=y; x1(i+1:n)=[];

y1(i+1:n)=[]; n1=length(x1); s1=0; for j=1:n1 t1=1; for k=1:n1 if k==j %如果相等则跳出循环 continue; else t1=t1*(x1(j)-x1(k)); end end s1=s1+y1(j)/t1; end chaS(i)=s1; end b(1,:)=[zeros(1,n-1) chaS(1)]; cl=cell(1,n-1); %cell定义了一个矩阵 for i=2:n u1=1; for j=1:i-1 u1=conv(u1,[1 -x(j)]); %conv()用于多项式乘法、矩阵乘法 cl{i-1}=u1; end cl{i-1}=chaS(i)*cl{i-1}; b(i,:)=[zeros(1,n-i),cl{i-1}]; end p2=b(1,:); for j=2:n p2=p2+b(j,:); end if length(t)==1 rm=0; for i=1:n rm=rm+p2(i)*t^(n-i); end z=rm; else k1=length(t); rm=zeros(1,k1); for j=1:k1 for i=1:n rm(j)=rm(j)+p2(i)*t(j)^(n-i); end

牛顿插值法实验报告

牛顿插值法 一、实验目的:学会牛顿插值法,并应用算法于实际问题。 二、实验内容:给定函数 x x f =)(,已知: 414214.1)0.2(=f 449138.1)1.2(=f 483240.1)2.2(=f 516575.1)3.2(=f 549193.1)4.2(=f 三、实验要求: (1)用牛顿插值法求4次Newton 插值多项式在2.15处的值,以此作为函数的近似值)15.2(15.2N ≈。在MATLAB 中用内部函数ezplot 绘制出4次Newton 插值多项式的函数图形。 (2)在MATLAB 中用内部函数ezplot 可直接绘制出以上函数的图形,并与作出的4次Newton 插值多项式的图形进行比较。 四、实验过程: 1、编写主函数。打开Editor 编辑器,输入Newton 插值法主程序语句: function [y,L]=newdscg(X,Y,x) n=length(X); z=x; A=zeros(n,n);A(:,1)=Y';s=0.0; p=1.0; for j=2:n for i=j:n A(i,j)=(A(i,j-1)- A(i-1,j-1))/(X(i)-X(i-j+1)); end end C=A(n,n); for k=(n-1):-1:1 C=conv(C,poly(X(k))); d=length(C);C(d)=C(d)+A(k,k); end y(k)= polyval(C, z); L(k,:)=poly2sym(C);

%%%%%%%%%%%%%%%%%% t=[2,2.1,2.2,2.3,2.4]; fx=sqrt(t); wucha=fx-Y; 以文件名newdscg.m保存。 2、运行程序。 (1)在MATLAB命令窗口输入: >> X=[2,2.1,2.2,2.3,2.4]; Y =[1.414214,1.449138,1.483240,1.516575,1.549193]; x=2.15;[y,P]=newdscg(X,Y,x) 回车得到: y =1.4663 wucha =1.0e-06 * -0.4376 -0.3254 -0.3026 0.0888 0.3385 P = - (4803839603609061*x^4)/2305843009213693952 + (7806239355294329*x^3)/288230376151711744 - (176292469178709*x^2)/1125899906842624 + (1624739243112817*x)/2251799813685248 + 1865116246031207/4503599627370496 (2)在MATLAB命令窗口输入: >> v=[0,6,-1,3]; >> ezplot(P),axis(v),grid >> hold on >> x=0:0.1:6; >> yt=sqrt(x);plot(x,yt,':') >> legend('插值效果','原函数') >> xlabel('X') >> ylabel('Y') >>title('Newton插值与原函数比较') 回车即可得到图像1-1。

相关主题
文本预览
相关文档 最新文档