7.1.1 分段线性插值
所谓分段线性插值就是通过插值点用折线段连接起来逼近原曲线,这也是计算机绘制图形的基本原理。实现分
段线性插值不需编制函数程序,MATLAB自身提供了内部函数interp1其主要用法如下:
interp1(x,y,xi) 一维插值
◆ yi=interp1(x,y,xi) 对一组点(x,y) 进行插值,计算插值点xi的函数值。x为节点向量值,y为对应的节点函数值。如果y 为矩阵,
则插值对y 的每一列进行,若y 的维数超出x 或 xi 的维数,则返回NaN。
◆ yi=interp1(y,xi) 此格式默认x=1:n ,n为向量y的元素个数值,或等于矩阵y的size(y,1)。
◆
yi=interp1(x,y,xi,’method’) method用来指定插值的算法。默认为线性算法。其值常用的可以是如下的字符串。
●
nearest 线性最近项插值。
●
linear 线性插值。
●
spline 三次样条插值。
●
cubic 三次插值。
所有的插值方法要求x是单调的。x 也可能并非连续等距的。
正弦曲线的插值示例:
>> x=0:0.1:10;
>> y=sin(x);
>> xi=0:0.25:10;
>> yi=interp1(x,y,xi);
>> plot(x,y,’0’,xi,yi)
则可以得到相应的插值曲线(读者可自己上机实验)。
Matlab也能够完成二维插值的运算,相应的函数为interp2,使用方法与interpl基本相同,只是输入和输出的
参数为矩阵,对应于二维平面上的数据点,详细的用法见Matlab联机帮助。
7.1.2 最小二乘法拟合
在科学实验的统计方法研究中,往往要从一组实验数据 中寻找出自变量x 和因变量y之间的函数关系y=f(x) 。
由于观测数据往往不够准确,因此并不要求y=f(x)经过所有的点 ,而只要求在给定点
上误差按照某种标准
达到最小,通常采用欧氏范数 作为误差量度的标准。这就是所谓的最小二乘法。在MATLAB中实现最小二乘法
拟合通常采用polyfit函数进行。
函数polyfit是指用一个多项式函数来对已知数据进行拟合,我们以下列数据为例介绍这个函数的用法:
>> x=0:0.1:1;
>> y=[ -0.447 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2 ]
为了使用polyfit,首先必须指定我们希望以多少阶多项式对以上数据进行拟合,如果我们指定一阶多项式,
结果为线性近似,通常称为线性回归。我们选择二阶多项式进行拟合。
>> P= polyfit (x, y, 2)
P=
-9.8108 20.1293 -0.0317
函数返回的是一个多项式系数的行向量,写成多项式形式为:
为了比较拟合结果,我们绘制两者的图形:
>> xi=linspace (0, 1,
100); %绘图的X-轴数据。
>> Z=polyval (p,
xi); %得到多项式在数据点处的值。
当然,我们也可以选择更高幂次的多项式进行拟合,如10阶:
>> p=polyfit (x,
y, 10);
>> xi=linspace (0,
1,100);
>> z=ployval (p, xi);
读者可以上机绘图进行比较,曲线在数据点附近更加接近数据点的测量值了,但从整体上来说,曲线波动比较
大,并不一定适合实际使用的需要,所以在进行高阶曲线拟合时,“越高越好”的观点不一定对的。
7.2.1 符号变量与符号表达式
MATLAB符号运算工具箱处理的对象主要是符号变量与符号表达式。要实现其符号运算,首先需要将处理对象定
义为符号变量或符号表达式,其定义格式如下:
格式1: sym
(‘变量名’) 或 sym (‘表达式’)
功能: 定义一个符号变量或符号表达式。
例如:
>> sym
(‘x’) % 定义变量x为符号变量
>>
sym(‘x+1’) % 定义表达式x+1为符号表达式
格式2: syms 变量名1 变量名2 …… 变量名n
功能: 定义变量名1、变量2 ……、变量名 n为符号变量。
例如:
>> syms a b x t % 定义a,b, x,t 均为符号变量
7.2.2 微积分运算
1、极限
格式:limit (f, t, a, ‘left’ or ‘right’)
功能:求符号变量t 趋近a 时,函数f 的(左或右)极限。‘left’ 表示求左极限,‘right’ 表示求右极
限,省略时表示求一般极限;a省略时变量t 趋近0; t省略时默认变量为x ,若无x则寻找(字母表上)最接
近字母x 的变量。
例如:求极限 的命令及结果为:
>> syms x t >> limit ((1+2*t/x)^(3*x) , x, inf
)
ans=
exp(6*t)
2、导数
格式: diff (f,t,n)
功能: 求函数f 对变量 t的n 阶导数。当n省略时,默认 n=1;当t省略时,默认变量x,
若无x时则查找字母
表上最接近字母x 的字母。
例如:求函数f=a*x^2+b*x+c对变量 x的一阶导数, 命令及结果为
>> syms a b c x
>> f=a*x^2+b*x+c;
>>
diff(f) ans=
2*a*x+b
求函数f 对变量b的一阶导数(可看作求偏导), 命令及结果为
>>
diff(f,b) ans=x
求函数f 对变量x的二阶导数, 命令及结果为
>>
diff(f,2) ans=2*a
3、积分
格式: int(f,t,a,b)
功能: 求函数f 对变量 t从a 到b的定积分. 当a和b省略时求不定积分;当t省略时, 默认变量为(字母表上)
最接近字母x的变量。
例如:求函数f=a*x^2+b*x+c对变量x不定积分, 命令及结果为
>> syms a b c x
>> f=a*x^2+b*x+c;
>>
int(f) ans=
1/3*a*x^3+1/2*b*x^2+c*x
求函数f 对变量b不定积分, 命令及结果为
>>
int(f,b) ans=
a*x^2*b+1/2*b^2*x+c*b
求函数f 对变量x 从 1到5的定积分, 命令及结果为
>>
int(f,1,5) ans=
124/3*a+12*b+4*c
4、级数求和
格式: symsum (s,t,a,b)
功能:求表达式s中的符号变量t从第a项到第b项的级数和。
例如: 求级数 的前三项的和, 命令及结果为
>>
symsum(1/x,1,3) ans=11/6
MATLAB符号运算工具箱中,包括了较多的代数式化简和代换功能,下面仅举出部分常见运算。
simplify 利用各种恒等式化简代数式
expand 将乘积展开为和式
factor 把多项式转换为乘积形式
collect 合并同类项
horner 把多项式转换为嵌套表示形式
例如:进行合并同类项执行
>> syms x
>> collect(3*x^3-0.5*x^3+3*x^2)
ans=
5/2*x^3+3*x^2)
7.2.4 解方程
1、代数方程
格式:solve (f,t)
功能:对变量t 解方程f=0,t 缺省时默认为x 或最接近字母x 的符号变量。
例如:求解一元二次方程f=a*x^2+b*x+c的实根,
>> syms a b c x
>> f=a*x^2+b*x+c;
>> solve (f,x)
ans=
[1/2/a*(-b+(b^2-4*a*c)^ (1/2))]
[1/2/a*(-b-(b^2-4*a*c)^ (1/2))]
2、微分方程
格式:dsolve(‘s’, ’s1’, ’s2’,…, ’x’)
其中s为方程;s1,s2,……为初始条件,缺省时给出含任意常数c1,c2,……的通解;x为自变量,缺省时默认
为t 。
例如:求微分方程 的通解
>> dsolve(‘Dy=1+y^2’)
ans=
tan(t+c1)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
向量的点乘
向量的点乘又称为内积,是两个向量的模和两个向量之间的夹角余弦三者的乘积。MATLAB
中,实现
点乘的函数是dot。dot 函数的用法为 dot(x1,x2),其中 x1 和 x2 的维数必须相同。
向量的叉乘
向量乘法除点乘之外还有叉乘。两个向量叉积的几何意义是指以两个向量模的乘积为模,方向和两个
向量构成右手坐标系的向量。向量的叉乘不可交换。在 MATLAB 中函数 cross 用于实现向量的叉乘。
向量的混合积
向量的混合积的几何意义是:它的绝对值表示以三个向量为楞的平行六面体的体积,符号由右手法则
确定。上面介绍了向量的点乘和叉乘,向量的混合积由点乘和叉乘逐步实现。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
一维插值在曲线拟合和数据分析中具有重要的地位。在 MATLAB 中,一维插值由函数 interp1 实现。该函数
的调用格式为
yi =
interp1(x,y,xi,method)
x、y:采用数据的 x 坐标和 y 坐标
xi :待插值的位置
method:采用的插值方法
该语句返回函数在点 xi 处的插值结果。该语句中的参数 method 可以选择的内容如表所示。
参数 对应方法
'nearest' 最近邻插值
'linear' 线性插值
'spline' 三次样条插值
'pchip'或'cubic' 三次插值
MATLAB 中提供了两种函数表示的方法:
利用 M 文件将函数定义为 MALTAB 函数
将函数定义为 MALTAB
函数,当需要调用该函数时,需要通过符号“@”获取函数句柄,利用函数句
柄实现对函数的操作。
匿名函数方法
直接创建函数,如语句:
>> fh = @(x)1./((x-0.3).^2 + 0.01) +
1./((x-0.9).^2 + 0.04)-6;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
图形用户界面开发环境——GUIDE
应用程序向导简化开发步骤;
下拉及弹出式菜单;
支持多种界面元素:按钮(PUSH BUTTON),单选按钮(RADIO BUTTON),复选框(CHECK BOXES),滑块
(SLIDERS)、文本编辑框(EDIT BOX)和 ActiveX 控件;
鼠标事件(Mouse Event)和响应函数(drawback);
利用响应函数响应工程师的操作
MATLAB 中只用小括号代表运算级别,中括号只用于生成向量和矩阵,花括号用于生成单元数组。
在 MATLAB 中,存在逻辑数组,如下面的表达式返回逻辑数组:
>> [30 40 50 60 70] >
40
ans =
0 0 1 1 1
冒号裁剪符的使用方法是:
Z=A([,,…],[,,…])
该式子表示的是提取数组A的,…等行,,…等列,组成一个新的数组。此外,在数字索引访问数组的时候,
当某一索引值的位置上不是数字,而是冒号的话,则表示取这一个索引位置的所有数组元素。比如对一个3行3
列的数组A,A(1,:)表示取数组A的第一行所有元素。
删除数组元素,可以通过将该位置的数组元素赋值为空方括号([])即可,一般配合冒号使用,将数组中的某些
行、列元素删除。不过需要注意的是,在进行数组元素的删除时,索引结果必须是完整的行或列,而不能是数
组内部的块或者单元格。