符号函数即相关运算
一、MATLAB提供了两个建立符号对象的函数,sym和 syms,现分别介绍两个函数用法如下:
(1)..sym函数
sym函数用来建立单个符号量,一般调用
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
为:
符号变量名=sym(' 符号字符串 ')
该函数可以建立一个符号量,符号字符串可以是常量,变量,函数或
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
达式.应用 sym 函数还可
以定义符号常量.
(2).syms函数
函数 sym一次只能定义一个符号变量,使用不方便.MATLAB提供了另一个函数 syms,一次可
以定义多个符号变量.一般调用格式为:
Syms 符号变量名 1 符号变量名 2 ........ 符号变量名 n
用这种格式定义符号变量时不要在变量名上加定界符('),变量间用空格,不要用逗号分隔.
含有符号对象的表达式称为符号表达式,其建立方法有以下 3种:
A.利用单引号生成符号表达式;
B.用 sym函数建立符号表达式;
C.使用已经定义的符号变量组成符号表达式.
例 1.符号表达式创建实例.
U=sym('3*x^2+5*y+2*x*y+6') %定义符号表达式:3*x^2+5*y+2*x*y+6
Syms x y; %定义符号变量 x,y
V=3*x^2+5*y+2*x*y+6 %定义符号表达式 V: V=3*x^2+5*y+2*x*y+6
2*U-V+6 %求符号表达式值,结果为 12253 2 +++ xyyx
(3).符号矩阵
符号矩阵也是一种符号表达式,函数作用于符号矩阵时,是分别作用于矩阵的每一个元素.可
以通过 sym函数创立符号矩阵,矩阵的任何元素可以是任何不带等号的表达式,各符号表达式
的长度可以不同,矩阵元素之间可以用空格,也可以用逗号分隔.
例如:在命令窗口中输入 A=sym('[a ,2*b;3*a ,0]'),就完成了矩阵 A= 的创建. ⎥⎦
⎤⎢⎣
⎡
03
2
a
ba
注意:符号矩阵的每一行两端都有方括号,这与Matlab数值矩阵有区别.
在 MATLAB 中数值矩阵不能直接参与符号运算,如果要与符号矩阵运算,必须先将数值矩阵
转为符号矩阵.
A.将数值矩阵转化为符号矩阵函数调用格式为: sym(数值矩阵);
B.将符号矩阵转化为数值矩阵: numeric(符号矩阵)
由于符号矩阵是矩阵,所以也能进行有关矩阵的运算.MATLAB 还有专门的符号矩阵函数,这
些函数作用于单个数据无意义.
Determ(s) 返回 s的行列式的值
Factor(s) 对 s进行因式分解
Expand(s) 对 s进行展开
Collect(s) 对 s合并同类项
Collect(s,v) 对 s按变量 v合并同类项
Simplify(s) 应用函数规则对 s进行化简
Simple(s) 调用 matlab 的其他函数对表达式进行综合化
简,并显示化简过程
limit 求极限函数符号函数
Diff(f,x,n) 求微分最常用的符号函数(表示 f关于 x求 n阶
导数)
Int(f,r,x0,x1) 求积分最常用的符号函数(f 为积分表达式,r 为
积分变量,若为定积分,x0和 x1为积分上下限)
Symsum(fk,k,k0,kn) 级数求和的符号函数(fk 为级数通项,k 为级数
自变量,k0 和 kn 为级数的初项和末项,可设为
inf)
dsolve 求常微分方程的符号函数
fsolve 求解非线性方程组
例 1:极限和极值的符号运算实例。求极限 ]
)1(
1
ln
1[limf 2211 −−= +→ xxxx 和求和
. ])1(f
50
0n
23
2 ∑
=
−+= naan
解: 输入 matlab如下程序代码:
syms x a n %定义符号变量 a和 x
y=1/(x*(log(x)^2))-1/(x-1)^2;
f1=limit(y,x,1,'right') %求极限
f=a*n^3+(a-1)*n^2
f2=symsum(f,n,0,50) %求级数的和
运行结果
f1=1/12
f2=1668550*a-42925
例 2:微分的符号运算实例.(1)求已知表达式: )sin(f ax= ,分别对其中的 x和 a求导;(2)已
知表达式 )1log(f xx += ,求对 x的积分和 x在(0,1)上的积分值.
解:输入如下 matlab程序代码:
syms a x %定义符号变量 a和 x
f=sin(a*x) %创建函数 f
dfx=diff(f,x) %对 x求导
dfa=diff(f,a) %对 a求导
f1=x*log(1+x) %创建函数 f1
Int1=int(f1,x) %对 f1的 x积分
Int2=int(f1,x,0,1) %对 f1在[0,1]上积分
运行结果:
f =sin(a*x)
dfx =cos(a*x)*a
dfa =cos(a*x)*x
f1 =x*log(1+x)
Int1 =1/2*(1+x)^2*log(1+x)+3/4+1/2*x-1/4*x^2-(1+x)*log(1+x)
Int2 =1/4
例 3:常微分方程符号运算实例.(1)计算常微分方程 23dy xxexydx
−=+ 的通解;(2)计算
微分方程 在初始条件02xy =−+ xey ex 2y 1 == 下的特解;(3)求 的
通解.
02y ''' =++ xey
解:输入如下 matlab程序代码:
f1=dsolve('Dy+3*x*y=x*exp(-x^2)','x')
f2=dsolve('x*Dy+2*y-exp(x)=0','y(1)=2*exp(1)','x')
f3=dsolve('D2y+2*Dy+exp(x)=0','x')
运行结果:
f1 =exp(-x^2)+exp(-3/2*x^2)*C1
f2 =(exp(x)*x-exp(x)+2*exp(1))/x^2
f3 =-1/3*exp(x)-1/2*exp(-2*x)*C1+C2
可知 ,(1)的通解为 1
2
3
*ey
2
2
ce
xx += − ,其中 C1 为任意常数 ;(2)的通解为
2
2y
x
eexe xx +−= ;(3)的通解为 212 *2
1
3
1y CCee xx +−= − ,其中 C1,C2为任意常数.
偏导数和梯度
函数的偏导数定义如下:
x
yxfyxxfyxf
x x Δ
−Δ+=∂
∂
→Δ
),(),(lim),(
0
全微分可借助梯度(Gradient)定义为:
⎥⎦
⎤⎢⎣
⎡∇=∂
∂+∂
∂=
dy
dx
fdy
y
fdx
x
fyxdf ),(
梯度:基本语法:
[FX,FY]=gradient(F,h) 求二元函数的梯度
[FX,FY,FZ,…] = gradient(F,h1, h2, …)
【例 5.3.3】 对函数作梯度图
v = -2:0.2:2; [x,y] = meshgrid(v);
z = x .* exp(-x.^2 - y.^2);
subplot(1,2,1);surf(x,y,z),
subplot(1,2,2); [px,py] = gradient(z,.2,.2);
contour(x,y,z), hold on, quiver(x,y,px,py)
方向法线的绘图命令:基本语法为:
quiver3(Z,U,V,W)
quiver3(X,Y,Z,U,V,W)
quiver3(...,scale)
quiver3(...,LineSpec)
这里:X,Y,Z: 为曲线上的点。
U,V,W: 为每一点上切面的法线方向。
scale: 为实数值,可正可负。表示方向箭头的指向。
【例 5.3.4】求函数的曲面图,且作出每点的切面法向量图形。
[X,Y] = meshgrid(-2:0.25:2,-1:0.2:1); % 产生网格点
Z = X.* exp(-X.^2 - Y.^2); % 计算每个网格点的函数值
[U,V,W] = surfnorm(X,Y,Z); % 计算每个点的法向量分量
quiver3(X,Y,Z,U,V,W,0.5); % 作法向量的图形
hold on
surf(X,Y,Z);colormap hsv
view(-35,45)
axis ([-2 2 -1 1 -.6 .6])
【例 5.3.5】综合应用。我们来作一个旋转抛物面上某点的切面和该切面的法线。这里用到
了作方向法线的命令。
x=0:0.1:1;y=sqrt(2*x); % 旋转曲面的“母线”
[X,Y,Z]=cylinder(y,20); % 形成旋转曲面
[U,V,W] = surfnorm(X,Y,Z);
Z1=Z(4)-(U(4)*(X-X(4))+V(4)*(Y-Y(4)))/W(4) % 求点 X(4),Y(4),Z(4)的切平面
surf(X,Y,Z); % 在曲面上画法线
hold on;surf(X,Y,Z1);hold on %在上面点处画切平面
plot3(X(4),Y(4),Z(4),'r.','MarkerSize',30) % 将该点突出放大并用红色表示
U(1:3)=NaN;U(5:end)=NaN
hold on;quiver3(X,Y,Z,U,V,W,-4) % 作该点处的法线,长度为 4,反方向
axis equal % 该命令是必须的,使得视觉正确
5.3.3 数值积分
对于形如的积分
积分的一般命令为:
q = quad(fun,a,b)
q = quad(fun,a,b,tol)
q = quad(fun,a,b,tol,trace)
q = quad(fun,a,b,tol,trace,p1,p2,...)
[q,fcnt] = quadl(fun,a,b,...)
其中 fun表示被积函数,系数 a,b为积分的上下限,tol为用户给定的误差限,如不给出则
系统内定的值为 0.0000001。
【例 5.3.6】以下是一个比较著名的例子,计算积分
∫ − +
1
1 2251
1 dx
x
Q = quad('1./(1+25*x.^2)',-1,1)
ans = 0.5494
也可以使用内联函数定义被积函数
F = inline('1./(1+25*x.^2)'); % 定义一个内联函数
Q = quad(F,-1,1);
ans = 0.5494
【例 5.3.7】对空间曲线求积分,设空间曲线的参数方程为:
t = 0:pi/50:10*pi;
x = t.*sin(t), y = t.*cos(t), z=t;
plot3(t.*sin(t),t.*cos(t),t,'LineWidth',2)
f = inline('sqrt(4*(t.*sin(t)).^2 + (t.*cos(t)).^2 …
+ 1)');
len = quad(f,0,pi)
计算结果为:
len = 8.5191
5.3.4 二重积分
二重积分的原理与一重积分一样,使用也很方便。其语法为:
q = dblquad(fun,xmin,xmax,ymin,ymax)
q = dblquad(fun,xmin,xmax,ymin,ymax,tol)
q = dblquad(fun,xmin,xmax,ymin,ymax,tol,method)
∫ ∫− − +−11 11 )( 22 dxe yx【例 3.3.8】求积分
q=dblquad('exp(-x.^2.-y^2)',-1,1,-1,1)
q = 2.2310
求一元函数的 0点命令 fzero
其基本语法为:
x = fzero(fun,x0)
x = fzero(fun,x0,options)
x = fzero(fun,x0,options,P1,P2,...)
[x,fval] = fzero(...)
[x,fval,exitflag] = fzero(...)
[x,fval,exitflag,output] = fzero(...)
这里
fun: 被求解的函数,可用 inline或字符串定义
x0: 为初初始值,可以是一个数,也可以是一个区间
fval: 目标函数值
options:输出显示项,可选择
display: 'off' : 没有输出
'iter': 将每一步的迭代结果都输出来
'notify': 只有当迭代不收敛时才输出警告信息(系统内定值)
TolX: 迭代终止精度。
【例 5.4.2】在[1,2]范围 sinx^2的根并显示详细迭代步骤。
options=optimset('Display','iter')
x = fzero('sin(x*x)',[1 2],options)
结果为:
Func-count x f(x) Procedure
1 1 0.841471 initial
2 2 -0.756802 initial
3 1.52649 0.725271 interpolation
4 1.75821 0.0502804 interpolation
5 1.77439 -0.00687537 interpolation
6 1.77245 3.0226e-005 interpolation
7 1.77245 1.62826e-008 interpolation
8 1.77245 -1.2098e-015 interpolation
9 1.77245 1.89882e-015 interpolation
Zero found in the interval: [1, 2].
x = 1.7725
对于任意 f(x) 可能有 0点,可能没有,可能有多个 0点,甚至可能有无穷的 0点。因此找
不到一个通解,我们可以通过人机对话,将函数显示在屏幕上,在可能的点上用鼠标采样得
到 5.4.2 求多元非线性方程组的根
求多元非线性方程组的根,算法较为复杂,我们可以利用 fsolve命令来求解,其命令语法为:
x = fsolve(fun,x0)
x = fsolve(fun,x0,options)
x = fsolve(fun,x0,options,P1,P2, ... )
[x,fval] = fsolve(...)
[x,fval,exitflag] = fsolve(...)
[x,fval,exitflag,output] = fsolve(...)
[x,fval,exitflag,output,jacobian] = fsolve(...)
这里
fun:多元非线性方程组
x0: 一向量,初始值
fval: 目标函数值
output: 输出内容控制
iterations:迭代次数输出
初始点,然后让计算机根据这些点自动分别地求出每一个根。
funcCount: 计算函数值
algorithm: 算法使用
cgiterations: PCG迭代次数(仅对大型问题)
stepsize:: 最终步长的选择(仅对中型问题)firstorderopt
options: 输出显示项,可选择
Diagnostics: 输出诊断信息
display:
'off' : 没有输出
'iter': 将每一步的迭代结果都输出来
'notify': 只有当迭代不收敛时才输出警告信息(系统内定值)
Jacobian: 雅克比方法
'on' : 精确雅克比方法
'off': 近似雅克比方法
MaxFunEvals:函数的最大上限
MaxIter: 最大迭代次数
TolFun: 终止容忍函数值
TolX: 终止迭代容忍度
exitflag: 退出条件
> 0 表示函数收敛到某解,正常退出
达到最大给定迭代次数,退出
< 0 求解过程不收敛
【例 5.4.4】求解二元函数方程组
( )⎩⎨
⎧
=−+−=
=−−=
−
−
02,
02),(
2
1
212
211
x
x
exxyxf
exxyxf
在[-5,-5]为初始值的零点。
F = '[2*x(1) - x(2) - exp(-x(1)), -x(1) + 2*x(2) - exp(-x(2))]';
x0 = [-5; -5]; % 初始值
options=optimset('Display','iter'); % 为 Option 设置值
[x,fval] = fsolve(F,x0,options) % 求零点
x = 0.5671
0.5671
fval = 1.0e-008 *
-0.5319 -0.5319
注: 已知函数表达式, 想输入参数后得到结果, 可以可以使用匿名函数的方法得到, 现举例
如下:
函数名=@(参数表列) 表达式
例如: 已知表达式 y=sin x+cos y ,x=pi/4 ,y=pi/5 ,要求计算此时的 y值.
>> f=@( x,y) sin(x)+cos(y)
f =
@(x,y)sin(x)+cos(y)
>> f(pi/4,pi/5)
ans =
1.516
solve 函数主要是用来求解线性方程组的解析解或者精确解。对于得出的结果是符号变
量,可以通过 vpa()得出任意位数的数值解!
语法定义主要有以下四种:
solve(eq)
solve(eq, var)
solve(eq1, eq2, …, eqn)
g = solve(eq1, eq2, …, eqn, var1, var2, …, varn)
eq代表方程,var代表的是变量。
例 1:
syms a b c x;
solve(‘a*x^2 + b*x + c’)
当没有指定变量的时候 matlab默认求解的是关于 x的一元二次方程的解,求解的结果为:
ans = -(b + (b^2 – 4*a*c)^(1/2))/(2*a) -(b – (b^2 – 4*a*c)^(1/2))/(2*a)
当指定变量为 b的时候:
syms a b c x; solve(‘a*x^2 + b*x + c’,'b’)
求解的结果为:
ans = -(a*x^2 + c)/x
从上面的例子很容易理解语法 1,2。
例 2:对于方程组的情况
syms x;
S = solve(‘x + y = 1′,’x – 11*y = 5′); S = [S.x S.y]
求解的结果为:
S = [ 4/3, -1/3]
例 3:
syms a u v; A = solve(‘a*u^2 + v^2′, ‘u – v = 1′, ‘a^2 – 5*a + 6′)
的求解结果为
A = a: [4x1 sym] u: [4x1 sym] v: [4x1 sym] 对于查看具体的数值可以通过
Aa = A.a Au = A.u Av = A.v
命令来查看。
PS:对于 solve求解的方程,默认的为 eq=0,eq1=0,eq2=0….eqn=0
SUBS函数的调用:
),,( newoldfsuby = 用(new)新变量替换 中的(old)旧变量后得到f y
),( newfsuby =
y
用(new)新变量替换 中由 返回的变量
得到
f )1,( ffindsym
常用的实例: 用)6/,,( pixfsuby =
6
π 替换 中的 old后得到f y。
})3,2,6/{},,,{,( pibaxfsuby = 分别用
6
π ,2,3替换 中的 x,a,b后赋给 y. f