005 MATLAB符号微积分

前言:

在MATLAB中,数值与符号的主要区别在于它们的处理方式和应用场景

  • 数值计算适用于实际的数值计算问题,如矩阵运算、数据分析等。
  • 符号计算适用于符号推导、公式化简和符号解析,如理论物理和工程计算。

01 符号对象

1.基本符号对象:

++定义++基本符号,格式:
Matlab 复制代码
sym('x')          %定义符号变量x
Matlab 复制代码
syms x y z

前者每次只能定义一个符号对象,且用单引号' '引上;

后者可以同时定义多个符号对象,各对象间用空格分隔。

对于符号常量,定义时还可指定符号量的具体表示格式,如d十进制、f浮点数、r有理数等等,默认时为有理数格式。如:

Matlab 复制代码
sym('y','real')              %定义实型符号变量y

syms b c unreal              %定义非实符号变量b和c

2.符号表达式:

  • 符号表达式可sym或syms构建
Matlab 复制代码
 创建符号表达式:
f1=sym('x^2-x*sin(x)+exp(x)')
f1 =
  x^2-x*sin(x)+exp(x)

不同的是,sym像定义基本符号对象一样来定义符号表达式,

而syms是先定义表达式中涉及的基本符号对象,再输入表达式。

  • 符号方程式是含有等号的符号表达式,只能由sym指令来构建。
Matlab 复制代码
>> sym('x^2-2*x*y=0')
ans =
  x^2-2*x*y=0
  • 查找表达式中的符号变量

用函数findsym来寻找符号变量,其调用格式为:

Matlab 复制代码
查找表达式中的变量:
>> syms a b c x
>> f=a*x^2+b*x+c;
>> findsym(f)
ans =
  a, b, c, x
另外还有:
>> findsym(f,2)    %返回表达式f中靠近x的2个变量,包括x本身。
ans =
  x,c
>> findsym(f,4)
ans =
  x,c,b,a

注意:在使用函数findsym时,认为大写字母离x的距离总大于所有小写字母离x的距离

符号表达式的四则运算:

数值表达式一样,可以进行加减、乘除运算,得到的结果仍然是符号型的

Matlab 复制代码
>>syms x y
>> f1=x^2+x*y+1;
>> f2=y^2+x*y+1;
>> f3=f1+f2,f4=f1-f2,f5=f1*f2,f6=f1/f2,f7=f1\f2

符号表达式的因式分解:

利用函数factor(s)实现:符号表达式s可以是正整数、数值数组或符号表达式数组

例如

将函数f (x )=2x 4-5x 3+4x 2-5x+2进行因式分解:

Matlab 复制代码
>> f=sym('2*x^4-5*x^3+4*x^2-5*x+2');
>> F1=factor(f)
F1 =
(x-2)*(2*x-1)*(x^2+1)

合并同类项:

利用函数collect,其调用格式为:

collect(s):按默认变量x对符号表达式s合并同类项;

Matlab 复制代码
f=-2*x^2*cos(x)-x^2);
>>f1=collect(f)
f1 =
  (-2*cos(x)-1)*x^2

collect(s,v):按变量v对符号表达式s合并同类项

Matlab 复制代码
f=x^3-2*x^2*cos(x)-x^2+y*cos(x)-2*y;
>> f2=collect(f,cos(x))
f2 =
  (-2*x^2+y)*cos(x)+x^3-x^2-2*y

多项式展开:

利用函数expand(s)来展开符号表达式s

Matlab 复制代码
f3=expand(exp((x+y)^2))
f3 =
  exp(x^2)*exp(x*y)^2*exp(y^2)

符号表达式的化简:

simplify函数:利用Maple化简规则得到符号表达式的最简结果。

simple函数:尝试用不同的化简方法对表达式进行化简,返回最简形式。

有3种调用格式:

simple(s):显示通过各种化简方法得到的化简结果,并返回其中最简的一个。 r=simple(s):不显示中间的化简结果,仅返回最简的一个结果。

r how\]=simple(s):返回最简的结果和化简方法。 ##### 例如: 利用simplify函数化简符号表达式: ```Matlab syms x y >> s=sin(x)^4-cos(x)^4; >> f1=simplify(s) f1 = 1-2*cos(x)^2 ``` 利用simple函数化简符号表达式: ```Matlab >> f=simple(s) %直接返回其中最简的结果 f = -1+cos(x)^2 ``` #### 符号表达式的通分: 利用函数numden 可将符号表达式化简为有理式,提取出其分子和分母 **\[n,d\]=numden(s)**:返回符号表达式s的分子n和分母d。其中s还可以是符号矩阵 ```Matlab >> [n1,d1]=numden(sym(4/5)) n1 = 4 d1 = 5 ``` ### 3.符号方程的求解 利用solve函数,用于求解代数方程(组),调用格式: g = solve(eq):求自变量为默认自变量的代数方程eq=0。 g = solve(eq,v):求自变量为指定变量v的代数方程eq=0。 g = solve(eq1,eq2,...,eqn):求n个代数方程eq1=0、eq2=0、...、eqn=0组成的方程组,自变量为这n个代数方程的默认自变量。 g = solve(eq1,eq2,...,eqn,v1,v2,...,vn):求n个代数方程eq1=0、eq2=0、...、eqn=0组成的方程组,自变量为n个指定变量v1、...、vn。 > 注意,当方程(组)不存在符号解时,又没有其它自由参数,则solve将给出数值解。 ##### 例如:(1)求解一元二次方程 ![](https://i-blog.csdnimg.cn/direct/a6b00bebf3aa44289396fb5573775442.png) f=sym('a*x^2+b*x+c'); >> solve(f) %以x为自变量求解方程f=0 ans = 1/2/a*(-b+(b^2-4*a*c)^(1/2)) 1/2/a*(-b-(b^2-4*a*c)^(1/2)) >> solve(f,'b') %以b为自变量求解方程f=0 ans = -(a*x^2+c)/x ##### (2)求解方程组 ![](https://i-blog.csdnimg.cn/direct/f7826f7c7e864aa38b8721de40ba75eb.png) >> syms x y z >> f1=x^2-y^2+z; >> f2=x+y-z; >> f3=3*x-y-z-2; >> [x,y,z]=solve(f1,f2,f3) %以数值数组形式输出求解结果 x = 1/2 y = -1/2 z = 0 ### 4.符号矩阵 #### 创建符号矩阵方法: ##### (1)函数法:用sym函数直接创建符号矩阵。 ```Matlab A=sym('[1,a,b;a+b,1/2,a*b]') A = [ 1, a, b] [ a+b, 1/2, a*b] ``` ##### 2)直接法:用创建普通数值矩阵的方法创建符号矩阵,但首先要定义所需要的符号变量。 ```Matlab 利用直接法创建符号矩阵 >> syms a b >> A=[1,a,b;a+b,1/2,a*b] A = [ 1, a, b] [ a+b, 1/2, a*b] ``` ##### 3)转换法:利用函数sym来实现由数值矩阵转换为符号矩阵 ```Matlab 转换法创建符号矩阵 >> A=[1.1 2.2;3.3 4.4] A = 1.1000 2.2000 3.3000 4.4000 >> sym(A) ans = [ 11/10, 11/5] [ 33/10, 22/5] ``` ## 02 符号极限 利用limit函数,求解符号函数的极限,调用格式: limit(F,x,a):计算当时符号表达式F,当自变量x趋近于a时的极限。 limit(F,a):计算当默认自变量趋近于a时符号表达式F的极限。 limit(F):计算当默认自变量趋近于0时符号表达式F的极限。 limit(F,x,a,'left')或limit(F,x,a,'right'):计算当x趋向于a时,符号表达式F的左极限(a-)或右极限(a+)。 >> syms x y >> limit(sin(x)/x) ans = 1 ## 03 符号微分 利用diff函数,调用格式: diff(s):求符号表达式s对于默认自变量的微分。 diff(s,'v'):求符号表达式s对于自变量v的微分。 diff(s,n):求符号表达式s对于默认自变量的n次微分。 diff(s,'v',n):求符号表达式s对于自变量v的n次微分。 >> s1=sym('2*x^2+y^2-4*x*y'); >> diff(s1) ans = 4*x-4*y >> diff(s1,2) ans = 4 ### 求解微分方程 利用函数dsolve用于求解微分方程(组),调用格式: r=dsolve('eq1,eq2,...','cond1,cond2,...','v')或 r = dsolve('eq1', 'q2',...,'cond1','cond2',...,'v') 求微分方程eq1、eq2、...的解。 其中cond1、cond2、...为给定的常微分方程的边界条件或初始条件, v为指定的自变量,默认变量为t。 > 注意,在微分方程eq中,用D表示对自变量(设为x)的微分,如D=d/dx,D2= d2/dx2,D后的字符为因变量。 #### 例如: ![](https://i-blog.csdnimg.cn/direct/9d77eeae4834444eb13cfc91d346b3da.png) >> dsolve('Dy=a*x') %未指定变量,默认变量为t ans = a*x*t+C1 >> dsolve('Dy=a*x','x') %指定变量为x ans = 1/2*a*x^2+C1 ![](https://i-blog.csdnimg.cn/direct/4df3eed4f6474983922e36cbdbfdecfb.png) >> dsolve('D2y=cos(2*x)-y','Dy(0)=0','y(0)=1','x') ans = 4/3*cos(x)-1/3*cos(2*x) ## ![](https://i-blog.csdnimg.cn/direct/f206438fe3bb48bda926460943f63df2.png) >> [x,y]=dsolve('Dx=x-y','Dy=x+y','x(0)=2','y(0)=1') x = -exp(t)*(-2*cos(t)+sin(t)) y = exp(t)*(2*sin(t)+cos(t)) ## 04 符号积分 利用函数int,调用格式: int(s):求符号表达式s对默认自变量的不定积分。 int (s,'v'):求符号表达式s对自变量v的不定积分。 int (s,a,b):求符号表达式s对默认自变量从a到b的定积分。 int(s,'v',a,b):求符号表达式s对自变量v从a到b的定积分。 >> syms x a >> int(1/(1+x^2)) ans = atan(x) ## 05 复合函数求解 利用compose函数,求解复合函数,调用格式: compose(f,g):求f=f(x),g=g(y)的复合函数f\[g(y)\]。 compose(f,g,z):求f=f(x),g=g(y),y=z的复合函数f\[g(z)\]。 compose(f,g,x,z):求f=f(x),x=g(z)的复合函数f\[g(z)\]。 compose(f,g,x,y,z):求f=f(x),x=g(y),y=z的复合函数f\[g(z)

复制代码
>> syms x y z t u              %定义符号变量
>> f=1/(1+x^2);g=cos(y);h=x^t;p=exp(y/u);    %定义符号表达式f,g,h,p
>> compose(f,g)                                   %求f,g的复合函数
ans =
1/(1+cos(y)^2)

06 求解反函数

利用finverse函数,调用格式:

g = finverse(f):返回符号函数f的反函数,且反函数的自变量与原函数的相同。

g = finverse(f,v):返回包含多余1个变量的符号函数f的反函数,反函数的自变量为v。

Matlab 复制代码
求解反函数
>> syms x y
>> finverse(exp(2*x))          %求反函数,自变量为x
ans =
1/2*log(x)
>> finverse(x+2*y-1,y)         %求反函数,自变量为y
ans =
-1/2*x+1/2+1/2*y
相关推荐
霍珵蕴42 分钟前
Haskell语言的区块链安全
开发语言·后端·golang
vortex51 小时前
Bash中因数值比较引发的提权漏洞:数组注入与任意命令执行
linux·开发语言·安全·网络安全·渗透测试·bash
霍珵蕴1 小时前
R语言的嵌入式图形界面
开发语言·后端·golang
夏天的阳光吖1 小时前
C++蓝桥杯实训篇(二)
开发语言·c++·蓝桥杯
Trustport1 小时前
C# EventLog获取Windows日志进行查询设置多个EventLogQuery查询条件
开发语言·c#
前往深圳1 小时前
数据结构:LinkedList与链表
java·开发语言·学习
机器学习之心1 小时前
Transformer+BO-SVM多变量时间序列预测(Matlab)
支持向量机·matlab·transformer·贝叶斯优化·多变量时间序列预测
敲键盘的小夜猫2 小时前
Java服务端性能优化:从理论到实践的全面指南
java·开发语言·性能优化
勘察加熊人2 小时前
c#的form实现飞机大战
开发语言·c#
Tadecanlan2 小时前
[C++面试] explicit面试8问 —— 较难,可简单了解即可
开发语言·c++