前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Matlab系列之符号运算(下)

Matlab系列之符号运算(下)

作者头像
狂人V
发布2020-10-10 15:29:27
1.3K0
发布2020-10-10 15:29:27
举报
文章被收录于专栏:电子狂人电子狂人

上一篇主要对符号对象进行了一些生成和使用的基本操作,然后本篇将介绍符号矩阵、微积分、积分变换以及符号方程的求解,具体内容就往下慢慢看了。

~Show Time~

符号矩阵

符号矩阵的生成

符号矩阵的生成和数值矩阵的相关操作类似,创建方法有以下的几种:

1、直接创建符号矩阵

2、用类似创建数值矩阵的方法创建符号矩阵

3、直接将数值矩阵转换成符号矩阵

根据以上的三种创建方法直接进行举例:

代码语言:javascript
复制
%方法1:元素长度可以是任何符号对象,元素长度也可不同
A1=str2sym('[a b; c d]')
A2=str2sym('[x+2*x,5*z+3*z,y-1,z/z]')

%方法2:先预定义所需的符号变量,再按数值矩阵的创建方法创建符号矩阵
clear%清除旧变量
syms x y z
B1=[x+2*x,5*z+3*z,y-1,z/z]

%方法3:使用sym将数值矩阵转换成符号矩阵
clear%清除旧变量
C1=[0 0.125 0.25 ;0.333 0.5 0.6;1 2 3]%数值矩阵
C2=sym(C1)%符号矩阵

结果:

从以上的输出结果也可以很明显的看出符号矩阵和数值矩阵的区别,符号矩阵的每一行都会用"[ ]"来标记。

符号矩阵的运算

运算和数值矩阵的类似,具体的介绍就参考之前的发的篇章了,直接进行部分运算举例,遇不懂的也继续参考之前发的篇章;

Matlab系列之矩阵秀

数组的运算+矩阵的运算

举例1:

代码语言:javascript
复制
%简单的运算
syms a b c d e f g h
A=[a b; c d];
B=[e f; g h];
C1=A.*B
C2=A.^B
C3=A*A-A^2
c3=A+B

结果1:

举例2:

代码语言:javascript
复制
%解符号线性方程组
syms a11 a12 a21 a22 b1 b2;
A=[a11 a12; a21 a22];
B=[b1 b2];
X=B/A;%相当于解线性方程组X*A=B的X
x1=X(1)
x2=X(2)

结果2:

符号微积分

微积分作为高等数学的基础,显然MATLAB的数学工具箱里肯定是有相关的计算功能,以下讲到的函数同样适用于数值计算。

极限

在进行微积分前,先对极限的函数进行使用学习,函数是:limit,格式如下:

代码语言:javascript
复制
limit(F,x,a)%计算符号表达式F在x趋于a时的极限
limit(F,a)%计算符号表达式F在默认自变量趋于a时的极限
limit(F)%计算符号表达式F在默认自变量趋于0时的极限
limit(F,x,a,'left')和limit(F,x,a,'right')%这两个就分别是x趋于a的左右极限

对以下几个表达式进行编程举例:

程序:

代码语言:javascript
复制
%创建表达式
syms x a
F1=sin(x)/x;
F2=1/x;
F3=(1+a/x)^x;
F4=exp(-x);
%计算极限值
s1=limit(F1)
s2=limit(F2,x,0,'right')
s3=limit(F2,x,0,'left')
s4=limit(F3,x,inf)
s5=limit(F4,x,inf)

结果:

微分

微分用的函数diff,需要注意的主要就是微分次数以及微分变量了,使用格式如下:

代码语言:javascript
复制
diff(S)%求符号表达式对默认自变量的微分
diff(S,'x')%求符号表达式对自变量x的微分
diff(S,n)%求符号表达式对默认自变量的n次微分
diff(S,'x',n)%求符号表达式对自变量x的n次微分

举例:

代码语言:javascript
复制
%创建表达式
S1=str2sym('2*x^3-a*x^2+b*x-3');
S2=str2sym('x*sin(a*x)');
%微分运算
D1=diff(S1)
D2=diff(S1,2)
D3=diff(S1,'a',2)
D4=diff(S2,'a')

结果:

积分

积分函数就是int,积分又分为不定积分和定积分,所以计算时要注意两者的区别,使用格式如下:

代码语言:javascript
复制
int(S)%求符号表达式S对默认自变量的不定积分
int(S,'x')%求符号表达式S对自变量x的不定积分
int(S,a,b)%求符号表达式S对默认自变量从a到b的定积分
int(S,'x',a,b)%求符号表达式S对自变量x从a到b的定积分

对以下几个表达式进行编程计算:

代码语言:javascript
复制
%创建表达式
syms x z a
S1=(-2*x)/((1+x^2)^2);
S2=x/(1+z)^2;
S3=x*log(1+x);
%积分计算
I1=int(S1)
I2=int(S2)
I3=int(S2,'z')
I4=int(S3,0,a)

结果:

符号积分变换

介绍几种比较常见的积分变换的函数使用,Fourier变换、Laplace和z变换,关于他们的定义我就不说了,有需要的可自行再深入了解,只对这三种变换的函数进行使用介绍。

Fourier变换及其逆变换

变换的函数分别为,fourier和ifourier,使用格式如下:

代码语言:javascript
复制
F=fourier(f)%相当于f(x)->F(w),若f=f(w),则F=F(t)
F=fourier(f,v)%指定Fourier变换结果F的变量为v
F=fourier(f,u,v)%指定u为f的自变量,v为F的自变量
%逆变换
f=ifourier(F)%F=F(w)->f=f(x),若F=F(x)则f=f(t)
f=ifourier(F,v)%指定f的变量为u
f=ifourier(F,u,v)%指定u为F的自变量,v为f的自变量

举例:

代码语言:javascript
复制
syms x w u v
f1=sin(x)*exp(-x^2);
f2=exp(-abs(w));
f3=x*exp(-abs(x));
F1=fourier(f1)
F2=fourier(f2,v)
F3=fourier(f3,u,v)

%逆变换
clear
syms w x
F1=sin(w);
F2=exp(-abs(x));
if1=ifourier(F1)
if2=ifourier(F2,x)

结果:

Laplace变换及其逆变换

Laplace相当于Fourier的变换的另一种形式,即e^(-jwt)变成了e^(-st),所以函数的使用也一样,就不进行使用举例了,函数的使用格式如下:

代码语言:javascript
复制
L=laplace(f)%f(t)->L(s),或f(s)->L(t)
L=laplace(f,t)%指定L的变量为t
L=laplace(f,w,z)%指定w为f的变量,z为L的变量
%逆变换
f=ilaplace(L)%L(s)->f(t)或L(t)->f(x)
f=ilaplace(L,y)%y为函数f的变量
f=ilaplace(L,x,y)%x为L的变量,y为f的变量

z变换及其逆变换

z变换相当于Fourier的离散表达,函数使用格式如下:

代码语言:javascript
复制
F=ztrans(f)%f(n)->F(z)或f(z)->F(w)
F=ztrans(f,w)%指定结果形式为F(w)
F=ztrans(f,k,w)%指定f为f(k),F为F(w)
%逆变换
f=iztrans(F)%F(z)->f(n)或F(n)->f(k)
f=iztrans(F,k)%指定结果形式为f(k)
f=iztrans(F,w,k)%指定表现形式为F(w),f(k)

举例:

代码语言:javascript
复制
syms a k w x n z
f1=n^4;
f2=n^z;
f3=sin(a*n);
f4=exp(k*n^2)*cos(k*n);
F1=ztrans(f1)
F2=ztrans(f2)
F3=ztrans(f3,w)
F4=ztrans(f4,k,x)

%逆变换
Z1=2*z/(z-2)^2;
Z2=n/(n+1);
Z3=z/(z-a);
iz1=iztrans(Z1)
iz2=iztrans(Z2)
iz3=iztrans(Z3,k)

结果:

符号方程求解

代数方程求解

上一篇中的举例其实已经接触到了该函数,即solve函数,直接上格式:

代码语言:javascript
复制
g=solve(eq)%求解代数方程eq=0,默认自变量
g=solve(eq,var)%求解代数方程eq=0,自变量指定为var
g=solve(eq1,eq2,...,eqn,var1,var2,...,varn)%求解由多个符号表达式组成的代数方程组,自变量分别为var1,var2,...,varn

举例1:

代码语言:javascript
复制
%求一元二次方程ax^2+bx+c=0的解
syms a b c x
f=a*x^2+b*x+c;
g1=solve(f)%默认自变量
g2=solve(f,a)%指定自变量为a

结果1:

举例2:

代码语言:javascript
复制
%求解多个方程组成的线性方程组
syms x y z
f=x^2-y^2+z-10;
g=x+y+5*z;
h=2*x-4*y+z;
[x,y,z]=solve(f,g,h)%以常规变量形式输出
s=solve(f,g,h)%结果存在结构体变量s中

结果2:

微分方程求解

微分方程的求解之前首先要了解微分方程在MATLAB中该怎么表示,微分方程中用D表示一次微分,D2和D3分别表示二次以及三次微分,D之后的字符为因变量。

方程求解的函数使用格式如下:

代码语言:javascript
复制
r=dsolve('eq1,eq2,...,','cond1,cond2,...','v')

"eq1,eq2,..."为微分方程,"cond1,cond2,..."为常微分方程的初始条件,v为指定的自变量,若无指定,则默认为”t“。

举例1:

代码语言:javascript
复制
%求微分方程dy/dx=ay的通解以及y(0)=b时的特解
syms a y
eq='Dy=a*y'
y1=dsolve(eq)%通解
y2=dsolve(eq,'y(0)=b','x')%特解

结果1:

代码语言:javascript
复制
eq =
    'Dy=a*y'
y1 =

    C1*exp(a*t)
y2 = 
    b*exp(a*x)

举例2:

代码语言:javascript
复制
%求微分方程组x'=y+x和y'=2x的通解
[x,y]=dsolve('Dx=y+x,Dy=2*x')

结果2:

举例3:

代码语言:javascript
复制
%求微分方程y''=x+y',且y(0)=1,y'(0)=0时的特解
y=dsolve('D2=x+Dy','y(0)=1','Dy(0)=0','x')

结果3:

无穷级数的求和运算

普通的数值求和运算直接sum就行了,但是无穷级数求和,sum就没得法了,需要使用符号表达式求和函数:symsum,格式为:symsum(a,x,m,n)

注:a为级数的通项,是符号表达式;x是求和变量;m和n分别为求和的开始项和结束项,显然就是无穷了,即inf。

举例:

求下面两个级数的和函数:

代码语言:javascript
复制
syms n x
a1=(n^3)*(x^(n-1));
a2=(n^3)/(5^n);
s1=symsum(a1,n,1,inf)
s2=symsum(a2,n,1,inf)

结果:

注:piecewise(abs(x) < 1, (x^3 + 4x^2 + x)/(x(x - 1)^4))的意思是当abs(x)<1这个条件成立,则结果 (x^3 + 4x^2 + x)/(x(x - 1)^4)有效。

很显然s1的结果不是最简的,使用simplify函数进行化简后结果为:

本篇到此结束了,关于符号运算的篇章也到此结束,接下来的篇章可能是用之前学到的一些函数对方程组之类的进行求解的应用,也可能是数据分析的一些方法,待我再理理先

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 电子狂人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档