【基础知识笔记】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. 多项式的因式分解和展开

  1. factor(S):对符号多项式S分解因式。
  2. expand(S):对符号多项式S进行展开。
  3. collect(S):对符号多项式S按照默认变量x合并同类项。
  4. collect(S, v):对符号多项式S按变量v合并同类项。
  5. 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
>> 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

函数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)
posted @ 2023-02-01 22:39  FE-有限元鹰  阅读(63)  评论(0编辑  收藏  举报