MATLAB符号运算
【学习目标】
- MATLAB中的符号计算
- MATLAB中的符号变量和符号表达式的创建方法
- 符号函数、包括符号的初等运算、复合函数与反函数、极限、泰勒展开、级数求和、微分、积分、线性代数运算、线性方程与微分方程等。
4 MATLAB符号运算
MATLAB中如果操作对象不是数值而是符号,相应的计算就称为符号计算。在符号计算中,通过符号常数、符号变量以及有关符号的操作形成符号表达式。
- MATLAB中符号运算函数时数值运算函数的重载,符号运算采用的函数和数值运算的函数会有一部分重名,在获取帮助时,不要直接使用 doc/help 函数名,而应该使用:doc/help sym 函数名
【符号运算与数值运算区别】 - 数值运算中,必须先对变量赋值,然后才能参与运算
- 符号运算无需事先对变量赋值,运算结果以标准的符号形式表达
【示例】
%% 第四章MATLAB符号运算
% 4.1 符号运算概述
% 示例:数值运算和符号运算使用。哥哥比弟弟大19岁,哥哥是弟弟的三倍还多1岁,问两人年龄?
% 数值运算法
A=[1 -1;1 -3];
B=[19;1];
X=A\B
% 符号运算法
syms x y;
[x,y]=solve('x-y=19','x-3*y=1')
%% 4.2 符号变量和符号表达式
% MATLAB提供两种方法定义符号变量:sym和syms
% 调用格式:f = sym('符号字符串');表示创建一个符号变量f-值为'符号字符串'
% syms a b c 注意在这里面创建多个符号变量只能使用空格,不能其他
a = sym('a');
b = sym('b');
c = sym('c');
syms a b c; % 注意千万不能使用逗号,只能使用空格
%% 2 符号表达式
% 符号表达式是包含数字、函数和变量,但是一定没有赋值号的多项式。
% 调用格式 f = sym('符号表达式');共有三种方法
% 法一:用sym函数建立符号表达式
f = sym('a*x^2+b*x+c');
% 法二:使用已经定义的符号变量组成的符号表达式
syms x y a b c
f = a*x^2+b*x+c
f = sin(x)+cos(x)
g = (x-y)*(x+y)
% 法三:利用单引号生成符号表达式
f = 'a*x^2+b*x+c'
%% 3.符号方程 符号方程是含有等号的符号表达式
f = sym('a*x+b*x=0');
f
equa = sym('sin(x)+cos(x)=1');
equa
%% 4. sym函数的其他应用
% sym函数是个非常有用的函数,MATLAB还提供了这个函数的更多应用
% 1 sym函数创建符号变量时指定其实数复数属性
% 调用格式:s = syms('s',flag) flag为real或者unreal
x = sym('x','real')
y = sym('y','real')
f = x+y*i % f是个复数,x是个实部,y是虚部
conj(f)
syms x y unreal
z = x+5i
conj(z)
%% sym函数可以进行符号与数值之间的转换
% 调用格式:sym(f,flag) flag为‘f r e d’
pai = 355/144
pai1 = sym(pi,'f')
pai2 = sym(pi,'r')
pai3 = sym(pi,'e')
pai4 = sym(pi,'d');
%% 确定谁是自变量
% 在符号表达式中,MATLAB会自动地将x作为自变量来处理,而将a,b,c等作为常量参数
% 确定规则:除了i和j之外,字母位置最靠近x的小写字母;若有x则视为自变量;可以自行设置多个自变量
% 利用函数findsym来帮助获取房钱符号表达式中的自变量 调用格式:findsym(f);findsym(f,n)
f = sym('sin(a*x)+cos(b*y)');
findsym(f)
findsym(f,1)
f = sym('1/(4+cos(t))')
findsym(f,1)
f = sym('2*a+b')
findsym(f)
findsym(f,1)
f = sym('2*i+4*j');
findsym(f,1)
%% 3.符号的基本运算
% 符号的加减乘除运算 :+ - * / ^
syms x a b c
f = a*x^2 + b*x+c;
f
f = (x^3-1)(x-1)
%% 2 符号的基本运算
% 符号运算的结果通常是比较复杂,按照符号相关函数进行对符号的运算结果化简
% collect:合并同类项 调用格式:ccollect(f),collect(f,v)
% factor: 因式分解 调用格式:factor(f)
% numden:将符号表达式从有理式变为分子与分母形式 调用格式:[N,D]=numden(f)
% expand:展开符号表达式 调用格式:expand(f)
% simplify(f): 利用函数过着对表达式f进行化简 调用格式:simplify(f)
% simple:对表达式f进行化简,使表达式以最少的字符表示出来 调用格式:[r,how]=simple(f)
% horner:生成嵌套表达式 调用格式:horner(f),
% subs:替换函数 调用格式:subs(f),subs(f,new),subs(f,old,new)
% poly2sym:多项式转换为符号表达式 调用格式:poly2sym(p),poly2sym(p,v)
% sym2poly():符号表达式转换为多项式 调用格式:sym2poly(f),sym2poly(f,v)
syms x y
f = x^2*y+y*x-x^2-2*x;
collect(f)
collect(f,y)
f = x^3-6*x^2+11*x-6;
factor(f)
syms a b;
[n,d] = numden(1/(a-b)+2*b/(a+b))
f = (x-2)*(x-4);
f
expand(f)
f = sin(x)^2+cos(x)^2;
f
simplify(f)
syms a b c
simplify(exp(c*log(sqrt(a+b))));
f = 2*cos(x)^2 - sin(x)^2;
% simple(f) 返回若干化简函数和化简最简形式
f = x^3-6*x^2+11*x-6;
horner(f)
syms x y
f = sym('a*x^2+b*x+c');
a=5;
c=10;
subs(f)
syms a b;
subs(a+b,a,4);
subs(a+b,4);
p = sym('2*x^3+3*x^2+4');
sym2poly(p)
x = [2,3,0,4];
poly2sym(x)
%% 4.符号运算函数
% MATLAB提供了很多实用的符号运算函数,能够用符号解决更多复杂的数学问题
% 高数内容:包括:复合函数、反函数、极限、微积分、级数求和、代数方程求解和常微分方程
% 1 反函数 函数命令: finverse 调用格式:finverse(f) ,finverse(f,v)
syms x y
f = x^2+y;
finverse(f,y)
%% 2 求复合函数
% 函数命令 compose 调用格式compose(f,g),compose(f,g,z),compose(f,g,x,z)
% compose(f,g)返回f,g的复合函数f(g(y)),其中f,g中的自变量为系统默认的
% compose(f,g,z)返回f,g 的复合函数f(g(z)),其中z为g中的自变量
% compose(f,g,x,z)返回f,g的复合函数f(g(z)),其中x和z分别是f和g中的自变量
syms x y z t u;
f = 1/(1+x^2);g = sin(y); h = x^t; p = exp(-y/u);
compose(f,g)
compose(f,g,t)
compose(h,g,x,z)
compose(h,g,t,z)
% 例子:已知f(sin(x/2))=1+cos(x),求f(cos(x)).并计算x=pi/6时函数的值
syms x;
t = finverse(sin(x/2));
f = 1+cos(t);
g = cos(x);
F=compose(f,g);
subs(F,pi/6)
%% 3 求极限
% 函数命令 limit 调用格式 g = limit(f),g = limit(f,a),g = limit(f,x,a)
% g = limit(f,x,a,'left') g = limit(f,x,a,'right')
syms x;
limit(1/x)
limit(1/x,0)
limit(1/x,x,0,'left')
limit(1/x,x,0,'right')
limit(sin(x)/x)
limit((x-2)/(x^2-4),2)
syms t h;
limit((1+2*t/x)^(3*x),x,inf)
limit((sin(x+h)-sin(x))/h,h,0)
%% 4 微分
% 函数命令 diff 调用格式 diff(f),diff(f,t),diff(f,n),diff(f,t,n)
syms a b c x
f = a*x^2+b*x+c;
diff(f)
diff(f,2)
diff(f,a)
diff(f,a,2)
diff(diff(f),a)
%% 5 积分
% 函数命令 int 调用格式 int(f),int(f,t) ,int(f,t,a,b) ,int(f,a,b),int(f,m,n)
syms a b c x t;
f = a*x^2+b*x+c;
int(f)
int(f,a)
int(int(f,a),x)
int(1/(1+x^2))
int(x*log(1+x),0,1)
int(4*x*t,x,2,sin(t))
%% 6 级数求和
% 函数命令 symsum 调用格式 symsum(f),symsum(f,b), symsum(f,a,b),symsum(f,v,a,b)
syms k;
symsum(1/k,k,1,inf)
symsum(1/(k*(k+1)),k,1,inf)
%% 7 泰勒展开 用多项式去逼近函数曲线
% 函数命令 taylor 调用格式 taylor(f,v,n)
% 函数功能 taylor(f,v,n)返回f对指定的自变量v展开到第n-1项
% 通常在展开后,使用subs函数得到自变量在某处的展开的结果
% 缺少例子
%% 8 方程求解
% 函数命令 solve 调用格式sovle(f1,f2,f3,...,fn),solve(f1,f2,...,fn,v1,v2,v3,...vn)
% 函数功能 就是解f1=0,f2=0,f3=0,...方程组
f = sym('a*x^2+b*x+c');
solve(f)
solve(f,a)
syms x y z;
f1 = sym('x+y+z-10');
f2 = sym('x-y+z');
f3 = sym('2*x-y-z+4');
[x,y,z] = solve(f1,f2,f3)
%% 9 常微分方程求解
% 函数命令 dsolve 调用格式 dsolve(f,cond,v),dsolve(f1,f2,f3,...,fn)
% dsolve(f1,f2,f3,...,fn,cond1,cond2,cond3,...,condn,v1,v2,...,vn)
% 注意:Dy代表dy/dt ,D2y代表对d2y/dt2;
% 若没有初始条件,则求微分方程的通解;系统默认变量t
dsolve('Dy=5')
dsolve('Dy=x','x')
dsolve('D2y=1+Dy')
dsolve('D2y=1+Dy','y(0)=1','Dy(0)=0')
% 求解微分方程组的通解和初始条件为x(0)=0,y(0)=1的解
[x,y] = dsolve('Dx=y+x','Dy=2*x')
[x,y] = dsolve('Dx=y+x','Dy=2*x','x(0)=0','y(0)=1')
%% 4.5 符号矩阵的创建和运算
% 在MATLAB中,数值矩阵不能直接参与符号运算,必须先转化为符号矩阵。数值矩阵与符号矩阵
% 转化的函数时sym函数。transpose函数(返回矩阵的转置矩阵)和determ函数(返回符号矩阵的行列式值)
% 1 符号矩阵的创建 符号矩阵是一种符号表达式,通过sym函数创建符号矩阵,矩阵元素可以是任何不带
% 等号的符号表达式,各符号表达式的长度不同,矩阵元素之间用逗号或者空格分隔
syms a b c;
M=[a b c;b c a;c a b]
A=[1 1/2,1/3;1/2 1/3 1/4;1/3 1/4 1]
M=sym(A)
%% 2 符号矩阵的运算
% 加减乘除,转置,行列式,逆运算,求秩,求幂,指数运算
syms x;
A = [1/x 2/x 3/x;x+1 x+2 x+3];
B = [x x x+1;x x+2 x];
M = A+B
M'
M = [M;x x x]
d = det(M)
M = [x 1;x+2 0]
inv(M)
rank(M)
M^2+1
exp(M)
expm(M)
%% 练习题计算练习
syms x y;
int(int(x*y,y,sin(x),cos(x)),x,1,2)