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)求解一元二次方程
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)求解方程组
>> 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后的字符为因变量。

例如:

>> dsolve('Dy=a*x')            %未指定变量,默认变量为t
ans =
a*x*t+C1
>> dsolve('Dy=a*x','x')        %指定变量为x
ans =
1/2*a*x^2+C1
>> dsolve('D2y=cos(2*x)-y','Dy(0)=0','y(0)=1','x')
ans =
4/3*cos(x)-1/3*cos(2*x)

>>  [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
相关推荐
waterme1onY26 分钟前
由于导包而引发的错误
java·开发语言·笔记·后端
Qhumaing29 分钟前
python学习——字典元素的访问和遍历
开发语言·python·学习
MatpyMaster36 分钟前
Python图像处理——Python转换h264格式视频
开发语言·python
微扬嘴角44 分钟前
Java的LinkedList、HashSet与TreeSet
java·开发语言·windows
AI原吾1 小时前
探索Python词云库WordCloud的奥秘
开发语言·python·信息可视化·wordcloud
速盾cdn1 小时前
速盾高防cdn支持移动端独立缓存
开发语言·安全·web安全
LG.YDX1 小时前
java:拆箱和装箱,缓存池概念简单介绍
java·开发语言
kirito学长-Java1 小时前
springboot/ssm大学校园生活信息平台Java校园活动论坛交流问卷系统web源码
java·开发语言·spring
编程修仙1 小时前
I/O流程图
java·开发语言·流程图