matlab实现数值分析报告插值及积分
- 格式:doc
- 大小:147.40 KB
- 文档页数:13
佛山科学技术学院实 验 报 告课程名称 数值分析 实验项目 插值法与数据拟合 专业班级 机械工程 姓 名 余红杰 学 号 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进行插值实验,探索插值方法的原理和应用。
实验步骤:1. 数据准备首先,我们需要准备一组实验数据。
以一个简单的二维函数为例,我们选择f(x) = sin(x),并在区间[0, 2π]上取若干个等间隔的点作为已知数据点。
2. 线性插值线性插值是插值方法中最简单的一种。
它假设函数在两个已知数据点之间是线性变化的。
在Matlab中,可以使用interp1函数进行线性插值。
我们将已知数据点和插值结果绘制在同一张图上,以比较它们之间的差异。
3. 多项式插值多项式插值是一种常用的插值方法,它通过已知数据点构造一个多项式函数来逼近原始函数。
在Matlab中,polyfit函数可以用来拟合多项式。
我们可以选择不同的多项式次数进行插值,并观察插值结果与原始函数之间的差异。
4. 样条插值样条插值是一种更为精确的插值方法,它通过在每个小区间内构造局部多项式函数来逼近原始函数。
在Matlab中,可以使用spline函数进行样条插值。
我们可以选择不同的插值节点数目,并比较插值结果的平滑程度和逼近效果。
5. 拉格朗日插值拉格朗日插值是一种基于多项式的插值方法,它通过构造插值多项式来逼近原始函数。
在Matlab中,可以使用polyval函数进行拉格朗日插值。
我们可以选择不同的插值节点数目,并观察插值结果与原始函数之间的差异。
实验结果:通过实验,我们得到了不同插值方法的结果,并将其与原始函数进行了比较。
在线性插值中,我们观察到插值结果与原始函数之间存在一定的误差,特别是在函数变化较快的区域。
而多项式插值和样条插值在逼近原始函数方面表现更好,特别是在插值节点数目较多的情况下。
插值方法晚上做一个曲线拟合,结果才开始用最小二乘法拟合时,拟合出来的东西太难看了!于是尝试用其他方法。
经过一番按图索骥,终于发现做曲线拟合的话,采用插值法是比较理想的方法。
尤其是样条插值,插完后线条十分光滑。
方法付后,最关键的问题是求解时要积分,放这里想要的时候就可以直接过来拿,不用死去搜索啦。
呵呵插值方法的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中,可以利用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 解决一系列数值分析问题,加深对数值分析方法的理解和应用能力,掌握数值计算中的误差分析、数值逼近、数值积分与数值微分等基本概念和方法,并培养运用计算机解决实际数学问题的能力。
二、实验内容(一)误差分析在数值计算中,误差是不可避免的。
通过对给定函数进行计算,分析截断误差和舍入误差的影响。
例如,计算函数$f(x) =\sin(x)$在$x = 05$ 附近的值,比较不同精度下的结果差异。
(二)数值逼近1、多项式插值使用拉格朗日插值法和牛顿插值法对给定的数据点进行插值,得到拟合多项式,并分析其误差。
2、曲线拟合采用最小二乘法对给定的数据进行线性和非线性曲线拟合,如多项式曲线拟合和指数曲线拟合。
(三)数值积分1、牛顿柯特斯公式实现梯形公式、辛普森公式和柯特斯公式,计算给定函数在特定区间上的积分值,并分析误差。
2、高斯求积公式使用高斯勒让德求积公式计算积分,比较其精度与牛顿柯特斯公式的差异。
(四)数值微分利用差商公式计算函数的数值导数,分析步长对结果的影响,探讨如何选择合适的步长以提高精度。
三、实验步骤(一)误差分析1、定义函数`compute_sin_error` 来计算不同精度下的正弦函数值和误差。
```matlabfunction value, error = compute_sin_error(x, precision)true_value = sin(x);computed_value = vpa(sin(x), precision);error = abs(true_value computed_value);end```2、在主程序中调用该函数,分别设置不同的精度进行计算和分析。
(二)数值逼近1、拉格朗日插值法```matlabfunction L = lagrange_interpolation(x, y, xi)n = length(x);L = 0;for i = 1:nli = 1;for j = 1:nif j ~= ili = li (xi x(j))/(x(i) x(j));endendL = L + y(i) li;endend```2、牛顿插值法```matlabfunction N = newton_interpolation(x, y, xi)n = length(x);%计算差商表D = zeros(n, n);D(:, 1) = y';for j = 2:nfor i = j:nD(i, j) =(D(i, j 1) D(i 1, j 1))/(x(i) x(i j + 1));endend%计算插值结果N = D(1, 1);term = 1;for i = 2:nterm = term (xi x(i 1));N = N + D(i, i) term;endend```3、曲线拟合```matlab%线性最小二乘拟合p = polyfit(x, y, 1);y_fit_linear = polyval(p, x);%多项式曲线拟合p = polyfit(x, y, n);% n 为多项式的次数y_fit_poly = polyval(p, x);%指数曲线拟合p = fit(x, y, 'exp1');y_fit_exp = p(x);```(三)数值积分1、梯形公式```matlabfunction T = trapezoidal_rule(f, a, b, n)h =(b a) / n;x = a:h:b;y = f(x);T = h ((y(1) + y(end))/ 2 + sum(y(2:end 1)));end```2、辛普森公式```matlabfunction S = simpson_rule(f, a, b, n)if mod(n, 2) ~= 0error('n 必须为偶数');endh =(b a) / n;x = a:h:b;y = f(x);S = h / 3 (y(1) + 4 sum(y(2:2:end 1))+ 2 sum(y(3:2:end 2))+ y(end));end```3、柯特斯公式```matlabfunction C = cotes_rule(f, a, b, n)h =(b a) / n;x = a:h:b;y = f(x);w = 7, 32, 12, 32, 7 / 90;C = h sum(w y);end```4、高斯勒让德求积公式```matlabfunction G = gauss_legendre_integration(f, a, b)x, w = gauss_legendre(5);%选择适当的节点数t =(b a) / 2 x +(a + b) / 2;G =(b a) / 2 sum(w f(t));end```(四)数值微分```matlabfunction dydx = numerical_derivative(f, x, h)dydx =(f(x + h) f(x h))/(2 h);end```四、实验结果与分析(一)误差分析通过不同精度的计算,发现随着精度的提高,误差逐渐减小,但计算时间也相应增加。
MATLAB插值法引言MATLAB是一种高级编程语言和环境,特别适用于数值计算和数据可视化。
插值法是一种在给定有限的数据点的情况下,通过构造插值函数来估计其他数据点的方法。
在MATLAB中,有多种插值方法可供选择,例如拉格朗日插值、牛顿插值和样条插值等。
本文将详细介绍MATLAB中常用的插值方法及其应用。
一、拉格朗日插值法拉格朗日插值法是一种多项式插值方法,通过构造一个满足给定数据点要求的多项式函数,来估计其他数据点的函数值。
其基本思想是通过一个多项式函数对已知数据点进行拟合,以实现函数值的估计。
以下是使用MATLAB实现拉格朗日插值法的步骤:1.确定待插值的数据点集合,假设有n个数据点。
2.构造拉格朗日插值多项式。
拉格朗日插值多项式的表达式为:其中,为拉格朗日基函数,其表达式为:3.利用构造的拉格朗日插值多项式求解其他点的函数值。
二、牛顿插值法牛顿插值法是一种基于差商的插值方法,通过构造一个n次多项式函数来拟合已知数据点,并利用差商的性质来求解其他点的函数值。
使用MATLAB实现牛顿插值法的步骤如下:1.确定待插值的数据点集合,假设有n个数据点。
2.计算差商表。
差商表的计算公式为:3.构造牛顿插值多项式。
牛顿插值多项式的表达式为:4.利用构造的牛顿插值多项式求解其他点的函数值。
三、样条插值法样条插值法是一种通过多段低次多项式来逼近原始数据,以实现光滑插值的方法。
它在相邻数据点处保持一定的连续性,并通过边界条件来确定插值函数的特性。
以下是使用MATLAB实现样条插值法的步骤:1.确定待插值的数据点集合,假设有n个数据点。
2.根据数据点的个数确定样条插值的次数。
一般情况下,插值多项式的次数小于或等于n-1。
3.利用边界条件构造样条插值函数。
常用的边界条件有:自然边界、固定边界和周期边界。
4.利用MATLAB中的插值函数csape或interp1等进行样条插值。
5.利用样条插值函数求解其他点的函数值。
matlab数值分析实验报告Matlab数值分析实验报告引言数值分析是一门研究利用计算机进行数值计算和模拟的学科,它在科学计算、工程技术和金融等领域有着广泛的应用。
本次实验报告将介绍在Matlab环境下进行的数值分析实验,包括数值微分、数值积分和线性方程组求解等内容。
一、数值微分数值微分是通过数值方法计算函数的导数,常用的数值微分方法有前向差分、后向差分和中心差分。
在Matlab中,可以使用diff函数来计算函数的导数。
例如,对于函数f(x)=x^2,在Matlab中可以使用如下代码进行数值微分的计算:```matlabsyms x;f = x^2;df = diff(f, x);```二、数值积分数值积分是通过数值方法计算函数的定积分,常用的数值积分方法有梯形法则、辛普森法则和龙贝格积分法。
在Matlab中,可以使用trapz、quad和integral等函数来进行数值积分的计算。
例如,对于函数f(x)=sin(x),可以使用如下代码进行数值积分的计算:```matlabx = linspace(0, pi, 100);y = sin(x);integral_value = trapz(x, y);```三、线性方程组求解线性方程组求解是数值分析中的重要问题,常用的求解方法有高斯消元法和LU 分解法。
在Matlab中,可以使用\操作符来求解线性方程组。
例如,对于线性方程组Ax=b,可以使用如下代码进行求解:```matlabA = [1, 2; 3, 4];b = [5; 6];x = A\b;```四、实验结果与分析在本次实验中,我们分别使用Matlab进行了数值微分、数值积分和线性方程组求解的计算。
通过实验结果可以发现,Matlab提供了丰富的数值计算函数和工具,能够方便地进行数值分析的计算和求解。
数值微分的计算结果与解析解相比较,可以发现数值微分的误差随着步长的减小而减小,但是当步长过小时,数值微分的误差会受到舍入误差的影响。
实验 2.1 多项式插值的震荡现象问题提出:考虑在一个固定的区间上用插值逼近一个函数。
显然Lagrange 插值中使用的节点越多,插值多项式的次数越高,我们自然关心插值多项式的次数增加时,)(x L n 是否也更加靠近被逼近的函数。
Runge 给出的一个例子是极著名并富有启发性的。
设区间[-1,1]上函数.2511)(2xx f +=实验内容:考虑空间[-1,1]的一个等距划分,分点为 nix i 21+-=, =i 0,1,2 ...,n , 则拉格朗日插值多项式为)(2511)(02x l xx L ini n ∑=+=. 其中,n i x l i ,...,2,1,0),(=是n 次Lagrange 插值基函数。
实验要求:(1)选择不断增大的分点数目,...,3,2=n 画出原函数)(x f 及插值多项式函数)(x L n 在[-1,1]上的图像,比较并分析实验结果。
(2)选择其他的函数,例如定义在区间[-5,5]上的函数 ,1)(4xxx h +=)arctan()(x x g =, 重复上述的实验看其结果如何。
首先编写拉格朗日插值函数的Matlab 实现: Matlab 程序为:function y=lagrange(x0,y0,x) %Lagrange 插值 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 ends=s+p*y0(k); endy(i)=s; end(1)当函数为.2511)(2xx f +=时, Matlab 程序为:x=linspace(-1,1,100); y=1./(1+25*x.^2); plot(x,y) hold on; for i=2:2:10x0=linspace(-1,1,i+1); y0=1./(1+25*x0.^2); y=laglanri(x0,y0,x); plot(x,y,'r--') hold on end运行结果:结果分析:从图上看到在区间[-1,1]的两端点附近,随着插值点数的增加,插值函数)(x L n 与)(x f 偏离的越远,而且出现了振荡现象。
一、简介Matlab是一种用于数学计算、数据分析和可视化的高级编程语言和环境。
其中,积分数值求解是Matlab中常用的功能之一,能够用于求解复杂的数学积分问题。
本文将介绍如何使用Matlab的积分数值求解程序,以及其基本原理和用法。
二、Matlab积分数值求解程序的基本原理Matlab中的积分数值求解程序主要基于数值积分的基本原理,即将一个函数在某个区间上的积分近似表示为若干个小区间上函数值的加权和。
常见的数值积分方法包括梯形法则、辛普森法则、龙贝格积分法等。
这些数值积分方法可以用于求解一维和多维函数的数值积分,并且在Matlab中都有相应的函数实现。
三、Matlab积分数值求解程序的使用方法1. 使用内置函数Matlab中提供了多个内置的积分数值求解函数,例如quad、quadl、quadgk等,这些函数可以用于对一维函数的数值积分。
用户只需输入被积函数、积分区间等参数即可得到积分的数值近似解。
2. 自定义函数除了使用内置函数,用户还可以通过自定义函数的方式来实现积分数值求解。
通过编写自己的积分数值求解算法,用户可以更灵活地对复杂的积分问题进行求解。
Matlab还提供了丰富的数学函数和工具,可以用于对被积函数进行求导、符号计算等,从而辅助完成数值积分的求解过程。
四、Matlab积分数值求解程序的应用实例1. 一维函数的数值积分假设有一个一维函数f(x)=x^2,在区间[0,1]上的数值积分。
可以使用Matlab的内置函数quad来求解这个积分,代码如下:```f = (x) x^2;q = quad(f, 0, 1);disp(['The value of the integral is ', num2str(q)]);```上述代码中,使用了匿名函数来定义被积函数f(x)=x^2,并将其作为参数传递给quad函数。
使用disp函数输出积分的数值近似解。
2. 多维函数的数值积分对于多维函数的数值积分,Matlab同样提供了相应的函数实现。
matlab插值原理Matlab插值原理插值是一种数学方法,用于通过已知数据点的值来估计在这些数据点之间的未知数据点的值。
Matlab是一种强大的计算软件,可以用于数值计算和数据分析。
在Matlab中,插值方法可以通过使用interp1函数来实现。
插值方法可以分为两类:多项式插值和非多项式插值。
多项式插值使用多项式函数来逼近数据点,而非多项式插值使用其他函数形式来逼近数据点。
最常用的多项式插值方法是拉格朗日插值和牛顿插值。
拉格朗日插值使用一个多项式函数来逼近数据点,该多项式函数通过数据点和对应的函数值来确定。
牛顿插值使用一个差商表来确定多项式函数的系数,差商表由数据点和对应的函数值计算得到。
非多项式插值方法包括样条插值和分段线性插值。
样条插值使用分段低次多项式来逼近数据点,这些多项式在相邻的数据点之间衔接。
分段线性插值使用线性函数来逼近相邻数据点之间的数据。
在Matlab中,interp1函数可以使用上述插值方法进行数据插值。
该函数具有以下语法:Y = interp1(X, V, XI, METHOD)其中,X是已知数据点的横坐标,V是已知数据点的纵坐标,XI是要插值的点的横坐标,METHOD是插值方法。
使用interp1函数进行插值时,需要注意以下几点:1. 数据点的横坐标必须是单调递增的,即X(1) < X(2) < ... < X(n)。
2. 如果要插值的点的横坐标在已知数据点的横坐标范围之外,interp1函数将返回NaN。
3. 如果要插值的点的横坐标在已知数据点的横坐标范围之内,但在两个已知数据点的横坐标之间,interp1函数将使用插值方法来确定插值点的纵坐标。
除了interp1函数,Matlab还提供了其他插值函数,如interp2、interp3和interpn。
这些函数可以用于二维和三维数据的插值。
插值在数值计算和数据分析中起着重要的作用。
通过插值,我们可以根据已知数据点的值来估计在这些数据点之间的未知数据点的值。
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。