matlab实现数值分析报告插值及积分

合集下载

MATLAB数值实验一(数据的插值运算及其应用完整版)

MATLAB数值实验一(数据的插值运算及其应用完整版)

佛山科学技术学院实 验 报 告课程名称 数值分析 实验项目 插值法与数据拟合 专业班级 机械工程 姓 名 余红杰 学 号 10 指导教师 陈剑 成 绩 日 期 月 日一、实验目的1、学会Lagrange 插值、牛顿插值和三次样条插值等基本插值方法;2、讨论插值的Runge 现象3、学会Matlab 提供的插值函数的使用方法,会用这些函数解决实际问题。

二、实验原理1、拉格朗日插值多项式2、牛顿插值多项式3、三次样条插值 三、实验步骤1、用MATLAB 编写独立的拉格朗日插值多项式函数2、用MATLAB 编写独立的牛顿插值多项式函数3、用MATLAB 编写独立的三次样条函数(边界条件为第一、二种情形)4、已知函数在下列各点的值为:根据步骤1,2,3编好的程序,试分别用4次拉格朗日多项式4()L x 、牛顿插值多项式4()P x 以及三次样条函数()S x (自然边界条件)对数据进行插值,并用图给出 {(,),0.20.08,0,1,2,,10i i i x y x i i =+=},4()L x 、4()P x 和()S x 。

5、在区间[-1,1]上分别取10,20n =用两组等距节点对龙格函数21(),(11)125f x x x=-≤≤+作多项式插值,对不同n 值,分别画出插值函数及()f x 的图形。

6、下列数据点的插值可以得到平方根函数的近似,在区间[0,64]上作图。

(1)用这9个点作8次多项式插值8()L x 。

(2)用三次样条(第一边界条件)程序求()S x 。

7、对于给函数21()125f x x =+在区间[-1,1]上取10.2(0,1,,10)i x i i =-+=,试求3次曲线拟合,试画出拟合曲线并打印出方程,与第5题的结果比较。

四、实验过程与结果:1、Lagrange 插值多项式源代码:function ya=lag(x,y,xa) %x 所有已知插值点 %y 插值点对应函数值 %xa 所求点,自变量 %ya 所求点插值估计量 ya=0; mu=1; %初始化%循环方式求L 系数,并求和: for i = 1:length(y) for j = 1:length(x) if i ~= jmu = mu * (xa - x(j) ) / ( x(i) - x(j) ); else continue end endya = ya + y(i) * mu ; mu = 1; end2、Newton 源代码:function ya = newton(x,y,xa) %x 所有已知插值点 %y 插值点对应函数值 %xa 所求点,自变量 %ya 所求点插值估计量 %建立系数零矩阵D 及初始化:D = zeros(length(x)-1);ya = y(1);xi = 1;%求出矩阵D,该矩阵第一行为牛顿插值多项式系数:for i=1:(length(x)-1)D(i,1) = (y(i+1) -y(i))/(x(i+1) -x(i));endfor j=2:(length(x)-1)for i=1:(length(x)-j)D(i,j) = (D(i+1,j-1) - D(i,j-1)) / (x(i+j) - x(i)); endend%xi为单个多项式(x-x(1))(x-x(2))...的值for i=1:(length(x)-1)for j=1:ixi = xi*(xa - x(j));endya = ya + D(1,i)*xi;xi = 1;end3、三次样条插值多项式(1)(第一边界条件)源代码:function y=yt1(x0,y0,f_0,f_n,x) _____________(1)%第一类边界条件下三次样条插值;%xi 所求点;%yi 所求点函数值;%x 已知插值点;%y 已知插值点函数值;%f_0左端点一次导数值;%f_n右端点一次导数值;n = length(x0);z = length(y0);h = zeros(n-1,1);k=zeros(n-2,1);l=zeros(n-2,1);S=2*eye(n);for i=1:n-1h(i)= x0(i+1)-x0(i);endfor i=1:n-2k(i)= h(i+1)/(h(i+1)+h(i));l(i)= 1-k(i);end%对于第一种边界条件:k = [1;k]; _______________________(2)l = [l;1]; _______________________(3)%构建系数矩阵S:for i = 1:n-1S(i,i+1) = k(i);S(i+1,i) = l(i);end%建立均差表:F=zeros(n-1,2);for i = 1:n-1F(i,1) = (y0(i+1)-y0(i))/(x0(i+1)-x0(i));endD = zeros(n-2,1);for i = 1:n-2F(i,2) = (F(i+1,1)-F(i,1))/(x0(i+2)-x0(i));D(i,1) = 6 * F(i,2);end%构建函数D:d0 = 6*(F(1,2)-f_0)/h(1); ___________(4)dn = 6*(f_n-F(n-1,2))/h(n-1); ___________(5)D = [d0;D;dn]; ______________(6)m= S\D;%寻找x所在位置,并求出对应插值:for i = 1:length(x)for j = 1:n-1if (x(i)<=x0(j+1))&(x(i)>=x0(j))y(i) =( m(j)*(x0(j+1)-x(i))^3)/(6*h(j))+...(m(j+1)*(x(i)-x0(j))^3)/(6*h(j))+...(y0(j)-(m(j)*h(j)^2)/6)*(x0(j+1)-x(i))/h(j)+... (y0(j+1)-(m(j+1)*h(j)^2)/6)*(x(i)-x0(j))/h(j) ; break;else continue;endendend(2)(自然边界条件)源代码:仅仅需要对上面部分标注的位置做如下修改:__(1):function y=yt2(x0,y0,x)__(2):k=[0;k]__(3):l=[l;0]__(4)+(5):删除—(6):D=[0:D:0]4、——————————————PS:另建了一个f方程文件,后面有一题也有用到。

matlab插值实验报告

matlab插值实验报告

matlab插值实验报告Matlab插值实验报告引言:在数学和工程领域中,插值是一种常见的数据处理方法。

它通过已知数据点之间的推断来填补数据的空缺部分,从而获得连续的函数或曲线。

Matlab是一种功能强大的数值计算软件,具备丰富的插值函数和工具包。

本实验旨在通过使用Matlab进行插值实验,探索插值方法的原理和应用。

实验步骤:1. 数据准备首先,我们需要准备一组实验数据。

以一个简单的二维函数为例,我们选择f(x) = sin(x),并在区间[0, 2π]上取若干个等间隔的点作为已知数据点。

2. 线性插值线性插值是插值方法中最简单的一种。

它假设函数在两个已知数据点之间是线性变化的。

在Matlab中,可以使用interp1函数进行线性插值。

我们将已知数据点和插值结果绘制在同一张图上,以比较它们之间的差异。

3. 多项式插值多项式插值是一种常用的插值方法,它通过已知数据点构造一个多项式函数来逼近原始函数。

在Matlab中,polyfit函数可以用来拟合多项式。

我们可以选择不同的多项式次数进行插值,并观察插值结果与原始函数之间的差异。

4. 样条插值样条插值是一种更为精确的插值方法,它通过在每个小区间内构造局部多项式函数来逼近原始函数。

在Matlab中,可以使用spline函数进行样条插值。

我们可以选择不同的插值节点数目,并比较插值结果的平滑程度和逼近效果。

5. 拉格朗日插值拉格朗日插值是一种基于多项式的插值方法,它通过构造插值多项式来逼近原始函数。

在Matlab中,可以使用polyval函数进行拉格朗日插值。

我们可以选择不同的插值节点数目,并观察插值结果与原始函数之间的差异。

实验结果:通过实验,我们得到了不同插值方法的结果,并将其与原始函数进行了比较。

在线性插值中,我们观察到插值结果与原始函数之间存在一定的误差,特别是在函数变化较快的区域。

而多项式插值和样条插值在逼近原始函数方面表现更好,特别是在插值节点数目较多的情况下。

(整理)matlab插值计算.

(整理)matlab插值计算.

插值方法晚上做一个曲线拟合,结果才开始用最小二乘法拟合时,拟合出来的东西太难看了!于是尝试用其他方法。

经过一番按图索骥,终于发现做曲线拟合的话,采用插值法是比较理想的方法。

尤其是样条插值,插完后线条十分光滑。

方法付后,最关键的问题是求解时要积分,放这里想要的时候就可以直接过来拿,不用死去搜索啦。

呵呵插值方法的Matlab实现一维数据插值MATLAB中用函数interp1来拟合一维数据,语法是YI = INTERP1(X,Y,XI,方法)其中(X,Y)是已给的数据点,XI 是插值点,其中方法主要有'linear' -线性插值,默认'pchip' -逐段三次Hermite插值'spline' -逐段三次样条函数插值其中最后一种插值的曲线比较平滑例:x=0:.12:1; x1=0:.02:1;%(其中x=0:.12:1表示显示的插值点,x1=0:.02:1表示插值的步长)y=(x.^2-3*x+5).*exp(-5*x).*sin(x);plot(x,y,'o'); hold on;y1=interp1(x,y,x1,'spline');plot(x1,y1,':')如果要根据样本点求函数的定积分,而函数又是比较光滑的,则可以用样条函数进行插值后再积分,在MATLAB中可以编写如下程序:function y=quadspln(x0,y0,a,b)f=inline('interp1(x0,y0,x,''spline'')','x','x0','y0');y=quadl(f,a,b,1e-8,[],x0,y0);现求sin(x)在区间[0,pi]上的定积分,只取5点x0=[0,0.4,1,2,pi];y0=sin(x0);I=quadspln(x0,y0,0,pi)结果得到的值为2.01905,精确值为2求一段matlab插值程序悬赏分:20 - 解决时间:2009-12-26 19:57已知5个数据点:x=[0.25 0.5 0.75 1] y=[0 0.3104 0.6177 0.7886 1] ,求一段matlab插值程序,求过这5个数据点的插值多项式,并在x-y坐标中画出y=f(x)图形,并且求出f (x)与x轴围成图形的面积(积分),不胜感激!使用Lagrange 插值多项式的方法:首先把下面的代码复制到M文件中,保存成lagranfunction [C,L]=lagran(X,Y)% input - X is a vector that contains a list of abscissas% - Y is a vector that contains a list of ordinates% output - C is a matrix that contains the coefficients of the lagrange interpolatory polynomial%- L is a matrix that contains the lagrange coefficients polynomialw=length(X);n=w-1;L=zeros(w,w);for k=1:n+1V=1;for j=1:n+1if k~=jV=conv(V,poly(X(j)))/(X(k)-X(j));endendL(k,:)=V;endC=Y*L;然后在命令窗口中输入以下内容:x=[0 0.25 0.5 0.75 1];y=[0 0.3104 0.6177 0.7886 1];lagran(x,y)ans =3.3088 -6.3851 3.3164 0.7599 0得到的数据就是多项式各项的系数,注意最后一个是常数项,即x^0,所以表达式为:f=3.3088*x.^4-6.3851*x.^3+3.3164*x.^2 +0.7599*x求面积就是积分求解>> f=@(x)3.3088*x.^4-6.3851*x.^3+3.3164*x.^2 +0.7599*x;>> quad(f,0,1)ans =0.5509这些点肯定是通过这个多项式的!MATLAB插值与拟合§1曲线拟合实例:温度曲线问题气象部门观测到一天某些时刻的温度变化数据为:试描绘出温度变化曲线。

在Matlab中如何进行数据插值与拟合

在Matlab中如何进行数据插值与拟合

在Matlab中如何进行数据插值与拟合引言:数据处理是科学研究与工程开发中不可或缺的环节之一。

而数据插值和拟合则是数据处理中常用的技术手段。

在Matlab这一强大的数值分析工具中,提供了丰富的函数与工具箱,使得数据插值与拟合变得更加便捷高效。

本文将详细阐述在Matlab中如何进行数据插值与拟合,并介绍几个常用的插值与拟合方法。

一、数据插值数据插值是通过已知的有限个数据点,推导出数据点之间未知位置上的数值。

在Matlab中,可以利用interp1函数进行数据插值。

假设我们有一组离散的数据点,存储为两个向量x和y。

那么,可以通过以下步骤进行数据插值:1. 调用interp1函数,并传入x和y作为输入参数。

```matlabxi = linspace(min(x), max(x), n);yi = interp1(x, y, xi, '方法');```其中,xi是插值点的位置,min和max分别是x向量的最小值和最大值,n是插值点的数量。

'方法'是要使用的插值方法,可以选择线性插值(method='linear')、样条插值(method='spline')等。

2. 绘制插值结果曲线。

```matlabplot(x, y, 'o', xi, yi)legend('原始数据','插值结果')```使用plot函数可以绘制原始数据点和插值结果的曲线。

通过设置不同的插值方法和插值点的数量,可以探索不同的插值效果。

二、数据拟合数据拟合是通过已知的一组数据点,找到一个符合数据趋势的函数模型。

在Matlab中,可以利用polyfit函数进行多项式拟合。

假设我们有一组离散的数据点,存储为两个向量x和y。

那么,可以通过以下步骤进行数据拟合:1. 调用polyfit函数,并传入x和y作为输入参数。

```matlabp = polyfit(x, y, n);```其中,n是多项式的次数,p是拟合多项式的系数。

数值分析实验报告matlab

数值分析实验报告matlab

数值分析实验报告matlab数值分析实验报告引言:数值分析是一门研究利用计算机数值方法解决数学问题的学科,它在科学计算、工程设计、金融分析等领域具有重要的应用价值。

本实验报告旨在通过使用MATLAB软件,探索数值分析的基本原理和方法,并通过实际案例加深对数值分析的理解。

一、误差分析在数值计算中,误差是无法避免的。

误差分析是数值分析中的重要一环,它帮助我们了解数值计算的准确性和稳定性。

在实验中,我们通过计算机模拟了一个简单的数学问题,并分别计算了绝对误差和相对误差。

通过比较不同算法的误差大小,我们可以选择最适合的算法来解决实际问题。

二、插值与拟合插值和拟合是数值分析中常用的方法,它们可以通过已知的数据点来推导出未知数据点的近似值。

在本实验中,我们通过MATLAB的插值函数和拟合函数,分别进行了插值和拟合的实验。

通过比较不同插值和拟合方法的结果,我们可以选择最适合的方法来处理实际问题。

三、数值积分数值积分是数值分析中的重要内容,它可以用来计算曲线下的面积或函数的积分值。

在实验中,我们通过MATLAB的数值积分函数,对一些简单的函数进行了积分计算。

通过比较数值积分和解析积分的结果,我们可以评估数值积分的准确性和稳定性,并选择最适合的积分方法来解决实际问题。

四、常微分方程的数值解法常微分方程是数值分析中的重要内容,它可以用来描述许多自然现象和工程问题。

在实验中,我们通过MATLAB的常微分方程求解函数,对一些简单的微分方程进行了数值解法的计算。

通过比较数值解和解析解的结果,我们可以评估数值解法的准确性和稳定性,并选择最适合的数值解法来解决实际问题。

五、线性方程组的数值解法线性方程组是数值分析中的经典问题,它在科学计算和工程设计中广泛应用。

在实验中,我们通过MATLAB的线性方程组求解函数,对一些简单的线性方程组进行了数值解法的计算。

通过比较数值解和解析解的结果,我们可以评估数值解法的准确性和稳定性,并选择最适合的数值解法来解决实际问题。

matlab数值分析第三章插值

matlab数值分析第三章插值

• 一个多项式通常不用拉格朗日形式表示,它更 常见的写成类似
x 2x 5
3
• 的形式。其中简单的x的次方项称为单项式, 而多项式的这种形式称为使用幂形式的多项式。 • 插值多项式使用幂形式表示为
P( x) c1x c2 x ... cn1x cn
n1Βιβλιοθήκη n 2• 其中的系数,原则上可以通过求解下面的线性代 数方程组得到。
3.2 分段线性插值
• • • • 通过两步操作可以绘制出一个简单的图形: 第一步用圆圈在坐标系中标出个数据点plot(x,y,'o'); , 第二步用直线段依次连接这些数据点plot(x,y'-'); 。 下面的语句执行这样的操作,生成图3-3.
• x = 1:6; • y = [16 18 21 17 15 12]; • plot(x,y,'o',x,y,'-');
3.4 保形分段三次插值
• pchip实际是“分段三次埃米特插值多项式”
(piecewise cubic Hermite interpolating polynominal)的
英文首字母缩写。有意思的是,根据这个名字并不能 确定它到底是哪一种分段三次埃米特插值多项式,因 为样条插值函数实际也是分段三次埃米特插值多项式, 只是对斜率的限制条件不同而已。 • 在这里,我们说的pchip实际上是一个最近才引入 MATLAB、保形的(shape-preserving)且看上去不 错的特定插值函数。它基于一个由Fritsch和Carlson 编写的旧的Fortran程序,在Kahaner、Moler和 Nash的书【33】中可以找到相关的介绍。
V=vander(x) 生成 V = 0 0 1 1 8 4 27 9 然后,输入命令 c=V\y' 计算出插值系数 c = 1.0000 0.0000 -2.0000 -5.0000

用MATLAB进行数据插值课件

用MATLAB进行数据插值课件
用Matlab进行数据插值课件
目录
• Matlab数据插值简介 • 一维数据插值 • 二维数据插值 • 插值结果的评估与可视化 • 实际应用案例
01
Matlab数据插值简介
Chapter
插值的概念
插值是一种数学方法,通过已知的离散数据点,估算出 未知点的数值。 它基于已知数据点建立一个数学模型,然后利用这个模 型预测新的数据点。
用二维多项式插值处理地理信息数据
总结词
二维多项式插值适用于处理平面上的多变量 插值问题,如地理信息数据。
详细描述
二维多项式插值通过已知的离散数据点,使 用多项式函数进行插值,计算出平面内未知 点的值。在处理地理信息数据时,可以使用 二维多项式插值来预测某个地理位置的气候 、土壤类型等信息。
用样条插值处理股票价格数据
插值可用于数据平滑、预测、图像处理等领域。
插值的应用场景
01
02
03
数据平滑
在处理包含噪声的数据时 ,插值可以帮助消除噪声 ,使数据更平滑。
数据预测
在时间序列分析、金融建 模等领域,插值可用于预 测未来的数据点。
图像处理
在图像处理中,插值可用 于放大图像、修复图像等 任务。
Matlab中的插值函数
布和趋势。
折线图
将原始数据和插值结果绘制成折线 图,便于观察数据的连续性和变化 趋势。
误差图
将原始数据、插值结果和误差绘制 在同一图表中,便于比较和分析。
Matlab中的数据可视化工具箱介绍
01
Matlab自带的数据可视化工具箱提供了丰富的绘图函数和工具,如plot、 scatter、bar等,可用于绘制各种类型的图表。
Chapter
插值结果的评估方法

MATLAB插值拟合数值积分

MATLAB插值拟合数值积分
pn ( xi ) yi f ( xi ), i 0,1, 2, ,n
这就是Lagrange插值。 xi 点称为插值节点。用几何语言 来表述这类插值,就是通过曲线 y f ( x) 上给定的n+1个 点,求作一条n次代数曲线 y pn ( x) 作为 y f ( x) 的近 似。
method指定插值的算法,默认为线性算法。其值可为: ‘nearest’ 线性最近项插值 ‘linear’ 线性插值 ‘spline’ 立方样条插值 ‘cubic’ 立方插值
例2
已知数据:
x 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
y
0.3
0.5
1
1.4
1.6
插值&拟合
例:1949年—1994年我国人口数据资料如下:
年 份 xi 1949 1954 1959 1964 1969 1974 1979 1984 1989 1994 人口数 yi 5.4 6.0 6.7 7.0 8.1 9.1 9.8 10.3 11.3 11.8
yi interp1( x, y, xi) 对节点(x,y)插值,求插值点的函
数值。 X:节点向量值, Y:对应的节点函数值。
插值&拟合
例1:用lagrange法、分段插值法插值y=1/(1+x^2)
x=[-5:1:5]; y=1./(1+x.^2); x0=[-5:0.1:5]; y0=lagrange(x0,x,y); y1=1./(1+x0.^2); plot(x0,y0,'--r') hold on plot(x0,y1,'-b') legend('拉格朗日插值曲线’,'原曲线') y2=interp1(x,y,x0); plot(x0,y2,'*m') legend('拉格朗日插值曲线','原曲线','分段插值曲线')
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Matlab实现数值分析插值及积分摘要:数值分析(numerical analysis)是研究分析用计算机求解数学计算问题的数值计算方法及其理论的学科,是数学的一个分支,它以数字计算机求解数学问题的理论和方法为研究对象。

在实际生产实践中,常常将实际问题转化为数学模型来解决,这个过程就是数学建模。

学习数值分析这门课程可以让我们学到很多的数学建模方法。

分别运用matlab数学软件编程来解决插值问题和数值积分问题。

题目中的要求是计算差值和积分,对于问题一,可以分别利用朗格朗日插值公式,牛顿插值公式,埃特金逐次线性插值公式来进行编程求解,具体matlab代码见正文。

编程求解出来的结果为:=+。

其中Aitken插值计算的结果图如下:对于问题二,可以分别利用复化梯形公式,复化的辛卜生公式,复化的柯特斯公式编写程序来进行求解,具体matlab代码见正文。

编程求解出来的结果为: 0.6932其中复化梯形公式计算的结果图如下:问题重述问题一:已知列表函数表格 1分别用拉格朗日,牛顿,埃特金插值方法计算。

问题二:用复化的梯形公式,复化的辛卜生公式,复化的柯特斯公式计算积分,使精度小于5。

问题解决问题一:插值方法对于问题一,用三种差值方法:拉格朗日,牛顿,埃特金差值方法来解决。

一、拉格朗日插值法:拉格朗日插值多项式如下:首先构造1+n 个插值节点n x x x ,,,10 上的n 插值基函数,对任一点i x 所对应的插值基函数)(x l i ,由于在所有),,1,1,,1,0(n i i j x j +-=取零值,因此)(x l i 有因子)())(()(110n i i x x x x x x x x ----+- 。

又因)(x l i 是一个次数不超过n 的多项式,所以只可能相差一个常数因子,固)(x l i 可表示成:)())(()()(110n i i i x x x x x x x x A x l ----=+-利用1)(=i i x l 得:)())(()(1110n i i i i i i x x x x x x x x A ----=+-于是),,2,1,0()())(()()())(()()(110110n i x x x x x x x x x x x x x x x x x l n i i i i i i n i i i =--------=+-+-因此满足i i n y x L =)( ),2,1,0(n i =的插值多项式可表示为:∑==nj j j n x l y x L 0)()(从而n 次拉格朗日插值多项式为:),,2,1,0()()(0n i x l y x L nj i j j i n ==∑=matlab 编程:编程思想:主要从上述朗格朗日公式入手:依靠循环,运用poly ()函数和conv ()函数表示拉格朗日公式,其中的poly (i )函数表示以i 作为根的多项式的系数,例如poly (1)表示x-1的系数,输出为1 -1,而poly (poly (1))表示(x-1)*(x-1)=x^2-2*x+1的系数,输出为1 -2 1;而conv ()表示多项式系数乘积的结果,例如conv (poly (1),poly (1))输出为1 -2 1;所以程序最后结果为x^n+x^n-1+……+x^2+x+1(n 的值据结果的长度为准)的对应系数。

在命令窗口输入edit lagran 来建立lagran.m 文件,文件中的程序如下: function [c,l]=lagran(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~=jv=conv(v,poly(x(j)))/(x(k)-x(j)); end endl(k,:)=v; endc=y*l;输入:>> x=[0 1 2 3 4]; >> y=[1 2 17 82 257]; >> lagran(x,y)运行结果为 ans =1.0000 -0.0000 -0.0000 0 1.0000 结果为:=+。

如图表1:图表 1二.牛顿插值法newton 插值多项式的表达式如下:010011()()()()()n n n N x c c x x c x x x x x x -=+-+⋅⋅⋅+--⋅⋅⋅-其中每一项的系数ci 的表达式如下:12011010[,,,][,,,][,,,]i i i i i f x x x f x x x c f x x x x x -⋅⋅⋅-⋅⋅⋅=⋅⋅⋅=-即为 f (x)在点01,,,i x x x ⋅⋅⋅处的i 阶差商,([]()i i f x f x =,1,2,,i n =),由差商01[,,,]i f x x x ⋅⋅⋅的性质可知:()0101[,,,]()ii i j j k j k k jf x x x f x x x ==≠⋅⋅⋅=-∑∏matlab 编程:编程思想:主要从上述牛顿插值公式入手:依靠循环,运用poly ()函数和conv ()函数表示拉格朗日公式,其中的poly (i )函数表示以i 作为根的多项式的系数,例如poly (1)表示x-1的系数,输出为1 -1,而poly(poly(1))表示(x-1)*(x-1)=x^2-2*x+1的系数,输出为1 -2 1;而conv()表示多项式系数乘积的结果,例如conv(poly(1),poly(1))输出为1 -2 1;所以程序最后结果为x^n+x^n-1+……+x^2+x+1(n的值据结果的长度为准)的对应系数。

在命令窗口输入edit nowpoly来建立newpoly.m文件,文件中的程序如下:function [c,d]=newpoly(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);end输入:>> x=[0 1 2 3 4];>> y=[1 2 17 82 257];>> newpoly(x,y)运行结果为ans =1 0 0 0 1所以=+。

如图表2:图表 2三.埃特金插值法:Aitken插值公式如下:递推表达式为:= +当n=1时,= +当n=2时,= +其中的带入递推表达式求得。

由此递推下去,最终得到的结果。

matlab编程:编程思想:埃特金插值多项式又称作Aitken逐次线性插值多项式,根据公式的特点,可以利用2次嵌套循环将公式表示出来。

在命令窗口输入edit Aitken 来建立Aitken.m文件,文件中的程序如下:function f = Aitken(x,y)syms z;n = length(x);y1(1:n) = z;for i=1:n-1for j=i+1:ny1(j) = y(j)*(z-x(i))/(x(j)-x(i))+y(i)*(z-x(j))/(x(i)-x(j));endy = y1;simplify(y1);endsimplify(y1(n));f = collect(y1(n));输入:>> x=[0 1 2 3 4];>> y=[1 2 17 82 257];>> Aitken(x,y)运行结果为ans =z^4 + 1所以=+。

如图表3:图表 3问题二:复化积分对于问题二来说,用复化的梯形公式,复化的辛卜生公式,复化的柯特斯公式结局问题(计算积分,使精度小于5)。

一复化的梯形公式:复化梯形的迭代公式为:;matlab编程:程序1(求f(x)的n阶导数:)在命令窗口输入edit qiudao 来建立qiudao.m文件,文件中的程序如下:function d=qiudao(x,n)syms x;f=1/x;n=input('输入导数阶数: ');d=diff(f,x,n);输入:qiudao(x,n)输入所求导数阶数:2显示:n = 2ans =2/x^3结果为:f2 =2/x^3如图表4:图表 4程序2:在命令窗口输入edit tixing 来建立tixing.m文件,文件中的程序如下:function y=tixing()syms x ; %定义自变量xf=inline('1/x','x');%定义函数f(x)= 1/xf2=inline('2/x^3','x') ;%定义f(x)的二阶导数,输入程序1里求出的f2即可。

f3='-2/x^3';%因fminbnd()函数求的是表达式的最小值,且要求表达式带引号,故取负号,以便求最大值e=5*10^(-5); %精度要求值a=1;%积分下限b=2;%积分上限x1=fminbnd(f3,1,2); %求负的二阶导数的最小值点,也就是求二阶导数的最大值点对应的x值for n=2:1000000;%求等分数nRn=-(b-a)/12*((b-a)/n)^2*f2(x1); %计算余项if abs(Rn)<e %用余项进行判断break % 符合要求时结束endendh=(b-a)/n; %求hTn1=0;for k=1:n-1 %求连加和xk=a+k*h;Tn1=Tn1+f(xk);endTn=h/2*((f(a)+2*Tn1+f(b)));fprintf('用复化梯形算法计算的结果 Tn=')disp(Tn)fprintf('等分数 n=')disp(n) %输出等分数输入:tixing()运行结果为:用复化梯形计算的结果 Tn= 0.6932等分数 n= 58结果如图表:5图表 5二复化的辛卜生公式:复化simpson迭代公式为:;matlab编程:程序1(求f(x)的n阶导数:)在命令窗口输入edit qiudao 来建立qiudao.m文件,文件中的程序如下:function d=qiudao(x,n)syms x;f=1/x;n=input('输入导数阶数: ');d=diff(f,x,n);输入:qiudao(x,n)输入所求导数阶数:4显示:n = 4ans =24/x^5结果为:f2 = 24/x^5如图表6:图表 6程序2:在命令窗口输入edit xinpusheng 来建立xinpusheng.m文件,文件中的程序如下:function y=xinpusheng()syms x ;f=inline('1/x','x');f2=inline('24/x^5','x');f3='-24/x^5';e=5*10^(-5);a=1;b=2;x1=fminbnd(f3,1,2);for n=2:1000000Rn=-(b-a)/180*((b-a)/(2*n))^4*f2(x1);if abs(Rn)<ebreakendendh=(b-a)/n;Sn1=0;Sn2=0;for k=0:n-1xk=a+k*h;xk1=xk+h/2;Sn1=Sn1+f(xk1);Sn2=Sn2+f(xk);endSn=h/6*(f(a)+4*Sn1+2*(Sn2-f(a))+f(b));fprintf('用Simpson公式计算的结果 Sn=')disp(Sn)fprintf('等分数 n=')disp(n)调用xinpusheng.m中xinpusheng函数:输入:>> clear>> xinpusheng()运行结果为用Simpson 公式计算的结果 Sn= 0.6932等分数 n= 4结果如图表7图表 7三 复化的柯特斯公式:牛顿-柯特斯公式如下:matlab 编程:(1)在命令窗口输入edit NewtonCotes 来建立NewtonCotes.m 文件,文件中的程序如下: function [y,Ck,Ak]=NewtonCotes(fun,a,b,n)if nargin==1[mm,nn]=size(fun);if mm>=8error('为了保证NewtonCotes 积分的稳定性,最多只能有9个等距节点!') elseif nn~=2error('fun 构成应为:第一列为x ,第二列为y ,并且个数为小于10的等距节点!')endxk=fun(1,:);fk=fun(2,:);a=min(xk);0()()n b k k a k f x dx A f x =≈∑⎰011011()()()()()()()()()b b k k n k k a a k k k k k k n x x x x x x x x A l x dx dx x x x x x x x x -+-+----==----⎰⎰b=max(xk);n=mm-1;elseif nargin==4xk=linspace(a,b,n+1);if isa(fun,'function_handle')fx=fun(xk);elseerror('fun积分函数的句柄,且必须能够接受矢量输入!')endelseerror('输入参数错误,请参考函数帮助!')endCk=cotescoeff(n);Ak=(b-a)*Ck;y=Ak*fx';(2)在命令窗口输入edit cotescoeff来建立cotescoeff.m文件,文件中的程序如下:function Ck=cotescoeff(n)for i=1:n+1k=i-1;Ck(i)=(-1)^(n-k)/factorial(k)/factorial(n-k)/n*quadl(@(t)intfun(t,n,k),0,n); end(3)在命令窗口输入edit intfun来建立intfun.m文件,文件中的程序如下:function f=intfun(t,n,k)f=1;for i=[0:k-1,k+1:n]f=f.*(t-i);end% fun,积分表达式,这里有两种选择%(1)积分函数句柄,必须能够接受矢量输入,比如fun=@(x)1./x% (2)x,y坐标的离散点,第一列为x,第二列为y,必须等距,且节点的个数小于9,比如: fun=[1:8;1./(1:8)]% 如果fun的表采用第二种方式,那么只需要输入第一个参数即可,否则还要输入a,b,n 三个参数% a,积分下限% b,积分上限% n,牛顿-科特斯数公式的阶数,必须满足1<n<7,因为n>=8时不能保证公式的稳定性% (1)n=1,即梯形公式% (2)n=2,即辛普森公式% (3)n=4,即科特斯公式在显示窗口输入:fun=@(x)1./x;a=-1;b=1;n=4;NewtonCotes(fun,a,b,n)运行结果为:ans =0.6932结果如图表8图表 8。

相关文档
最新文档