Matlab基础(四)——符号计算

  • MATLAB中,符号表达式有符号函数符号方程两种
  • 字符就是符号变量的值
  • 符号表达式被表示为字符串或者字符串组

1.符号变量\表达式的定义 syms

符号变量通过命令syms定义,可同时定义多个
Matlab系统有默认的符号自变量,主要为:x,x1,y,y1,z,v,u,t,theta,alpha
在这里插入图片描述

	syms x y u v 
	f=x*log(x)+y*u

2.符号矩阵的运算

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

3.符号表达式运算

(1)基本运算

collect(S,v)—— 按指定变量v的次数对符号多项式S合并同类项
collect(x^2*y+y*x-x^2-2*x)%此处默认x为符号变量
ans = (y - 1)*x^2 + (y - 2)*x
collect(x^2*y+y*x-x^2-2*x,y)%此处选择y为符号变量
		ans =(x^2 + x)*y - x^2 - 2*x
expand(S) —— 将符号表达式S展开
syms x
p = (x - 2)*(x - 4);
expand(p)

ans =
	x^2 - 6*x + 8
factor(x) —— 将符号表达式x因式分解。
[N,D]=numden(A) % 求符号表达式A的分子N和分母D
simplify——对符号表达式S进行化简
size——求矩阵的维数

(2)符号变量的操作

symvar

C = symvar(expr)搜索表达式 expr,查找除 i、j、pi、inf、nan、eps 和公共函数之外的标识符。这些标识符是表达式中变量的名称。

subs(S,old,new)

用变量new替换符号表达式或者符号矩阵S中的变量old

```matlab
>> syms a  b
>> subs(a*b^2,a*b,5)
ans =
5*b
```

(已被淘汰)

  • findsym(S):求符号表达式或符号矩阵S中的符号变量

(3)符号函数计算

conj(A)

求符号复数A的共轭复数
real(Z)——求符号复数的实部
imag(Z)—— 求符号复数的虚部

compose

compose(f,g),求f=f(y),g=g(x)的复合函数f[g(x)]
当函数自变量不清晰时,可用:
compose(f,g,y,x) —— 指明f是变量y的函数,g是变量x的函数
compose(f,g,y,x,z) —— 将最终的复合函数自变量替换为z

```matlab
>> f=a^3+b
f =
a^3 + b
>> g=2*x^3+sin(y)
g =
2*x^3 + sin(y)
>> compose(f,g,b,x,z)
ans =
a^3 + 2*z^3 + sin(y)
```
  • finverse
    g=finverse(f)——求符号函数f的反函数g
    g=finverse(f,v)——求符号函数f对指定自变量v的反函数g

(4)符号多项式

r=poly2sym(P,v):按指定变量v将数值系数向量p转化为符号变量多项式r
>> f=poly2sym([1 2 3 4 5 ],x)
f =
x^4 + 2*x^3 + 3*x^2 + 4*x + 5

4.符号微积分

(1)符号函数的极限

limit(F,x,a)——计算当x趋向于a时,符号表达式F的极限值;
limit(F,x,a,'right')——计算当x趋向于a时,符号表达式F的右极限值;
limit(F,x,a,'left')——计算当x趋向于a时,符号表达式F的左极限值;

注:极限用inf表示

>> syms x
>> limit(atan(x),x,-inf)
 
ans =
 
-pi/2

(2)符号函数的导数

diff(S,v,n):计算符号表达式S对自变量vn阶导数。

(v,n可忽略)
例子:求二元函数
2 x y x 2 + y 2 \tfrac{2xy}{x^2+y^2} x2+y22xy
的两个一阶偏导数和三个二阶偏导数:

>> syms x y
>> S=(2*x*y)/(x^2+y^2)
S =
(2*x*y)/(x^2 + y^2)

>> DIF_X_1=diff(S,x,1)
DIF_X_1 =
(2*y)/(x^2 + y^2) - (4*x^2*y)/(x^2 + y^2)^2

>> DIF_Y_1=diff(S,y,1)
DIF_Y_1 =
(2*x)/(x^2 + y^2) - (4*x*y^2)/(x^2 + y^2)^2

>> DIF_X_2=diff(S,x,2)
DIF_X_2 =
(16*x^3*y)/(x^2 + y^2)^3 - (12*x*y)/(x^2 + y^2)^2

>> DIF_Y_2=diff(S,y,2)
DIF_Y_2 =
(16*x*y^3)/(x^2 + y^2)^3 - (12*x*y)/(x^2 + y^2)^2

>> DIF_XY_2=diff(DIF_X_1,y)
DIF_XY_2 =
2/(x^2 + y^2) - (4*x^2)/(x^2 + y^2)^2 - (4*y^2)/(x^2 + y^2)^2 + (16*x^2*y^2)/(x^2 + y^2)^3

(3)符号函数的积分

int(S,v)对符号表达式S中的指定变量vS的不定积分
int(S,v,a,b)对符号表达式S中的指定变量v在区间[a,b]上,求S的定积分

例子:计算不定积分
f ( x ) = ∫   e 2 x c o s 3 x d x   . f(x) = \int_\ e^{2x}cos3xdx\,. f(x)= e2xcos3xdx.

>> f=exp(2*x)*cos(3*x)
f =
cos(3*x)*exp(2*x)
>> F=int(f,x)
F =
(exp(2*x)*(2*cos(3*x) + 3*sin(3*x)))/1

%验证正确性
>> diff(F)
ans =
(2*exp(2*x)*(2*cos(3*x) + 3*sin(3*x)))/13 + (exp(2*x)*(9*cos(3*x) - 6*sin(3*x)))/13

>> simplify (ans)
ans =
cos(3*x)*exp(2*x)

(4)级数求和与函数的级数展开

symsum(S,v,a,b):对符号表达式S中的指定变量vab求和。

例子:求和
1 + 2 + 3 + … … + n = ∑ k = 1 n k 1+2+3+……+n=\sum_{k = 1}^{n} k 1+2+3+……+n=k=1nk

>> syms k n
>> F1 = symsum(k,k,1,n)
F1 =
(n*(n + 1))/2

T = taylor(f,var,a)近似于 f,在点 var = a 处用 f 的泰勒级数展开。
syms x
T1 = taylor(exp(x))

在这里插入图片描述

T2 = taylor(sin(x))

在这里插入图片描述
(默认展开5阶)

(5)符号函数求解

solve函数——方程和系统求解器

solve(eq,v):对指定变量v求解方程eq的根。

在这里插入图片描述

指定v时:
在这里插入图片描述



solve函数也可以求解方程组与不等式。

  • 求解多个变量时,将输出存储在结构数组中比存储在单独的变量中更方便。
  • 当您指定单个输出参数并且存在多个输出时,solve 函数将返回一个结构。
	>> syms u v
	eqns = [2*u + v == 0, u - v == 1];
	S = solve(eqns,[u v])
	S = 
	 包含以下字段的 struct:
    u: 1/3
    v: -2/3


例子:
在这里插入图片描述

syms u v
eqns = [2*u^2 + v^2 == 0, u - v == 1];
vars = [v u];
[solv, solu] = solve(eqns,vars)

在这里插入图片描述


  • 解决高阶多项式方程
    解决高阶多项式方程时,solve函数可能返回含root的隐式解,尝试通过使用“MaxDegree”调用求解器来获得此类方程的显式解。该选项指定求解器尝试返回显式解的最大多项式次数。默认值为 2。增加此值,您可以获得高阶多项式的显式解。
    在这里插入图片描述
>> syms x
p = x^3 + 3*x - 16;
R = solve(p,x)
R =
root(z^3 + 3*z - 16, z, 1)
root(z^3 + 3*z - 16, z, 2)
root(z^3 + 3*z - 16, z, 3)
>> Rexplicit = solve(p,x,"MaxDegree",3)
Rexplicit =
                                                                       (65^(1/2) + 8)^(1/3) - 1/(65^(1/2) + 8)^(1/3)
1/(2*(65^(1/2) + 8)^(1/3)) - (65^(1/2) + 8)^(1/3)/2 - (3^(1/2)*(1/(65^(1/2) + 8)^(1/3) + (65^(1/2) + 8)^(1/3))*1i)/2
1/(2*(65^(1/2) + 8)^(1/3)) - (65^(1/2) + 8)^(1/3)/2 + (3^(1/2)*(1/(65^(1/2) + 8)^(1/3) + (65^(1/2) + 8)^(1/3))*1i)/2



  • solve函数可以求解不等式并返回满足不等式的解。解决以下不等式
    在这里插入图片描述
>> syms x y
eqn1 = x > 0;
eqn2 = y > 0;
eqn3 = x^2 + y^2 + x*y < 1;
eqns = [eqn1 eqn2 eqn3];

S = solve(eqns,[x y],'ReturnConditions',true);
>> S
S = 
  包含以下字段的 struct:

             x: (- 3*v^2 + u)^(1/2)/2 - v/2
             y: v
    parameters: [u    v]
    conditions: 4*v^2 < u & u < 4 & 0 < v

fsolve函数——对非线性方程组求解

x = fsolve(fun,x0)x0 开始,尝试求解方程 fun(x) = 0(全零数组)。

需要一个函数文件 root2d.m

在这里插入图片描述

(6)符号积分变换

(学完信号与系统后补充)

①Laplace变换
②Z变换
③Fourier变换
  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值