1.符号计算目录
1.引导
2.基本符号对象的创建
2.1符号数
所用函数 :
sym(num):sc=sym(100) %非超长符号数的建立,不超过15位
sym('num'):sc1=sym('15555555555555555555') %超长
vpa(abs(b1-b2),32) %vpa设置精度值
isAlways:
e1=sym(pi)
e2=sym('pi')
isAlways(e1==e2)
d1=sym(i)
d2=sym(j)
isAlways(d1==d2) %千万不要sym('i')
2.2符号变量和符号数组
所用函数:
syms pr1 pr2 prn
sym('a',[1,n]) sym('a',[m,1]) sym('a%d%d',[m,n])
sym syms 没有附加选项默认复数集
x=sym('x','SET')
syms x y z SET
SET可为 integer整数集 positive rational有理数集 real实数集·
建议 assume(x,'real')这种限定性假设表述
assumeptions咨询
3.符号运算操作基础
3.1 符号算术运算符及函数
3.2 符号关系和符号逻辑表述
4.符号表达式和符号函数
4.1 创建符号表达式和符号方程
所用函数:
创建符号表达式(纯数字(子)表达式中要有sym定义的数字)
syms a
ex3=a*sin(1+sqrt(5))+1 %wrong
创建符号方程
syms x
ex21=x/(1+sin(pi/sym(2)+1))==1 %right
ex22=x/(1+sin(sym(pi)/2+1))==1 %right
ex23=x/(1+sin(pi/2+sym(1)))==1 %right
ex24=x/(sym(1)+sin(pi/2+1))==1 %符号方程的wrong代码
解方程solve(eqin,var)命令
4.2 创建符号函数
1.创建抽象符号函数
syms f1(x,y)
2.创建具体符号函数
syms a b
f21(x,y)=[a*sin(x);b*cos(y)];
或
f22=symfun([1,a*x+b*exp(y)],[x,y]);
3.创建符号常数函数
f31(x,y)=sym(1/2) %直接赋值法
f32=symfun(sym(1/2),[x,y]) %symfun创建函数
4.求符号函数的函数值
数值代入法办法
f21(pi,pi)
f22(sym(0.3),-5)
f22(0.3,-5)
f31(100,200)
5.函数体及函数体分量的获取
bf2=formula(f21)
bf2(2) 正确
f21(2) 错误
6.函数自变量的获取
af1=argnames(f1)
7.符号函数规模和函数体规模
sizef21=size(f21)
sizebf2=size(bf2)
symvar(expr,n) 查找符号变量除了符号常数变量
4.3符号函数和符号表达式的比较
1.抽象函数及应用示例
syms f(x) g(x)
u=f*g
Du=diff(u,x)
syms F G
w=F*G
Dw=diff(w,x)
Dw=0
2.符号具体函数与符号表达式的内涵差别
syms a b
e2=a^2*x^2+2*a*b*x+b^2
f2(x)=e2
argnames(e2) %获取自变量,没有
argnames(f2) %有
3.简化后各自属性不变
s4=simplify(e2) %结果仍是表达式
s4=simplify(f2) %结果仍是函数
4.函数非自变量的置换只能用subs
e5=subs(e2,[a,b],[1,2])
f5=subs(f2,{
a,b},{
1,2})
5.符号表达式的置换只能subs函数可以subs也可以直接输入自变量
e6=subs(e5,x,1) %仍是表达式
f61=subs(f5,x,1)%仍得到符号函数,不过是符号常数函数
f62=f5(1) %得到函数值
6.不定积分结果
e7=int(e5,x) %仍是表达式
f7=int(f5,x) %函数
%ne7=e5([1,2;3,4]) wrong 只能subs置换,不能直接带
ne71=subs(e5,x,[1 2;3 4])
nf7=f5([1 2;3 4])
7.定积分结果
e8=int(e5,x,0,x) %仍是表达式
f8=int(f5,x,0,x) %这里变成表达式的
%%函数不定积分仍是函数,定积分变成表达式
所以要求值必须借助subs函数进行x置换
ne8=subs(e8,x,[1 2 3 4 5]/10)
nf8=subs(f8,x,[1 2 3 4 5]/10)
5.符号表达式的简化重组和子对象置换
5.1 符号表达式的简化
nexpr=simplify(expr)
nexpr=simplify(expr,name,value)
expr:输入量:符号表达式 符号函数 或他们组成的数组
nexpr 输入量形式简洁
(1)'steps'选项的应用
syms x
f1=((exp(-x*i)*i)/2-(exp(x*i)*i)/2)/(exp(-x*i)/2+exp(x*i)/2)
s11=simplify(f1) %默认简化模式执行一次
s12=simplify(f1,'Steps',40) %不同简化模式执行40步
(2)critertion的应用
f2=sym(1i)^(1i+1)
s21=simplify(f2)
s22=simplify(f2,'Criterion','preferReal','Steps',100) %preferReal使i尽可能在外层
(3)ignoreanalyticconstrainys的应用
syms x y a b
f3=sqrt(x^-2)+log(x*y)+(y^a)^b+asin(sin(x))
s31=simplify(f3,'Steps',100) %100步简化也没变化
s32=simplify(f3,'IgnoreAnalyticConstraints',true)%当x=-2就是错的了,非严格解析等价的简化
5.2符号表达式的重写
rewrites
syms a x t
f=a*cos(t)
rf=rewrite(f,'exp')
f1=rectangularPulse(0,0.5,t) %创建0:0.5区间高度为1的方波脉冲
rf1=rewrite(f1,'heaviside')
5.3 符号表达式的子对象置换
rs=subs(s,old,new) old 可以是符号单变量,多变量,符号表达式,符号方程、函数中的子对象,数组,混合的元胞数组
用数组置换表达式中的标量
f6=cos(a*t)*exp(-b*t) %创建符号表达式
tt=0:0.01:2;%定义双精度数组
s61=subs(f6,{
a,b,t},{
6,1.2,tt}); %f6中的符号变量被双精度数值置换
%要花括号?中括号不行 既有符号变量又有双精度数值
s62=subs(f6,[a,b],[6,1.2]); %不置换数值
ctt=class(tt) %double对象
cs61=class(s61) %可知仍是符号对象sym
subplot(211)
fplot(s62,[0 2]);
subplot(212)
plot(tt,s61) %可接受双精度和符号数据绘图
[nexpr,sisgma]=subexpr(expr) %对expr 自动识别将其冗子式用默认的sigma代替
[nexpr,var]=subexpr(expr,var) %,指定变量更换
pretty(expr)
6.变精度计算及数字类型转化
6.1有限精度符号数和变精度符号数
数值计算一定存在截断误差,累计误差
符号计算不产生累积误差,但降低计算速度,所以将纯符号运算变为所谓的变精度算法,
环境精度设置命令 digits digits(n)
变精度命令vpa(x) vpa(x,n)
(1) 两种符号数值
a=sym(1)/3 %第一种精准符号数
digits