第 3章 矩阵、数组和符号运算二、符号及运算掌握内容:
( 1) 了解 MATLAB 6.0 的符号变量,掌握 MATLAB 符号表达式,符号矩阵的两种 创建方法 。
( 2) 掌握 MATLAB 符号数学函数 的创建 。
( 3) 掌握 符号矩阵的基本运算 及 MATLAB 关于 不同精度的控制方法 。
( 4) 掌握 符号微积分 内容,包括求函数的极限,对符号表达式求导数和微分,符号积分,符号求和,傅立叶变换 及其逆变换等 。
( 5) 掌握 各种符号方程的求解方法 和函数命令 。
( 6) 了解 MATLAB 可视化的符号函数分析界面 及使用 。
( 7) 初步了解 MAPLE 的符号资源 。
第 3章 矩阵、数组和符号运算抽象运算,公式推导,因式分解,求解代数方程或微分方程的精确解 符号数学工具箱
1) 通过基本符号数学工具箱的 专用函数 ;
◆ 符号表达式和符号矩阵的操作;
◆ 多项式的化简,展开和代入;
◆ 线性代数;
◆ 微积分;
◆ 符号方程的求解;
◆ 特殊的数学函数 。
2) 通过 maple.m,mpa.m 两个 专门设计的 M 文件 进行符号运算;
3) 通过 MATLAB 中的 函数计算器 ( Function
Caculator)。
第 3章 矩阵、数组和符号运算
1,符号变量的创建
a,sym 函数
S=sym(arg),从表达式 arg 创建一个 sym 对象 S
x=sym(’x’)
x = sym(’x’,’real’)
x = sym(’x’,’unreal’) 附加属性
x = sym(’x’,’positive’)
pi = sym(’pi’)
delta = sym(’1/10’)
S = sym(A,flag),将数值或矩阵转化为符号形式其中 flag 选项有四项参数 ’ f’,’r’,’e’ 和 ’ d’,’r’为缺省项 。
’ f’,代表十六进制浮点形式;
’ r’,代表有理数形式;
’ e’,估计误差;
’ d’,表示十进制小数 。
第 3章 矩阵、数组和符号运算
>> A=[2/5,4/0.78,sqrt(23)/3;0.33,0.3333,log(4)] % 输入数值矩阵 A
A =
0.4000 5.1282 1.5986
0.3300 0.3333 1.3863
>> FA=sym(A) % 将数值矩阵 A转化为符号矩阵 FA
FA =
[ 2/5,200/39,sqrt(23/9)]
[ 33/100,3333/10000,6243314768165359*2^(-52)]
不管数值矩阵的元素是 以分数或是浮点数 表示,转换后的符号矩阵都将以 最接近有理式 的形式给出 。
b,syms 函数
syms arg1 arg2,..
>> syms a b c x y
2,符号表达式和矩阵的创建
a.字符串 直接输入 创建
符号表达式和符号方程对 空格 很敏感。因此,在创建符号表达式或符号方程时,不要在字符间任意加空格符;
符号计算中出现的 数字 也是当作符号处理的;
>> f='a*x^2+b*x+c'
f =
a*x^2+b*x+c
>> f='a*x^2+b*x+c=0'
f =
a*x^2+b*x+c=0
第 3章 矩阵、数组和符号运算第 3章 矩阵、数组和符号运算
这种方法 输入符号矩阵 与 字符串矩阵 的输入相似 。 但要保证在同一列中各元素字符串有 同样的长度,在较短的字符串前后用空格符填充;
这种方法要求 符号矩阵 每一行的两端都有方括号,而 字符串矩阵 仅在首尾有方括号 。
>> B=['[4+x x^2 x ]';'[x^3 5*x-3 x*a]']
B =
[4+x x^2 x ]
[x^3 5*x-3 x*a]
第 3章 矩阵、数组和符号运算
b.由 sym 命令创建
>> f=sym('a*x^2+b*x+c')
f =
a*x^2+b*x+c
>> f1=sym('a*x^2+b*x+c=0')
f1 =
a*x^2+b*x+c=0
>> A=sym('[4+x,x^2,x;x^3,5*x-3,x*a]')
A =
[ 4+x,x^2,x]
[ x^3,5*x-3,x*a]
第 3章 矩阵、数组和符号运算
c.由 syms 命令创建
>> syms x a b c
>> f=a*x^2+b*x+c
f =
a*x^2+b*x+c
>> syms x a
>> B=[4+x x^2 x;x^3 5*x-3 x*a]
B =
[ 4+x,x^2,x]
[ x^3,5*x-3,x*a]
不能创建符号方程第 3章 矩阵、数组和符号运算
3,数字矩阵和符号矩阵的转换
MATLAB 中的 数值型,字符型和符号型 三种数据类型中 数值变量级别最低,字符变量级别居中,符号变量级别最高 ;
三种变量参与的混合运算,系统将会把所有参与运算的变量自动统一转换为 变量等级最高的类型,然后进行计算;
可以通过命令来完成对 不同数据类型之间的转换,大致可以分为三种情况:
转换为数值变量,double,str2num,numeric
转化为符号变量,sym
转化为字符变量,int2str,num2str
第 3章 矩阵、数组和符号运算
4,MATLAB 关于不同精度的控制
针对 浮点运算 的数值算法计算速度最快,占用计算机内存最少 的算法,与 C、
FORTRAN 语言中的浮点运算算法完全相同 。 在机器内的表达和计算都是一个被,截断,的 8位浮点近似值 。
针对 精确运算 的符号算法计算时间最长,内存占用最多,精度也最高 。
任意精度 的算法运算时间,内存占用和计算精度均介于以上两种运算之间 。
采用函数 digits 来控制十进制结果的 有效位数 。 digits 的缺省值为 32,大约对应于浮点精度 。
符号数学工具箱中,用 vpa 函数执行任意精度运算 。
第 3章 矩阵、数组和符号运算
>> syms x
>> f=x-cos(x)
f =
x-cos(x)
>> f1=subs(f,x,‘pi’) %将符号表达式中的变量替换为另一变量
f1 =
pi+1
>> digits(25)
>> vpa(f1)
ans =
4.141592653589793238462643
>> vpa(f1,6)
ans =
4.14159
>> numeric(f1)
ans =
4.1416
>> double(f1)
ans =
4.1416
5,符号矩阵的运算
a,基本运算四则运算
两个符号矩阵的 大小相等 方可进行 加减运算,符号矩阵和 符号标量 的加减运算按照 数组运算 规则进行;
两个符号矩阵只有 内积 相等 时才可以进行 乘法运算 ;
符号的乘方运算 S^p,若 S 为 符号表达式,p 可以为符号 表达式或数值表达式 ;若 S 为 符号矩阵,则
p 必须是 整数 。
第 3章 矩阵、数组和符号运算第 3章 矩阵、数组和符号运算
>> a=sym('[1/x,1/(x+1); 1/(x+2),1/(x+3)]')
a =
[ 1/x,1/(x+1)]
[ 1/(x+2),1/(x+3)]
>> b=sym('[x,1; x+2,0]')
b =
[ x,1]
[ x+2,0]
>> b-a
ans =
[ x-1/x,1-1/(x+1)]
[ x+2-1/(x+2),-1/(x+3)]
>> a\b
ans =
[ -6*x-2*x^3-7*x^2,3/2*x^2+x+1/2*x^3]
[ 6+2*x^3+10*x^2+14*x,-1/2*x^3-2*x^2-3/2*x]
>> a.\b
ans =
[ x^2,x+1]
[ (x+2)^2,0]
>> a^2
ans =
[ 1/x^2+1/(x+1)/(x+2),1/x/(x+1)+1/(x+1)/(x+3)]
[ 1/(x+2)/x+1/(x+3)/(x+2),1/(x+1)/(x+2)+1/(x+3)^2]
>> exp(b)
ans =
[ exp(x),exp(1)]
[ exp(x+2),1]
第 3章 矩阵、数组和符号运算矩阵运算
>> a'
ans =
[ 1/conj(x),1/(2+conj(x))]
[ 1/(1+conj(x)),1/(3+conj(x))]
>> inv(a)
ans =
[ 1/2*x*(x+1)*(x+2),-1/2*x*(x+3)*(x+2)]
[ -1/2*x*(x+3)*(x+1),1/2*(x+3)*(x+1)*(x+2)]
>> det(a)
ans =
2/x/(x+3)/(x+1)/(x+2)
>> rank(a)
ans =
2
>> eig(b)
ans =
[ 1/2*x+1/2*(x^2+4*x+8)^(1/2)]
[ 1/2*x-1/2*(x^2+4*x+8)^(1/2)]
>> triu(a)
ans =
[ 1/x,1/(x+1)]
[ 0,1/(x+3)]
>> diag(a)
ans =
[ 1/x]
[ 1/(x+3)]
>> tril(a)
ans =
[ 1/x,0]
[ 1/(x+2),1/(x+3)]
第 3章 矩阵、数组和符号运算
b.符号矩阵的简化因式分解
>> syms x
>> factor(x^9-1)
ans =
(x-1)*(x^2+x+1)*(x^6+x^3+1)
符号矩阵展开
>> syms x y
>> expand((x+1)^3)
ans =
x^3+3*x^2+3*x+1
>> expand(sin(x+y))
ans =
sin(x)*cos(y)+cos(x)*sin(y)
同类项合并
>> syms x y
>> collect(x^2*y+y*x-x^2-2*x)
ans =
(y-1)*x^2+(y-2)*x
分式通分
>> syms x y
>> [n,d]=numden(x/y+y/x)
n =
x^2+y^2
d =
y*x
符号简化
>> syms x
>> simple(cos(x)^2-sin(x)^2)
simplify:
2*cos(x)^2-1
radsimp:
cos(x)^2-sin(x)^2
combine(trig):
cos(2*x)
factor:
(cos(x)-sin(x))*(cos(x)+sin(x))
expand:
cos(x)^2-sin(x)^2
combine:
cos(2*x)
第 3章 矩阵、数组和符号运算
convert(exp):
(1/2*exp(i*x)+1/2/exp(i*x))^2+1/4*(exp(i*x)-1/exp(i*x))^2
convert(sincos):
cos(x)^2-sin(x)^2
convert(tan):
(1-tan(1/2*x)^2)^2/(1+tan(1/2*x)^2)^2-4*tan(1/2*x)^2/(1+tan(1/2*x)^2)^2
collect(x):
cos(x)^2-sin(x)^2
ans =
cos(2*x)
>> simplify(cos(x)^2-sin(x)^2)
ans =
2*cos(x)^2-1
>> simplify(sin(x)^2+cos(x)^2)
ans =
1
第 3章 矩阵、数组和符号运算第 3章 矩阵、数组和符号运算
6,符号微积分
Matlab自变量确定原则:除 i,j外,字母位置 最接近 x的小写字母 为自变量;如果表达式中没有变量,x会 被视为默认的变量。由函数
findsym可一找到默认变量
a,符号极限
limit(F,x,a)
limit(F,a),变量为由 findsym定义的默认变量
limit(F,x,a,’right’) /limit(F,x,a,’left’)
Limit(F),a=0
>> syms x a t h
>> limit(sin(x)/x)
ans =
1
>> limit((1+2*t/x)^(3*x),x,inf)
ans =
exp(6*t)
>> limit(1/x,x,0,'right')
ans =
inf
b.符号积分
int(S) 不定积分
int(S,v)
int(S,a,b) 定积分
int(S,v,a,b)
>> syms x x1 alpha u t;
>> A=[cos(x*t),sin(x*t);-sin(x*t),cos(x*t)]
A =
[ cos(x*t),sin(x*t)]
[ -sin(x*t),cos(x*t)]
>> int(A,t)
ans =
[ 1/x*sin(x*t),-cos(x*t)/x]
[ cos(x*t)/x,1/x*sin(x*t)]
>> int(x1*log(1+x1),0,1)
ans =
1/4
第 3章 矩阵、数组和符号运算符号合计函数
Symsum(S)
Symsum(S,v)
Symsum(S,a,b)
>> syms k n;
>> simplify(symsum(k))
ans =
1/2*k^2-1/2*k
>> simplify(symsum(k^2,0,n))
ans =
1/3*n^3+1/2*n^2+1/6*n
>> simplify(symsum(k^2,0,10))
ans =
385
c,符号微分和差分
微分和差分
Diff(S)
Diff(S,v)
Diff(S,n)
Diff(S,v,n)
>> syms x
>> diff(sin(x^2))
ans =
2*cos(x^2)*x
>> diff(t^6,6)
ans =
720
第 3章 矩阵、数组和符号运算
>> syms x t;
>> A=[cos(x*t),sin(x*t);-sin(x*t),cos(x*t)]
A =
[ cos(x*t),sin(x*t)]
[ -sin(x*t),cos(x*t)]
>> diff(A,x) %>> diff(A,'x')
ans =
[ -sin(x*t)*t,cos(x*t)*t]
[ -cos(x*t)*t,-sin(x*t)*t]
>> diff(A,t,2)
ans =
[ -cos(x*t)*x^2,-sin(x*t)*x^2]
[ sin(x*t)*x^2,-cos(x*t)*x^2]
第 3章 矩阵、数组和符号运算
梯度函数
DF=gradient(F) 一维梯度
[FX,FY]=gradient(F) 二维梯度
[FX,FY]=gradient(F,H)
[FX,FY]=gradient(F,HX,HY)
[FX,FY,FZ]=gradient(F) 三维梯度
[FX,FY,FZ]=gradient(F,HX,HY,HZ)
H指定间距,默认为 1
>> [x,y]=meshgrid(-2:0.2:2,-2:0.2:2);
>> z=x.*exp(-x.^2-y.^2);
>> [px,py]=gradient(z,0.2,0.2);
>> contour(z)
>> hold on
>> quiver(px,py) %画矢量图
>> hold off
d.傅立叶变换和傅立叶逆变换
傅立叶快速离散变换
MATLAB 提供了 fft(内置函数 ),ifft,fft2,ifft2,fftn、
ifftn,fftshift,ifftshift 等函数,用来计算矩阵的离散快速傅立叶变换。
函数 fft和 ifft
函数 fft最完整的调用格式为:
Y=fft(X,[],dim) 或 Y= fft(X,n,dim)
数据长度 n是 2 次幂时,可以采用 基 -2 算法进行快速计算。
输入参数 X 可以是向量,矩阵 。
dim 指定变换的实施方向 。 当 X 是矩阵时,1 指明变换按列进行 ( 默认 ),2 指明变换按行进行 。
第 3章 矩阵、数组和符号运算第 3章 矩阵、数组和符号运算
>> X=[1,2,3;4,5,6;7,8,9]
X =
1 2 3
4 5 6
7 8 9
>> Y=fft(X)
Y =
12.0000 15.0000 18.0000
-4.5000 + 2.5981i -4.5000 + 2.5981i -4.5000 + 2.5981i
-4.5000 - 2.5981i -4.5000 - 2.5981i -4.5000 - 2.5981i
函数 fft2和 ifft2
函数 fft2 和 ifft2 是对数据做二维快速傅立叶变换和逆傅立 叶变换 。 数据 的二维 傅立叶 变换 fft2(X) 相当 于
fft(fft(X)’)’,即先对 X 的列 做一维傅立叶变换,然后对 变换结果的行 做一维傅立叶变换 。
其调用格式为,Y=fft2(X,mrows,ncols)
和函数 fft2 和 ifft2 类似,函数 fftn 和 ifftn 对数据做多维快速傅立叶变换。
函数 fftshift 和 ifftshift
函数 fftshift 用于把傅立叶变换结果 ( 频域数据 ) 中的 直流分量 ( 频率为 0 处的值 ) 移到中间位置 。
其调用格式为,Y=fftshift(X)
>> X=rand(3,3)
X =
0.9501 0.4860 0.4565
0.2311 0.8913 0.0185
0.6068 0.7621 0.8214
>> Y=fft(X)
Y =
1.7881 2.1394 1.2964
0.5311 + 0.3254i -0.3407 - 0.1119i 0.0365 + 0.6953i
0.5311 - 0.3254i -0.3407 + 0.1119i 0.0365 - 0.6953i
第 3章 矩阵、数组和符号运算
>> Y1=fftshift(X)
Y1 =
0.8214 0.6068 0.7621
0.4565 0.9501 0.4860
0.0185 0.2311 0.8913
傅立叶积分变换及其反变换离散傅立叶变换 ( DFT) 作用于有限数据采样,傅立叶变换 作用于连续函数 。
傅立叶变换调用格式为:
◆ F = fourier(f),求表达式 f 的傅立叶变换 。 缺省的 自变量为 x,缺省的 返回值是关于 w 的函数 。
◆ F = fourier(f,v),返回函数 F 是关于符号表达式对象 v 的 函数,而不是缺省的 w。
◆ F=fourier(f,u,v),对关于 u 的函数 f 进行变换,返回函数 F 是 关于
v 的函数 。
傅立叶逆变换调用格式为:
◆ f = ifourier(F),符号表达式对象 F的傅立叶逆变换 。 缺省的 自变量为 w,缺省 返回是关于 x 的函数 。
◆ f = ifourier(F,u),返回函数 f 是关于符号表达式对象 u 的函数,
而不是缺省的 x的函数 。
◆ f = ifourier(F,v,u),对关于 v 的函数 F 进行变换,返回 关于 u 的 函数 f。
第 3章 矩阵、数组和符号运算
>> syms x t w u;
>> fourier(exp(-x^2))
ans =
pi^(1/2)*exp(-1/4*w^2)
>> fourier(exp(-x^2),u)
ans =
pi^(1/2)*exp(-1/4*u^2)
>> fourier(exp(-t^2),t,u)
ans =
pi^(1/2)*exp(-1/4*u^2)
>> ifourier(sym('fourier(f(x),x,w)'),w,x)
ans =
f(x)
>> ifourier(exp(-w^2))
ans =
1/2/pi^(1/2)*exp(-1/4*x^2)
第 3章 矩阵、数组和符号运算
e,Laplace变换
L=laplace(F) x s
L=laplace(F,z) x z
L=laplace(F,w,z) w z
>> syms x s w z
>> laplace(sin(x))
ans =
1/(s^2+1)
>> laplace(sin(x),w)
ans =
1/(w^2+1)
第 3章 矩阵、数组和符号运算
>> laplace(sin(x*w))
ans =
w/(s^2+w^2)
>> laplace(sin(x*w),w,z)
ans =
x/(z^2+x^2)
( 1)设,
对 f(x)和 g(x)进行因式分解。
( 2)运用 simplify 命令简化,并与采用 simple 命令得出的结果相比较。
( 3) 计算下列极限 a,b.
( 4) 建立一个符号表达式 y=sin((a+b)2*x+ c),分别以变量 c 进行积分,以变量 x 从 pi/2 到 pi 进行积分,
( 5) 求符号矩阵 F 对变量 x 的一阶微分,对变量 a 的二阶微分
F=[cos(a*x) sin((a+b)2*x)]
[-sin(b*x) en];
xxf 2s inc o s
上机练习( 5)
1)( 24 xxxxg 32)( 2345 xxxxxf
20
c o s1lim x x
x
xx
x
x s in
2c o s1lim
0
( 6) 建立一个包含 的符号表达式,并将该表达式转换为符号变量 。
( 7) 用符号计算验证下述三角恒等式的正确性 。
( 8) 用 rand 函数建立一个 3× 3 维随机数值矩阵,并将该数值矩阵转换为符号矩阵,比较它们的不同 。
( 9) 分别用 1 位和 10 位有效数字计算 2*pi+3.1415 的值,
并比较与采用 format 格式的差别 。
( 10)求下述矩阵的逆、特征根和矩阵的行列式值。
上机练习( 5)
)c os ()s in (2 xx
)s i n (s i nc o sc o ss i n 212121
333231
232221
131211
aaa
aaa
aaa
A?

2221
1211
aa
aaA