第五篇--MATLAB符号运算

1.符号对象与符号表达式

1.1 建立符号对象

  • 符号对象可以是符号常量、符号变量,符号表达式等等,它是一种数据结构。
  • sym 函数用来建立单个符号变量,调用格式为:
  • 符号变量 = sym(A) ,参数A是一个数或者数值矩阵,也可以是字符串。
a=sym('a') %a是符号变量
b=sym(1/3) %b是符号常量
c=sym('[1 ab;a d]') %C是符号矩阵
  • syms 命令用来建立多个符号变量,一般调用格式为:
  • syms 符号变量1 符号变量2 … 符号变量n
syms a b c

1.2 建立符号表达式

  • 用sym 函数直接建立符号表达式。
 y=sym('sin(x)+cos(x)') 
  • 使用已经定义的符号变量组成符号表达式。
 x=sym('x'); 
 y=sin(x)+cos(x) 

或者:

syms x; 
y=sin(x)+cos(x) 

2.符号对象基本运算

2.1 基本运算符

  • 普通运算:+ - * \ / ^
  • 数组运算:.* .\ ./ .^
  • 矩阵转置:’ .’
  • 示例:
X=sym('[x11,x12;x21,x22;x31,x32]');
Y=sym('[y11,y12,y13;y21,y22,y23]');
Z1=X*Y; Z2=X'.*Y; 
Z1=
[ x11*y11 + x12*y21, x11*y12 + x12*y22, x11*y13 + x12*y23]
[ x21*y11 + x22*y21, x21*y12 + x22*y22, x21*y13 + x22*y23]
[ x31*y11 + x32*y21, x31*y12 + x32*y22, x31*y13 + x32*y23]
Z2=
[ y11*conj(x11), y12*conj(x21), y13*conj(x31)]
[ y21*conj(x12), y22*conj(x22), y23*conj(x32)]

2.2 基本函数

  • 三角函数:sin、cos、tan、cot、sec、csc、…
  • 反三角函数:asin、acos、atan、acot、asec、acsc、…
  • 指数函数:exp、log、log2、log10、sqrt
  • 其他函数:abs、conj、real、imag
  • rank、det、inv、eig、lu、qr、svd …

2.3 查找符号变量

  • findsym(expr): 按字母顺序列出符号表达式 expr 中的所有符号变量
  • findsym(expr, N) :按顺序列出 expr 中离 x 最近的 N 个符号变量 。
f=sym('2*w-3*y+z^2+5*a') 
findsym(f)
ans =
a,w,y,z 

2.4 符号表达式替换

  • 用给定的数据替换符号表达式中的指定的符号变量
  • subs(f,x,a) :用 a 替换字符函数 f 中的字符变量 x ;a 是可以是 数/数值变量/表达式 或 字符变量/表达式 。
f=z^2 + 5*a + 2*w - 3*y 
f=subs(f,'z','z+2')
f=
(z+2)^2 + 5*a + 2*w - 3*y

2.5 符号矩阵

  • 使用 sym 函数直接生成
A=sym('[1+x, sin(x); 5, exp(x)]') 
  • 将数值矩阵转化成符号矩阵
 B=[2/3, sqrt(2); 5.2, log(3)]; 
 C=sym(B) 
  • 符号矩阵中元素的引用和修改
 A=sym('[1+x, sin(x); 5, exp(x)]'); 
 A(1,2) % 引用 
 A(2,2)=sym('cos(x)') % 重新赋值 

3.常见符号运算

3.1 因式分解

  • factor(f):
syms x;
f=x^6+1;
factor(f)
ans =
 
[ x^2 + 1, x^4 - x^2 + 1]
  • factor可以用于正整数的分解

3.2 函数展开

  • 函数展开:expand(f)
  • 多项式展开
syms x; 
f=(x+1)^6;
expand(f) 
ans =
 
x^6 + 6*x^5 + 15*x^4 + 20*x^3 + 15*x^2 + 6*x + 1
  • 三角函数展开
 syms x y; 
 f=sin(x+y);
 expand(f)
 ans =
 
cos(x)*sin(y) + cos(y)*sin(x) 

3.3 合并同类项

  • collect(f,v): 按指定变量 v 进行合并
  • collect(f): 按默认变量进行合并
 syms x y;  
 f= x^2*y + y*x - x^2 + 2*x ; 
 collect(f) 
 ans =
 
(y - 1)*x^2 + (y + 2)*x
 collect(f,y) 
 ans =
 
(x^2 + x)*y - x^2 + 2*x

3.4 函数简化

  • y=simple(f): 对 f 尝试多种不同的算法进行 简化,返回其中最简短的形式
  • [How,y]=simple(f): y 为 f 的最简短形式 ,How 中记录的为简化过程中使用的方法。
syms x; 
f=sin(x)^2 + cos(x)^2 ; 
simplify(f)
ans =
 
1 

3.5 分式通分

  • [N,D]=numden(f): N 为通分后的分子,D 为通分后的分母
syms x y;  
f=x/y+y/x; 
[N,D]=numden(f) 
N =
 
x^2 + y^2
 
D =
 
x*y

3.6 多项式

  • horner 多项式:嵌套形式的多项式
 syms x;  
 f=x^4+2*x^3+4*x^2+x+1; 
 g=horner(f) 
 g =
 
x*(x*(x*(x + 2) + 4) + 1) + 1

3.7 计算极限

  • limit(f,x,a): 计算 lim x a f ( x ) \lim_{x\to a}f(x)
  • limit(f,a): 当默认变量趋向于 a 时的极限
  • limit(f): 计算 a=0 时的极限
  • limit(f,x,a,‘right’): 计算右极限
  • limit(f,x,a,‘left’): 计算左极限
  • 示例:计算 L = lim h 0 l n ( x + h ) l n ( x ) h L=\lim_{h\to 0}\frac{ln(x+h)-ln(x)}{h} , M = lim n ( 1 x n ) M=\lim_{n\to\infty }(1-\frac{x}{n}) n
syms x h n;  
L=limit((log(x+h)-log(x))/h,h,0)
L =
 
1/x 
M=limit((1-x/n)^n,n,inf)
M =
 
exp(-x)

3.8计算导数

  • g=diff(f,v):求符号表达式 f 关于 v 的导数
  • g=diff(f):求符号表达式 f 关于默认变量的导数
  • g=diff(f,v,n):求 f 关于 v 的 n 阶导数
 syms x; 
 f=sin(x)+3*x^2;  
 g=diff(f,x)
 g =
 
6*x + cos(x) 

3.9计算积分

  • int(f,v,a,b): 计算定积分 a b f ( v ) d v \int_a^b{f(v)dv}
  • int(f,a,b): 计算关于默认变量的定积分
  • int(f,v): 计算不定积分 f ( v ) d v \int{f(v)dv}
  • int(f): 计算关于默认变量的不定积分
  • 示例:计算 I = x 2 + 1 x 2 2 x + 2 d x I=\int\frac{x^2+1}{x^2-2x+2}{dx} , K = 0 e x 2 d x K=\int_0^\infty{e^{-x^2}dx}
 syms x; 
 f=(x^2+1)/(x^2-2*x+2)^2; 
 I=int(f,x) 
 I =
(3*atan(x - 1))/2 + (x/2 - 3/2)/(x^2 - 2*x + 2)
 
 K=int(exp(-x^2),x,0,inf)
 K =
pi^(1/2)/2

3.10符号求和

  • symsum(f,v,a,b): 求和 v = a b f ( v ) \displaystyle\sum_{v=a}^{b} f(v)
  • symsum(f,a,b): 关于默认变量求和
  • 示例:计算级数 S = n = 1 1 n 2 S=\displaystyle\sum_{n=1}^{\infty}\frac{1}{n^2} 及其前100项的部分和 .
 syms n; 
 f=1/n^2; 
 S=symsum(f,n,1,inf) 
 S =
 
pi^2/6
 S100=symsum(f,n,1,100) 
 S100 =
 
1589508694133037873112297928517553859702383498543709859889432834803818131090369901/972186144434381030589657976672623144161975583995746241782720354705517986165248000

3.11 代数方程求解

  • solve(f,v):求方程关于指定自变量的解,f 可以是 用字符串表示的方程、符号表达式或符号方程;
  • solve 也可解方程组(包含非线性);
  • 得不到解析解时,给出数值解

3.12 微分方程求解

  • y=dsolve(‘eq1’,‘eq2’, … ,‘cond1’,‘cond2’, … ,‘v’)
  • 其中 y 为输出的解, eq1、eq2、. . . 为微分方程, cond1、cond2、…为初值条件, v 为自变量 。
  • 示例:求微分方程 d y a x + 2 x y = x e x 2 \frac{dy}{ax}+2xy=xe^{-x^2} 的通解,并验证。
y=dsolve('Dy+2*x*y=x*exp(-x^2)','x') 
syms x; 
diff(y)+2*x*y - x*exp(-x^2) 
y =C1*exp(-x^2) + (x^2*exp(-x^2))/2
ans =2*x*(C1*exp(-x^2) + (x^2*exp(-x^2))/2) - x^3*exp(-x^2) - 2*C1*x*exp(-x^2)
  • 微分方程中用 D 表示对 自变量 的导数,如: Dy y’; D2y y’’; D3y y’’’
  • 如果省略初值条件,则表示求通解;
  • 如果省略自变量,则默认自变量为 t
  • 若找不到解析解,则返回其积分形式。
  • 示例:求微分方程 x y + y e x = 0 xy'+y-e^x=0 满足初值条件y(1)=2e的特解,并画出解函数的图形。
y=dsolve('x*Dy+y-exp(x)=0','y(1)=2*exp(1)', 'x') 
y =
(exp(1) + exp(x))/x
ezplot(y); 

在这里插入图片描述

3.13 反函数

  • finverse(f,v):求 f 关于指定变量 v 的反函数
  • finverse(f):求 f 关于默认变量的反函数
  • 计算函数 f = x 2 + 2 t f=x^2+2t 的反函数
 syms x t; 
 f=x^2+2*t; 
 g1=finverse(f,x) 
 g2=finverse(f,t) 
g1 =(x - 2*t)^(1/2)
g2 =- x^2/2 + t/2

4.总结

对MATLAB符号运算的学习笔记就分享到这儿,下一篇就介绍MATLAB的程序设计,也是我们最核心的学习重点,作者知识浅陋,如有错误之处,不吝赐教。

发布了25 篇原创文章 · 获赞 4 · 访问量 762

猜你喜欢

转载自blog.csdn.net/qq_45416295/article/details/104197434
今日推荐