上一篇主要对符号对象进行了一些生成和使用的基本操作,然后本篇将介绍符号矩阵、微积分、积分变换以及符号方程的求解,具体内容就往下慢慢看了。
符号矩阵的生成和数值矩阵的相关操作类似,创建方法有以下的几种:
1、直接创建符号矩阵
2、用类似创建数值矩阵的方法创建符号矩阵
3、直接将数值矩阵转换成符号矩阵
根据以上的三种创建方法直接进行举例:
%方法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:
%简单的运算 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:
%解符号线性方程组 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,格式如下:
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的左右极限对以下几个表达式进行编程举例:
程序:
%创建表达式 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,需要注意的主要就是微分次数以及微分变量了,使用格式如下:
diff(S)%求符号表达式对默认自变量的微分 diff(S,'x')%求符号表达式对自变量x的微分 diff(S,n)%求符号表达式对默认自变量的n次微分 diff(S,'x',n)%求符号表达式对自变量x的n次微分举例:
%创建表达式 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,积分又分为不定积分和定积分,所以计算时要注意两者的区别,使用格式如下:
int(S)%求符号表达式S对默认自变量的不定积分 int(S,'x')%求符号表达式S对自变量x的不定积分 int(S,a,b)%求符号表达式S对默认自变量从a到b的定积分 int(S,'x',a,b)%求符号表达式S对自变量x从a到b的定积分对以下几个表达式进行编程计算:
%创建表达式 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和ifourier,使用格式如下:
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的自变量举例:
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相当于Fourier的变换的另一种形式,即e(-jwt)变成了e(-st),所以函数的使用也一样,就不进行使用举例了,函数的使用格式如下:
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变换相当于Fourier的离散表达,函数使用格式如下:
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)举例:
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函数,直接上格式:
g=solve(eq)%求解代数方程eq=0,默认自变量 g=solve(eq,var)%求解代数方程eq=0,自变量指定为var g=solve(eq1,eq2,...,eqn,var1,var2,...,varn)%求解由多个符号表达式组成的代数方程组,自变量分别为var1,var2,...,varn举例1:
%求一元二次方程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:
%求解多个方程组成的线性方程组 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之后的字符为因变量。
方程求解的函数使用格式如下:
r=dsolve('eq1,eq2,...,','cond1,cond2,...','v')"eq1,eq2,…"为微分方程,"cond1,cond2,…"为常微分方程的初始条件,v为指定的自变量,若无指定,则默认为”t“。
举例1:
%求微分方程dy/dx=ay的通解以及y(0)=b时的特解 syms a y eq='Dy=a*y' y1=dsolve(eq)%通解 y2=dsolve(eq,'y(0)=b','x')%特解结果1:
eq = 'Dy=a*y' y1 = C1*exp(a*t) y2 = b*exp(a*x)举例2:
%求微分方程组x'=y+x和y'=2x的通解 [x,y]=dsolve('Dx=y+x,Dy=2*x')结果2:
举例3:
%求微分方程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。
举例:
求下面两个级数的和函数:
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函数进行化简后结果为:
本篇到此结束了,关于符号运算的篇章也到此结束,接下来的篇章可能是用之前学到的一些函数对方程组之类的进行求解的应用,也可能是数据分析的一些方法,待我再理理先~