matlab sym用法_MATLAB符号计算(一)

点击蓝字

关注我们

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的主变量。

三、符号矩阵

符号矩阵也是一种符号表达式,所以符号表达式运算都可以用在矩阵意义下进行。

注意:这些函数作用于符号矩阵,是分别作用于矩阵的每一个元素。

例如:建立符号矩阵并简化。

 155867ddf9b9e2ab8782363f1f09a0bd.png

>> 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]

【例】当λ取何值时,以下齐次线性方程组有非零解。

b13908f66da87a0347282e6bf06cc992.png

对于其次线性方程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’)

【例】求下列极限。

matlab sym用法_MATLAB符号计算(一)_第1张图片

>> 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。

【例】求下列函数的导数。

e3f26a09403e86327b5fcb84dbbd25c0.png

>> 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的不定积分。

【例】求下列不定积分。

b4d0d827fe64bbdbb205cfff05c2e3f2.png

>> 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中有一个是符号表达式时,函数返回一个符号函数。

【例】求下列定积分

matlab sym用法_MATLAB符号计算(一)_第2张图片

>> 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

matlab sym用法_MATLAB符号计算(一)_第3张图片

第②问:

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 sym用法_MATLAB符号计算(一)_第4张图片

参考课程:中南大学《科学计算与MATLAB语言》

如有侵权,请联系删除

matlab sym用法_MATLAB符号计算(一)_第5张图片

微信公众号|技术人的文学小天地

微信号|li15035869237

你可能感兴趣的:(matlab,sym用法)