MATLAB的符号计算
所谓符号计算是指在运算时,无须事先对变量赋值,而将所得到结果以标准的符号形式来表示。
例如,在符号变量运算过程中pi就用pi表示,而不是具体的近似数值3.14或3.14159。使用符号变量进行运算能最大限度减少运算过程中因舍入造成的误差。符号变量也便于进行运算过程的演示。
一、符号计算基础
(一) 定义符号变量
参与符号运算的对象可以是符号变量、符号表达式或符号矩阵。符号变量要先定义,后引用。可以用sym函数、syms函数将运算量定义为符号型数据。引用符号运算函数时,用户可以指定函数执行过程中的变量参数;若用户没有指定变量参数,则使用默认的变量作为函数的变量参数。
1、sym函数
sym函数的主要功能是创建符号变量,以便进行符号运算,也可以用于创建符号表达式或符号矩阵。用sym函数创建符号变量的一般格式为:
x = sym(‘x’)
其目的是将’x’创建为符号变量,以x作为输出变量名。每次调用该函数,可以定义一个符号变量。
a=sym(‘a’); %定义‘a’为符号运算量,输出变量名为a b=sym(‘b’); x=sym(‘x’); y=sym(‘y”); [x,y]=solve(‘a*x-b*y=1’, ‘a*x+b*y=5’, ‘x’, ‘y’) %以a,b为符号常数,x,y为符号变量 即可得到方程组的解: x =3/a y =2/b
(一) 定义符号变量
【例2】已知一复数表达式 z=x+i*y, 试求其共轭复数,并求该表达式与其共轭复数乘积的多项式。
为了使乘积表达式x^2+y^2非负,这里,把变量x和y定义为实数。
x=sym(‘x’,’real’);
y=sym(‘y’,’real’);
z=x+i*y; %定义复数表达式
conj(z); %求共轭复数
expand(z*conj(z)) %求表达式与其共轭复数乘积的
多项式
ans =
x^2+y^2
若要去掉’x’的属性,可以使用下面语句
x = sym(‘x’,’unreal’)
将’x’创建为纯格式的符号变量。
2、syms函数
syms函数的功能与sym函数类似。syms函数可以在一个语句中同时定义多个符号变量,其一般格式为:
syms arg1 arg2 …argN
用于将rg1, arg2,…,argN等符号创建为符号型数据。
(二)默认符号变量
在数学表达式中,一般习惯于使用排在字母表中前面的字母作为变量的系数,而用排在后面的字母表示变量。例如:
f=ax2+bx+c
表达式中的a,b,c通常被认为是常数,用作变量的系数;而将x看作自变量。
例如,数学表达式
f=xn
g=sin(at+b)
根据数学式中表示自变量的习惯,默认a,b,c为符号常数,x为符号变量。
若在MATLAB中表示上述表达式,首先用syms 函数定义a,b,n,t,x为符号对象。在进行导数运算时,由于没有指定符号变量,则系统采用数学习惯来确定表达式中的自变量,默认a,b,c为符号常数,x,t为符号变量。
即 : 对函数f求导为:df/dx
对函数g求导为:dg/dt
(四) 生成符号函数
将表达式中的自变量定义为符号变量后,赋值给符号函数名,即可生成符号函数。例如有一数学表达式:
其用符号表达式生成符号函数fxy的过程为:
syms a b c x y %定义符号运算量
fxy=(a*x^2+b*y^2)/c^2 %生成符号函数
生成符号函数fxy后,即可用于微积分等符号计算。
【例4】定义一个符号函数 fxy=(a*x2+b*y2)/c2 ,分别求该函数对x、y的导数和对x的积分。 syms a b c x y %定义符号变量 fxy=(a*x^2+b*y^2)/c^2; %生成符号函数 diff(fxy,x) %符号函数fxy对x求导数 ans =2*a*x/c^2 diff(fxy, y) %符号函数fxy对y求导数 ans =2*b*y/c^2 int(fxy, x) %符号函数fxy对x求积分 ans =1/c^2*(1/3*a*x^3+b*y^2*x)
(五)标准代数运算
很多标准的代数运算可以在符号表达式上执行,函数symadd、symsub、symmul和symdiv为加、减、乘、除两个表达式,sympow将一个表达式上升为另一个表达式的幂次。
f= ' 2*x^2+3*x-5 ' % define the symbolic expression
>>f=
2*x^2+3*x-5
>> g= ' x^2-x+7 '
g=
x^2-x+7
>> symadd(f,g) % find an expression for f+g
ans= 3*x^2+2*x+2
>> symsub(f,g) % find an expression for f-g
ans= x^2+4*x-12
>> symmul(f,g) % find an expression for f*g
ans= (2*x^2+3*x-5)*(x^2-x+7)
>> symdiv(f,g) % find an expression for f/g
ans= (2*x^2+3*x-5)/(x^2-x+7)
>> sympow(f, ' 3*x ' ) % the same as sym(A)^sym(B)
ans= (2*x^2+3*x-5)^3*x