符号对象:
% 符号对象的建立与运算:
% (符号对象的结果是一个精确的数学表达式,数值计算的结果是一个数值)
% 符号对象名=sym(A); (定义单个符号对象)
% A可以是数值常量,数值矩阵或数值表达式(不加单引号);这时符号对象为一个符号常量
% A也可以是一个变量名(加单引号),这时符号对象为一个符号变量
% syms 符号变量名1 符号变量名2 ... 符号变量名n (定义多个符号变量,不加单引号)
% eval(符号对象名)将符号表达式转化为数值结果
% 为符号对象设置值域
% assume(condition) 指定变量满足条件condition
% syms x; assume(x<0); abs(x)==x;
% assume(expr,set) 指定表达式expr属于集合set
% factor(s):对符号表达式s分解因式(将整数s分解为质因子//验证素数)
% expand(s):对符号表达式s进行展开
% collect(s):对符号表达式s合并同类项
% collect(s,v):对符号表达式s按变量v合并同类项
% 验证M19 、 M23 、 M29 、 M31是否为梅森素数。
syms p;
m=2^p-1;
p=19;
m19=eval(m)
factor(m19)
p=23;
m23=eval(m)
factor(m23)
p=29;
m29=eval(m)
factor(m29)
p=31;
m31=eval(m)
factor(m31)
% 其他运算
% [n.d]=numden(s) 提取有理分式的分子分母
% c=coeffs(s,x) 提取符号表达式s中x的系数(排列顺序由低次到高次)
% simplify(s) 符号表达式化简
% p=sym2oply(s) 符号多项式转换为多项式系数向量(必须为单符号变量)
% s=poly2sym(p) 向量 -> 多项式
% symvar(s,n) 查找符号表达式s中的n个符号变量(n=1时查找s主变量)
% 求方程ax^2+bx+c=0的根。
syms a b c x;
f=a*x^2+b*x+c;
g=coeffs(f,x)
g=g(end:-1:1);
roots(g)
% 符号矩阵
% 当λ取何值时,以下齐次线性方程组有非零解。
% 对于齐次线性方程组Ax=0,当rank(A)<n或|A|=0时x有非零解
syms lamda;
A=[1-lamda,-2,4;2,3-lamda,1;1,1,1-lamda];
D=det(A)
factor(D)
符号方程求解:
% 代数方程符号求解(可能出错,应用多种方法)
% solve(s,v) 求解符号表达式s的代数方程
% v为求解变量 (省略时为系统默认)
% solve(s1,s2,...sn,v1,v2,...,vn)
% 求解符号表达式s1,s2...sn组成的方程组,求解变量分别为v1...vn
% 解方程ax^2+bx+c=0
syms x y a b c;
f1=solve(a*x^2+b*x+c==0)
f=a*x^2+b*x+c==0;
f2=solve(f)
f3=solve(a*x^2+b*x+c) %方程右端=0可以省略
f=a*x^2+b*x+c;
f4=solve(f)
% 常微分方程(组)求解
% dsolve(e,c,v)
% 求解常微分方程e在初值条件c下的特解。
% v是方程自变量,省略时按默认处理
% 若初值条件c省略,则求方程通解
% dsolve(e1,e2,...en,c1,c2,...,cn,v)
% 求解常微分方程组在初值条件c1,c2,...,cn下的特解
% 若无初值条件,求通解,若无自变量,采用默认自变量t
% MATLAB中,大写字母D表示导数
% Dy表示y',D2y表示y",Dy(0)=5表示y'(0)=5
% 求微分方程或方程组的解
syms x y t;
y=dsolve('Dy-(x^2+y^2)/x^2/2',x)
[x,y]=dsolve('Dx=4*x-2*y','Dy=2*x-y',t)
应用举例:
% 疾病传染问题
syms a b c y t;
f=dsolve('Dy=a*y*(1-y)-c*y', 'y(0)=b',t)
% 当a==c时
f=dsolve('Dy=a*y*(1-y)-a*y', 'y(0)=b',t)
符号微积分:
% 符号函数的极限
% limit(f,x,a); 求函数f关于变量x在a点的极限
% 若x省略,则采用系统默认的自变量; a默认值为0;
% limit(f,x,a,'right'); limit(f,x,a,'left'); 单边极限
syms a m x n;
f=(x^(1/m)-a^(1/m))/(x-a);
limit(f,x,a)
g=(1+1/n)^n;
limit(g,n,inf)
% 符号函数的导数(多元即求偏导数)
% diff(f,x,n) 求函数f关于变量x的n阶导数
% x同limit(可缺省); n默认为1
syms x y z;
f=sqrt(1+exp(x));
diff(f)
g=x*exp(y)/y^2;
diff(g,x)
diff(g,y)
% 符号函数的积分
% 不定积分
% int(f,x); 求函数f对变量x的不定积分
% x省略时,按默认规则
syms x t;
f=(3-x^2)^3;
int(f)
g=5*x*t/(1+x^2);
int(g,t)
% 定积分
% int(f,x,a,b);
% 当函数f关于变量x在闭区间[a,b]可积时,返回定积分结果
% 当a、b中有一个为inf时,返回广义积分
% 当a、b中有一个为符号表达式时,返回一个符号函数
syms x t;
int(abs(1-x),1,2)
int(1/(1+x^2),-inf,inf)
int(4*x/t,t,2,sin(x))
应用举例:
% 河道水流量的估算问题
xi=0:50:600; % 横坐标
yi=[4.4,4.5,4.6,4.8,4.9,5.1,5.4,5.2,5.5,5.2,4.9,4.8,4.7];
% 水流深度
% ①曲线拟合,拟合出河床曲线,进行定积分,计算河流横截面,即可估计流量
p=polyfit(xi,yi,3);
subplot(1,2,1);
plot(xi,yi,'o',xi,polyval(p,xi));
syms y x;
y=poly2sym(p,x); % 将拟合曲线的多项式转化为符号表达式形式
s=int(y,x,0,600); % 定积分计算横截面面积
v=s*0.6; % 计算水流量
eval(v) % 转化为数值形式
% ②根据河床曲线,计算导函数,判断相应范围内取值是否大于1:1.5
yn=-yi; %要计算斜率,故需要将曲线倒过来。
p=polyfit(xi,yn,3); %重新拟合
subplot(1,2,2);
plot(xi,yn,'o',xi,polyval(p,xi));
syms y x yii;
y=poly2sym(p,x);
%{
(另一种方法,polyval计算值,直接对值求导也可以)
x=50:60;
y=polyval(p,x);
k=diff(y)/1;
all(abs(k)<1/1.5)
%}
yii=diff(y,x); %求导函数
x=50:60; %函数在指定范围内
k=eval(yii); %计算并转换为数值形式
all(abs(k)<1/1.5) %最后比较斜率
级数:
% 级数求和
% symsum(s,v,n,m)
% s:符号表达式,表示级数通项;
% v:求和变量(省略时使用系统默认变量)
% n、m是求和变量v的初值和末值
syms n;
s1=symsum(n^2,1,100)
s2=symsum((-1)^(n-1)/n,1,inf)
s3=symsum((-1)^(n-1)/(2*n-1),n,1,inf)
hypergeom([-1/2, 1], 1/2, -1) %超几何函数
eval(s3)*4
% 银行利率的计算问题
syms k r;
p2=symsum(50000*(1+0.045/k)^k,k,2,2);
eval(p2)
p4=symsum(50000*(1+0.045/k)^k,k,4,4);
eval(p4)
p12=symsum(50000*(1+0.045/k)^k,k,12,12);
eval(p12)
limit((1+r/k)^k,k,inf)
50000*exp(0.045)
% 泰勒级数
% taylor(f,v,a,Name,Value)
% 将函数f按变量v在a点展开为泰勒级数
% 除f外其余参数均可省略,v省略时按默认规则确定变量
% a默认为0,Name为选项名,Value为选项值
% Name/Value:
% ①'ExpansionPoint' 指定展开点(标量或向量),Value默认为0
% ②'Order' 指定截断参数(正整数),Value默认为6(即最高阶为5)
% ③'OrderMode' 指定展开式采用绝对阶或相对阶
% ('Absolute'或'Relative'),Value默认为'Absolute'
% 求函数f(x)在x=1处的5阶泰勒级数展开式。
syms x;
f=(1+x+x^2)/(1-x+x^2);
taylor(f,x,1,'Order',6)
expand(ans)