【基础知识笔记】009 符号计算
符号数学工具箱定义了MATLAB的一个新的数据类型:符号对象(symbolic object),其类型名标识为“sym”。
符号对象内部的储存内容是字符串,用来表示符号变量、符号表达式以及矩阵等。生成符号变量和符号表达式的函数是sym和syms。
1.sym 生成单个符号变量,符号数值,符号表达式
S=sym(x)%x可以是任何数据类型
ex code
sqrt(2)%对数值 2 进行开方运算
power(2,2)
x=sym(2); %生成符号对象x,x=2
sqrt(x)%对x进行符号运算
power(x,x)
如果表达式里面的元素都定义为符号对象,则表达式之间还可以按代数规则进行运算.
>> sym(12)/sym(7)+sym(56)*sym(93)
ans =
36468/7
2. 定义多个符号变量和表达式
>>syms a b c x;
>>f=a*x^2+b*x+c;
>>f
f =
a*x^2 + b*x + c
>>f-c
f =
a*x^2 + b*x + c
>>f=f*10
f= 10*a*x^2 + 10*b*x
3. 符号方程的定义
方程与函数的区别在于函数是由数字和变量组成的代数式,而方程则是包含了函数的等式
>>e1=sym('a*x^2+b*x+c=0')%用sym生成符号方程ax2+bx+c=0
e1 =
a*x^2 + b*x + c == 0
1.四则运算
>> syms a b x y
>> f1=sin(x)+cos(y)
f1 =
cos(y) + sin(x)
>> f2=a+b
f2 =
a + b
>> f3=f1*f2
f3 =
(a + b)*(cos(y) + sin(x))
2. 多项式的因式分解和展开
- factor(S):对符号多项式S分解因式。
- expand(S):对符号多项式S进行展开。
- collect(S):对符号多项式S按照默认变量x合并同类项。
- collect(S, v):对符号多项式S按变量v合并同类项。
- horner(f):将一般的符号多项式f转换成嵌套形式
>> syms x
>> who
您的变量为:
x
>> f=x^2-1
f =
x^2 - 1
>> factor(f)
ans =
[ x - 1, x + 1]
>> f=(6*x^3+7*x)*(4*x^4-8)
f =
(6*x^3 + 7*x)*(4*x^4 - 8)
>> expand(f)
ans =
24*x^7 + 28*x^5 - 48*x^3 - 56*x
>> f
f =
(6*x^3 + 7*x)*(4*x^4 - 8)
>> horner(f)
ans =
x*(x^2*(x^2*(24*x^2 + 28) - 48) - 56)
>> horner(expand(f))
ans =
x*(x^2*(x^2*(24*x^2 + 28) - 48) - 56)
- 展开表达式f=(x+1)5和f=sin(x+y)
>> clear
>> syms x y
>> f=(x+1)^5
f =
(x + 1)^5
>> expand(f)
ans =
x^5 + 5*x^4 + 10*x^3 + 10*x^2 + 5*x + 1
>> g=sin(x+y)
g =
sin(x + y)
>> expand(g)
ans =
cos(x)*sin(y) + cos(y)*sin(x)
>> horner(g)
ans =
sin(x + y)
>> horner(f)
ans =
x*(x*(x*(x*(x + 5) + 10) + 10) + 5) + 1
3. 符号表达式进行有理分式化
符号表达式是一个有理分式或可以展开为有理分式,则可利用numden函数来提取符号表达式S中的分子和分母。其一般调用格式为:
[n,d]=numden(f)%n为分子,d为分母
>> syms x y
>> g=x/y+y/x
g =
x/y + y/x
>> [n,d]=numden(g)
n =
x^2 + y^2
4.简化符号表达式
- simplify()
- simple()
4.1 simplify()
simplify函数利用Maple的化简规则对符号表达式进行化简。其中用到大量的代数恒等式以及大量的函数恒等式,包括求和、整数幂、开方、分数幂、三角函数、指数函数、对数函数、贝塞尔函数、超几何分布函数、伽马函数等,力求得到最简结果。
>> simplify(g)
ans =
(x^2 + y^2)/(x*y)
>> f=sym('exp(c*log(sqrt(a+b)))')
f =
exp(c*log((a + b)^(1/2)))
>> simplify(f)
ans =
(a + b)^(c/2)
4.2 simple()函数
simple(f)也是一种化简的函数,它尝试用多种不同的化简算法对符号表达式进行化简,以找到对应的最简形式,其格式如下:
[r,how]=simple(f)
返回的r为化简后的符号表达式,how为所采用的简化方法。
matlab2016a调用这个函数找不到
5. 用subs()函数替换求值
subs函数是用指定符号替换符号表达式中的某一特定符号,调用格式为:
R=subs(f,old,new)
可用新的符号变量new替换原来符号表达式S中的old。当new为数值形式时,还可得到符号表达式对应的数值解。old和new在特定情况下可省略。
>> syms a b
>> f=a+b
f =
a + b
>> subs(f,a,4)
ans =
b + 4
>> f
f =
a + b
>> subs(f,{a b},{1 1})%多充替换
ans =
2
>> f=sin(a)+cos(b+a)
f =
cos(a + b) + sin(a)
>> g=subs(f,{a b},{pi,pi})
g =
1
>> g
g =
1
>> f
f =
cos(a + b) + sin(a)
>> subs(f,a,'alpha')
ans =
cos(alpha + b) + sin(alpha)
%求解函数值
>> f=@(x) x^2+y-10
f =
@(x)x^2+y-10
>> f(10)
ans =
y + 90
>> subs(f(x),y,10)
ans =
x^2
>> subs(f(10),y,10)
ans =
100
6.求解出反函数
finverse函数用来求解符号函数对应的反函数,格式为:
g=finverse(f,var)
返回自变量为v的符号函数f的反函数
若v省略,得到的反函数自变量与原函数相同
>>syms x y
>> f=1/tan(x)
f =
1/tan(x)
>> g=finverse(f)
g =
atan(1/x)
>> syms x y
>> f=x^2-y+10
f =
x^2 - y + 10
>> finverse(f,x)
ans =
(x + y - 10)^(1/2)
>> finverse(f,y)
ans =
x^2 - y + 10
7.求复合函数
复合函数的求解用compose函数,compose函数的格式如下
-
compose(f, g),返回f=f(x)和g=g(y)的复合函数f(g(y)),以y为自变量。
-
compose(f, g, z),返回f=f(x)和g=g(y)的复合函数f(g(z)),以z为自变量。
-
compose(f, g, x, z),返回复合函数f(g(z)),并使x成为f函数的独立变量。z为自变量
- 例如,设f=cos(x/t),则compose(f, g, x, z)返回复合函数cos(g(z)/t),而compose(f, g, t, z)返回cos(x/g(z))。
-
compose(f, g, x, y, z),返回复合函数f(g(z)),并且使x与y分别成为f与g函数的独立变量。
- 假设f=cos(x/t),g=sin(y/u),compose(f, g,x, y, z)返回cos(sin(z/u)/t),而compose(f, g, x, u,z)返回cos(sin(y/z)/t)。
>> syms x y u t z
>> f=1/(1+x^2)
f =
1/(x^2 + 1)
>> g=sin(y)
g =
sin(y)
>> h=x^t
h =
x^t
>> p=exp(-y/u)
p =
exp(-y/u)
>> fg=compose(f,g)
fg =
1/(sin(y)^2 + 1)
>> subs(fg,y,0.5*pi)
ans =
1/2
>> compose(f,g,t)
ans =
1/(sin(t)^2 + 1)
>> compose(h,g,x,z)
ans =
sin(z)^t
>> compose(h,g,t,z)
ans =
x^sin(z)
>> hgt=@(x,z) compose(h,g,t,z)
hgt =
@(x,z)compose(h,g,t,z)
>> hgt(1,1)
ans =
x^sin(1)
>> compose(h,p,x,y,z)%
ans =
exp(-z/u)^t
>> hxpyz=@(z) compose(h,p,x,y,z)
hxpyz =
@(z)compose(h,p,x,y,z)
>> hxpyz(1)
ans =
exp(-1/u)^t
>> compose(h,p,t,u,z)
ans =
x^exp(-y/z)
0.符号函数
>>syms x
>> f(x)=2*x
f(x) = 2*x
>> f(1)
ans = 2
>> g=2*x %g只是符号变量,可以用subs(函数计算数值解)
g = 2*x
>> g(1)
ans = 2*x
1.符号极限
limit()函数计算符号函数的极限,其格式如下:
- limit(F, x, a),计算符号表达式F在x→a条件下的极限;
- limit(F, a),计算符号表达式F中由默认自变量趋向于a条件下的极限;
- limit(F),计算符号表达式F在默认自变量趋向于0条件下的极限<>;
- limit(F, x, a, 'right') 和limit(F, x, a, 'left'),计算符号表达式F在x→a条件下的右极限和左极限
>> syms x
>> f=sin(x)/x
f = sin(x)/x
>> limit(f,x,0)
ans = 1
>> g=1/x
g = 1/x
>> limit(g,x,0,'right')
ans = Inf
>> limit(g,x,0,'left')
ans = -Inf
>> syms a
>> h=(1+a/x)^x
h = (a/x + 1)^x
>> limit(h,x,inf)
ans = exp(a)
>> k=exp(-x)
k = exp(-x)
>> limit(k,x,inf)
ans = 0
2.求符号的微分
diff函数用来求符号微分,其格式如下:
- diff(S),求符号表达式S对于默认自变量的微分;
- diff(S, 'v'),求符号表达式S对于自变量v的微分;
- diff(S, n),求符号表达式S对于默认自变量的n次微分;
- diff(S, 'v', n),求符号表达式S对于自变量v的n次微分
>> syms x
>> f=6*x^3+4*x^2+x-10
f = 6*x^3 + 4*x^2 + x - 10
>> diff(f)
ans = 18*x^2 + 8*x + 1
>> diff(f,'x',2)%对f的x变量进行二次微分
ans = 36*x + 8
>> syms a
>> f1=sin(a)
f1 =sin(a)
>> diff(f1,'a',1)
ans = cos(a)
>> diff(f1,'a',2)
ans = -sin(a)
%多变量下指定变量微分
>> f=7*exp(a*x)+8*x^4
f = 7*exp(a*x) + 8*x^4
>> diff(f,'a',1)
ans = 7*x*exp(a*x)
%微分之后
>> f=(1-x^3)/(1+x^4)
f = -(x^3 - 1)/(x^4 + 1)
>> simplify(diff(f,'x',1))
ans = -(x^2*(- x^4 + 4*x + 3))/(x^4 + 1)^2
>> simplify(diff(f,'x',2))
ans = -(2*x*(x^8 - 10*x^5 - 12*x^4 + 6*x + 3))/(x^4 + 1)^3
3.求符号的积分
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的定积分
![ohsiz.png](https://e.im5i.com/2021/07/26/ohsiz.png)
>> f=(-2*x)/((1+x^2)^2)
f = -(2*x)/(x^2 + 1)^2
>> f(1) %不是函数,只是变量
ans = -(2*x)/(x^2 + 1)^2
>> int(f,'x')
%求不定积分
ans =1/(x^2 + 1)
>> clear x
>> syms x z
>> f(x,z)=x/(1+z)^2
f(x, z) = x/(z + 1)^2
>> f(1,z)
ans = 1/(z + 1)^2
>> f(1,1)
ans = 1/4
>> int(f,'x')
ans(x, z) = x^2/(2*(z + 1)^2)
>> int(f,'z')
ans(x, z) = -x/(z + 1)
>> f
f(x, z) = x/(z + 1)^2
>> g=x*log(1+x)
g = x*log(x + 1)
>> int(f,'x',0,1)
ans(z) = 1/(2*(z + 1)^2)
>> int(g,'x',0,1)
ans = 1/4
4.符号积分变换操作
常见的积分变换有傅里叶变换、拉普拉斯变换、z变换;
4.1 fourier变换及逆变换
傅里叶变换的定义:
>>syms x w
>>f=f(x) %要变换的函数
>>F=int(f(x)*exp(-j*w*x),'x',-inf,inf) %傅里叶变换的定义式
fourier变换函数格式:
F=fourier(f)
![okPvA.png](https://e.im5i.com/2021/07/26/okPvA.png)
函数f=f(x)为函数F(w)的逆Fourier变换,即F=F(w) → f=f(x)。
若F=F(x), ifourier(F)返回变量t的函数,即F=F(x) → f=f(t)。
f=ifourier(F, u),使函数f为变量u(u为标量符号对象)的函数
f=ifourier(F, v, u) 使F为变量v的函数,f为变量u的函数。
4.2 laplace 变换和逆变换
%F(t)是时域函数
L=laplace(F(t))
输出参量L=L(s)为有默认符号自变量t的标量符号对象F的Laplace变换,即F=F(t) → L=L(s)。若F =F(s),则fourier(F)返回变量为t的函数L,即F=F(s)→L=L(t)。
laplace(F, t),使函数L为变量t(t为标量符号自变量)的函数。
laplace(F, w, z),使函数L为变量z的函数,函数F为变量w的函数。
ilaplace函数用来求逆Laplace变换。其格式如下:
F=ilaplace(L(w))
输出参量F=F(t)为默认变量s的标量符号对象L的逆Laplace变换,即F=F(w) → f=f(x)。若L=L(t),则ifourier(L)返回变量为x的函数F,即F=F(x) → f=f(t)。
F=ilaplace(L, y),使函数F为变量y(y为标量符号对象)的函数。
F=ilaplace(L, y, x),使函数F为变量x的函数,函数L为变量y的函数
4.3 z变换
F=ztrans(f)
对默认自变量为n的函数f计算z变换。输出参量F为变量z的函数,即f=f(n) → F=F(z)。若函数f=f (z),则ztrans(f)返回一变量为w的函数,即f=f(z) → F=F(w)。
F=ztrans(f, w),用符号变量w代替默认的z作为函数F的自变量。
F=ztrans(f, k, w),对函数f中指定的符号变量k计算z变换。
f=iztrans(F)
输出参量f=f(n)为有默认变量z的单值符号函数F的逆z变换,即F=F(z) → f=f(n)。若F=F(n),则iztrans(F)返回变量为k的函数f(k),即F=F(n) → f=f(k)。
f=iztrans(F, k),使函数f为变量k(k为标量符号对象)的函数f(k)。
f=iztrans(F, w, k),使函数F为变量w的函数,函数f为变量k的函数。
5. 符号方程求解
5.1 代数方程求解
MATLAB的符号数学工具箱提供了solve函数对代数方程求解,其格式如下:
g=solve(eq),求解代数方程eq=0,自变量为默认自变量;
g=solve(eq, var),求解代数方程eq=0,自变量为var;
g=solve(eq1, eq2, …, eqn, var1, var2, …, varn)),求解符号表达式eq1, eq2, …, eqn组成的代数方程组,自变量分别为var1, var2,…, varn。方程组的解将存入结构变量g。
>> syms a b c x
>> f=a*x*x+b*x+c
f =
a*x^2 + b*x + c
>> solve(f)
ans =
-(b + (b^2 - 4*a*c)^(1/2))/(2*a)
-(b - (b^2 - 4*a*c)^(1/2))/(2*a)
>> solve(f,a)
ans =
-(c + b*x)/x^2
>> clear
>> syms x y z
>> who
您的变量为:
x y z
>> f=x^2-y*y+z-10
f =
x^2 - y^2 + z - 10
>> g=x+y-5*z
g =
x + y - 5*z
>> h=2*x-4y+z
h=2*x-4y+z
↑
错误: 不应为 MATLAB 表达式。
是不是想输入:
>> h=2*x-4*y+z
h =
2*x - 4*y + z
>> [x,y,z]=solve(lf,g,h)
未定义函数或变量 'lf'。
>> [x,y,z]=solve(f,g,h)
x =
- (19*2409^(1/2))/240 - 19/80
(19*2409^(1/2))/240 - 19/80
y =
- (11*2409^(1/2))/240 - 11/80
(11*2409^(1/2))/240 - 11/80
z =
- 2409^(1/2)/40 - 3/40
2409^(1/2)/40 - 3/40
>> s=solve(f,g,h)
s =
x: [2x1 sym]
y: [2x1 sym]
z: [2x1 sym]
>> s.x
ans =
- (19*2409^(1/2))/240 - 19/80
(19*2409^(1/2))/240 - 19/80
5.2 微分方程求解
dsolve函数用来求解微分方程,
r=dsolve('eq1,eq2,eq3,···','cond1,cond2,cond3,···','V')
求解由 ** “eq1, eq2, …”指定的微分方** 的符号解,
参数“cond1,cond2, …”为指定常微分方程的边界条件或初始条件
v为指定的自变量,若不指定,将采用“t”为默认自变量。
微分方程中用D表示一次微分,D2和D3分别表示二次及三次微分
D后的字符为因变量。
如果不指定边界条件,那么就返回通解
%example 1
>> dsolve('Dy=a*y')
ans =
C1*exp(a*t)
>> dsolve('Dy=a*y','y(0)=b','x')
ans =
b*exp(a*x)
%example 2
>> dsolve('D2y=-a^2*y')
ans =
C3*exp(a*t*1i) + C4*exp(-a*t*1i)
>> dsolve('D2y=-a^2*y','y(0)=1,Dy(pi/a)=0','x')
ans =
exp(-a*x*1i)/2 + exp(a*x*1i)/2
>> simplify(dsolve('D2y=-a^2*y','y(0)=1,Dy(pi/a)=0','x'))
ans =
cos(a*x)
%example 3
>> dsolve('D2y=x+Dy','y(0)=1','Dy(0)=0','x')
ans =
exp(x) - x - x^2/2
%example 4
>> [x,y]=dsolve('Dx=x+y,Dy=2*x')
x =
C10*exp(2*t) - (C9*exp(-t))/2
y =
C9*exp(-t) + C10*exp(2*t)
本文来自博客园,作者:FE-有限元鹰,转载请注明原文链接:https://www.cnblogs.com/aksoam/p/17084372.html