点击蓝字
关注我们
01
符号对象
一、符号对象的建立
(1)sym函数
sym函数用于建立单个符号对象,其常用调用格式为:
符号对象名=sym(A)
将由A来建立符号对象。其中,A可以是一个数值常量、数值矩阵或数值表达式(不加单引号),此时符号对象为一个符号常量;A也可以是一个变量名(加单引号),这是符号对象为一个符号变量。
>> t=sym(2);>> t+1/2ans =5/2>> sin(sym(pi/3))ans =3^(1/2)/2>> sin(pi/3)ans = 0.8660>> a=5;>> b=8;>> x=sym('a');>> y=sym('b');>> w=(x+y)*(x-y)w =(a + b)*(a - b)>> s=(a+b)*(a-b)s = -39>> eval(w) %将符号表达式表示为数值结果ans = -39
由上面的例子可以看出:
符号计算的结果是一个精确的数学表达式。
数值计算的结果是一个数值。
(2)syms命令
syms命令可以一次定义多个符号变量,一般其调用格式如下:
syms 符号变量名1 符号变量名2 ... 符号变量名n
其中变量名不能加单引号,相互之间空格隔开。
例如,要同时定义四个符号变量a、b、c、d,则可以输入如下命令:
>> syms a b c d
二、符号对象的运算
(1)四则运算
符号表达式的四则运算与数值运算一样,用+、-、*、/、^运算符实现,其运算结果依然是一个符号表达式。例如:
>> syms x;>> f=2*x^2+3*x-5;>> g=x^2-x+7;>> f+gans =3*x^2 + 2*x + 2
(2)关系运算
6种关系运算符:<、<=、>、>=、==、~=。
对应的6个函数:lt()、le()、gt()、ge()、eq()、ne()。
若参与运算的是符号表达式,其结果是一个符号关系表达式;若参与运算的是符号矩阵,其结果是由符号关系表达式组成的矩阵。
在进行符号对象的运算前,可用assume函数对符号对象设置值域,函数调用格式为:
assume(condition)
assume(expr,set)
第一种格式指定变量满足条件condition,第二种格式指定表达式expr属于集合set。
>> syms x;>> assume(x<0);>> abs(x)==x ans = -x == x
因为x<0,所以abs(x)的值为-x。
>> assume(x,'positive');>> abs(x)==x ans = x == x
因为x为正数,所以abs(x)的值为x。
(3)逻辑运算
3种逻辑运算:&(与)、|(或)、~(非)。
4个逻辑运算函数:and(a,b)、or(a,b)、not(a)和xor(a,b)。
>> syms x;>> y=x>0&x<10 y = 0 < x & x < 10 >> y=and(x>0,x<10) y = 0 < x & x < 10
(4)因式分解与展开运算
MATLAB提供了符号表达式的因式分解与展开的函数,函数调用格式为:
①factor(s):对符号表达式s分解因式。
②expand(s):对符号表达式s进行展开。
③collect(s):对符号表达式s合并同类项。
④collect(s,v):对符号表达式s按变量v合并同类项。
>> syms a b;>> s=a^3-b^3;>> factor(s) ans = [ a - b, a^2 + a*b + b^2] >> factor(12) ans = 2 2 3
【例】梅森素数的验证问题
所谓梅森数,是指形如2p-1一类整数,其中指数p是素数。将梅森数记为Mp。如果梅森数是素数,就称为梅森素数。请验证M19、M23、M29、M31是否为梅森素数。
>> syms p;>> m=2^p-1;>> p=19;>> m19=eval(m) m19 = 524287 >> factor(m19) ans = 524287 %524287是梅森素数 >> p=23;>> m23=eval(m) m23 = 8388607 >> factor(m23) ans = 47 178481 %8388607不是梅森素数 m29 = 536870911 >> factor(m29) ans = 233 1103 2089 %536870911不是梅森素数 >> p=31;>> m31=eval(m) m31 = 2.1475e+09 >> factor(m31) ans = 2.1475e+09 %2.1475e+09是梅森素数
(5)其它运算
①提取有理分式的分子分母;[n,d]=numden(s)。
②提取符号表达式的系数:c=coeffs(s,x)。
③符号表达式化简:simplify(s)。
④符号多项式与多项式系数之间的转化:
符号多项式转化为多项式系数向量:p=sym2poly(s)。
多项式系数向量转化为符号多项式:s=poly2sym(p)。
【例】求方程ax2+bx+c=0的根。
>> syms a b c x;>> f=a*x^2+b*x+c f = a*x^2 + b*x + c >> g=coeffs(f,x) g = [ c, b, a] >> g=g(end:-1:1) g = [ a, b, c] >> roots(g) ans = -(b + (b^2 - 4*a*c)^(1/2))/(2*a) -(b - (b^2 - 4*a*c)^(1/2))/(2*a)
(6)符号运算中变量的确定
①如果没有明确指定自变量,MATLAB将按照以下原则确定主变量并对其进行相应运算:
寻找除i、j之外,在字母顺序上最接近x的小写字母。
若表达式中有两个符号变量与x的距离相等,则ASCII码大者优先。
②symvar()函数可以用于查找一个符号表达式中的符号变量,函数调用格式为:
symvar(s,n)
函数返回符号表达式s中的n个符号变量。因此,可以用symvar(s,1)查找表达式s的主变量。
三、符号矩阵
符号矩阵也是一种符号表达式,所以符号表达式运算都可以用在矩阵意义下进行。
注意:这些函数作用于符号矩阵,是分别作用于矩阵的每一个元素。
例如:建立符号矩阵并简化。
>> syms a b x y alp;>> m=[a^3-b^3,cos(alp)^2+sin(alp)^2;(15*x*y-3*x^2)/(x-5*y),78] m = [ a^3 - b^3, cos(alp)^2 + sin(alp)^2][ (- 3*x^2 + 15*y*x)/(x - 5*y), 78] >> simplify(m) ans = [ a^3 - b^3, 1][ -3*x, 78]
【例】当λ取何值时,以下齐次线性方程组有非零解。
对于其次线性方程Ax=0,当rank(A)或|A|=0时,齐次线性方程组有非零解。
syms lamda;A=[1-lamda,-2,4;2,3-lamda,1;1,1,1-lamda];D=det(A);factor(D) 程序运行结果为:ans = [ -1, lamda, lamda - 2, lamda - 3]
从而得知,当λ=0、λ=2或λ=3时,原方程组有非零解。
02
符号微积分
一、符号函数的极限
求符号函数极限的命令为limit,其调用格式为:
limit(f,x,a)
即求函数f关于变量x在a点的极限。
limit函数的另一种功能是求单边极限,其调用格式:
limit(f,x,a,’right’)
limit(f,x,a,’left’)
【例】求下列极限。
>> syms a m x n;>> f=(x^(1/m)-a^(1/m))/(x-a);>> limit(f,x,a) ans = a^(1/m - 1)/m >> g=(1+1/n)^n;>> limit(g,n,inf) ans = exp(1) %即自然常数e
二、符号函数的导数
MATLAB中的求导函数为:
diff(f,x,n)
即求函数f关于变量x的n阶导数。参数x的用法同求极限函数limit,可以缺省,默认值与limit相同,n的默认值是1。
【例】求下列函数的导数。
>> syms x y;>> f=sqrt(1+exp(x));>> diff(f) ans = exp(x)/(2*(exp(x) + 1)^(1/2)) >> g=x*exp(y)/y^2;>> diff(g,x) ans = exp(y)/y^2 >> diff(g,y) ans = (x*exp(y))/y^2 - (2*x*exp(y))/y^3
三、符号函数的积分
(1)不定积分
在MATLAB中,求不定积分的函数int(),其常用的调用格式为:
int(f,x)
即求函数f对变量x的不定积分。
【例】求下列不定积分。
>> syms x t;>> f=(3-x^2)^3;>> int(f) ans = - x^7/7 + (9*x^5)/5 - 9*x^3 + 27*x >> g=5*x*t/(1+x^2);>> int(g,t) ans = (5*t^2*x)/(2*(x^2 + 1))
(2)定积分
在MATLAB中,定积分的计算也使用int()函数,但调用格式有区别:
int(f,x,a,b)
其中,a、b分别表示定积分的下限和上限。
当函数f关于变量x在闭区间[a,b]可积时,函数返回一个定积分结果。
当a、b中有一个是inf时,函数返回一个广义积分。
当a、b中有一个是符号表达式时,函数返回一个符号函数。
【例】求下列定积分
>> syms x t;>> int(abs(1-x),1,2) ans = 1/2 >> int(1/(1+x^2),-inf,inf) ans = pi >> int(4*x/t,t,2,sin(x)) ans = 4*x*(log(sin(x)) - log(2))
【例】河道水流量的估算问题
根据实际测量,得到河流某处宽600m,其横截面不同位置某一时刻的水深如下表所示。
x | 0 | 50 | 100 | 150 | 200 | 250 | 300 |
h(x) | 4.4 | 4.5 | 4.6 | 4.8 | 4.9 | 5.1 | 5.4 |
x | 350 | 400 | 450 | 500 | 550 | 600 | |
h(x) | 5.2 | 5.5 | 5.2 | 4.9 | 4.8 | 4.7 |
①若此刻水流的流速为0.6m/s,试估计该河流此刻的流量。
②已知x方向[50,60]区间为坡式护岸的下部护脚部分,根据相关堤防设计规范,抛石护岸护脚坡度应缓于1:1.5(正切值),请估计水流冲刷是否已破坏区域的护脚。
分析:
①先拟合出河床曲线,然后进行定积分,计算出河流横截面,即可估计流量。
②根据河床曲线,计算其导函数,并判断相应范围内导函数的取值是否大于1:1.5。
第①问:
xi=0:50:600;yi=[4.4,4.5,4.6,4.8,4.9,5.1,5.4,5.2,5.5,5.2,4.9,4.8,4.7];p=polyfit(xi,yi,3);plot(xi,yi,'o',xi,polyval(p,xi));syms y x;y=poly2sym(p,x);s=int(y,x,0,600); %计算横截面积v=s*0.6; %计算水流量eval(v)
运行后结果为:
ans = 1.7874e+03
第②问:
xi=0:50:600;yi=[4.4,4.5,4.6,4.8,4.9,5.1,5.4,5.2,5.5,5.2,4.9,4.8,4.7];yn=-yi;p=polyfit(xi,yn,3);plot(xi,yn,'o',xi,polyval(p,xi));syms y x yii;y=poly2sym(p,x);yii=diff(y,x);x=50:60;k=eval(yii);all(abs(k)<1/1.5)
运行结果为:
ans = logical 1
参考课程:中南大学《科学计算与MATLAB语言》
如有侵权,请联系删除
微信公众号|技术人的文学小天地
微信号|li15035869237