Matlab基础入门手册(第六章 符号运算)

第六章 符号运算

1.53 符号对象

1.符号数值、变量和表达式的创建方法

2.认识函数

sym、syms

3.说明

符号数学工具箱

符号数学工具箱引入了一种特殊的数据类型 - 符号对象

该数据类型包括符号数字,符号变量,符号表达式和符号函数,还包含符号矩阵及上述变量组成的符号数组。

符号数学工具箱提供求解、绘图和操作符号数学方程的功能

4.实例演示

%1_53
%freexyn
1/6 %双精度浮点型1/6,在Matlab中使用小数表达
x=sym(1/6) %创建符号变量,分数形式表达
class(x) %测试x类型为符号对象
sin(pi) %对双精度浮点pi值求sin值,有舍入误差
sin(sym(pi)) %对符号对象数值pi求sin值,完整表达

%% 创建符号变量
sym('x') %方法1
syms x %方法2 声明后可直接使用,无输出结果,但工作区会存储
syms x y z
sym('x',[1 5]) %方法1的形式也可赋值多个符号变量,并自动编号

%% 创建符号表达式
f=2*x+1
g=x*y+z


1.54 符号函数和符号矩阵

1.符号函数和符号矩阵的创建和应用

2.说明

符号函数和符号矩阵的用法与常规的矩阵和函数相同,差异在于处理的数据类型不同,用符号对象运算时,需要首先声明符号对象。

3.实例演示

%1_54
syms x %声明符号对象x
f=2*x+1 %符号表达式
f(x)=2*x+1 %符号函数
f(1) %结果是符号对象3,与双精度3不同
syms f(x,y) %直接创建(声明)没有函数表达式的函数
f(x,y) %调用
f(1,2) %运算结果

%% 符号矩阵
syms a b c d %声明符号变量
A=[a b;c d] %符号矩阵,结果每行用中括号单独表达
B=[a 1;c 3] %混合类型符号矩阵
sum(A) %符号矩阵运算,与常规矩阵算法相同
sum(B)
sym('x',[2 2]) %创建2行2列矩阵,自动添加下标
sym('x%d%d',[2 2]) %分别引用2个下标
sym('x%d2018%d',[2 2]) %2个下标中间添加数字

%% 普通矩阵转化为符号矩阵
C=hilb(3) %创建3阶希尔伯特矩阵
sym(C) %转化为符号矩阵


1.55 基本运算

1.符号对象的算术运算、关系运算和逻辑运算

2.认识函数

isAlways %判断符号表达式是否为真

3.说明

符号对象的基本代数运算与浮点型数据的运算大体相同

4.实例演示

%1_55
1+1
sym(1)+1
syms a b x %声明符号变量
a+1
a+b
f=a+b+1
f+x
g(x)=a*x+b %函数运算
g(10)
m=[a b;b a] %符号矩阵运算
m+1
m.*2 %每个元素都乘2
m*m %矩阵乘法

%% 关系运算
1<2 %浮点型关系运算返回逻辑值
sym(1)<2 %先转换为符号型再运算,返回符号型表达式
isAlways(sym(1)<2) %用符号表达式的判断函数,返回逻辑值
a=0)
isAlways(abs(a)*abs(b)>=abs(a*b))
isAlways(abs(a)>=0 | 1>2) %第一项为真,取或运算后,结果为真
isAlways(abs(a)>=0 & 1>2) %结果为假

a | b
a & b

1.56 使用假设

1.符号变量使用假设

2.认识函数

设置assume

添加assumeAlso

显示assumptions

3.说明

在符号数学工具箱中,符号变量默认是复数变量

若要运算中不使用全体复数域,可以为变量添加假设指定范围

可以通过假设设置变量属于集合:整数、正数和实数

4.实例演示

%1_56
%作者:freexyn
syms x
assumptions(x) %x不存在假设,属于复数域
assume(x>=0) %设置假设
assumptions(x) %查看假设
% assume(x<=5)
% assumptions(x) %会覆盖前面假设内容
assumeAlso(x<=5) %追加假设
assumptions(x)

%% 设置x属于集合
assume(x,'integer') %假设x属于整数
assumptions(x)
assume(x,'positive') %假设x为正数
assume(x,'real') %假设x属于实数
assumptions(x)

%% 符号变量声明时同时设置假设
sym('x')
sym('x','real') %创建(声明)符号变量并假设属于实数
assumptions(x)
syms y positive %另一方法,创建(声明)符号变量并假设属于正数
assumptions(y)
assumptions %不给定参数时,会显示所有假设

%% 设置假设的用法
solve(y+1==0,y) %solve函数用来解方程,
solve(x+1==0,x)


1.57 清除假设

1.清除假设和重置符号引擎

2.认识函数

reset

3.说明

符号变量和它们的假设是分开存储的

符号引擎工作空间通常是空的,Matlab工作空间记录符号变量并在需要时把他们传递到符号引擎工作空间进行计算

符号引擎空间存储了所有的关于符号变量的假设,这些假设会影响方程的求解、化简和变换

清除变量和清除假设是两个过程,运算结束后注意清除假设

4.实例演示

%1_57
syms x y z positive %假设不存在工作区中,而在符号引擎工作空间中
assumptions %查看所有假设
whos %查看所有变量
clear x %清除变量x,并不会清除掉假设
assumptions
whos
% assume(x,'clear') %清除假设:变量x是访问和调用x假设的桥梁,变量若被清除了,则无法访问或清除假设
syms x %重新声明假设x
assume(x,'clear')
assumptions
whos
assume([x y],'clear') %可同时清除多个假设,以数组形式
assumptions
reset(symengine) %重制符号引擎工作空间:清理所有符号假设
assumptions


1.58 可变精度算术

1.可变精度算术的应用

2.认识函数

vpa

3.说明

默认的,Matlab双精度浮点数使用16位数字精度

而符号数学工具箱的vpa函数,提供了无限大的可变精度

它默认使用32位数字精度,32位指的是有效数字的位数

4.实例演示

%1_58
pi %默认双精度浮点型pi值,16位精度,默认short格式小数点后4位
vpa(pi) %pi转换为可变精度数值,32位精度
vpa(pi)+1 %先转换为可变精度数值再运算
vpa(pi,100) %通过输入第2个参数指定精度
vpa(sqrt(2),100)

%% 让整个运行环境使用可变精度
digits %获取当前运行环境的精度
i=digits(100) %设置运行环境精度100,i返回设置前的精度值
digits
vpa(pi) %显示pi的可变参数值,已变为100位
vpa(pi)+1
digits(32)
digits
vpa(pi)


1.59 运算精度的选择

1.分别在以下三种算术条件下求sin(pi)的值

符号运算

可变精度运算

双精度浮点型运算

2.说明

2.1 符号算术

默认的,符号数学工具箱使用确切的数字,进行精确的符号计算

2.2 可变精度算术

是符号数学工具箱的功能,是符号计算的近似数值计算

通过控制数值显示的有效位数实现可变精度

默认32位,运算速度稍快,内存消耗量依赖于设定的精度

2.3 双精度浮点数算术

双精度浮点运算就是常规的Matlab数值计算

有舍入误差,精确到16位精度,运算速度最快,内存消耗最少

3.实例演示

%1_59
a=sym(pi) %符号型
sin(a)
b=vpa(pi) %可变精度型
sin(b)
c=pi %双精度
sin(c)


1.60 数值型的转换

1. 符号型和数值型之间的转换

2.说明

符号数学工具箱允许实现符号对象和常规Matlab数据类型的转换(如数值、字符等)

也可以借助符号变量的精度控制方法实现高精度的数值计算

数值型转换成符号型用sym,返回数值表达式的有理近似值

转换的原理是,通过匹配p/q, pπ/q, (p/q)^1/2,2^q和10^q(其中p和q是中等大小的整数)这样的形式来修正舍入误差(符号型为精确值)

3.实例演示

%1_60
0.3 %双精度
sym(0.3) %转化为符号型
sym(0.333333333333333333333333333) %转化为符号型
a=1/6 %取小数后4位
sym(a)
a=pi/6
sym(a)
a=3^(1/3) %开立方近似值
sym(a) %转换成符号型时,无法将近似值转换成精确值的
a=3^(1/2) %开平方近似值
sym(a) %可以转换成符号型,常规近似值能够精确转换回去
sym(0.333333333333333333333333333) %转回符号型1/3
sym('0.333333333333333333333333333') %变为符号型
sym('x') %上式形式类似于创建符号变量


1.61 查找符号变量

1.查找符号变量

2.认识函数

symvar

3.说明

在符号表达式、符号函数和符号矩阵中查找符号变量

symvar函数自动把查找到的符号变量按字母顺须排列并输出

如果不是查找所有符号变量,那么靠近字母x的变量优先查找

特别的,对于符号函数,作为函数输入参数的符号变量优先查找

大多应用在当没有指定运算变量时,用于确定默认符号变量

4.实例演示

%1_61
%freexyn
syms a b n t x y
f=sin(a*x+b)+x^n+log(y) %符号表达式
symvar(f) %查找函数表达式f中的符号变量
symvar(f,1) %优先查找靠近x的符号变量
symvar(f,2) %查找2个符号变量
f(t)=sin(a*t+b)+x^n+log(y) %符号函数
symvar(f) %优先查找自变量,然后,查找靠近x的变量
symvar(f,1)
symvar(f,2)
m=[a b n;t x y] %符号矩阵
symvar(m)
symvar(m,2) %查找2个靠近x的变量


1.62 变量替代

1.符号变量的代入和替代

2.认识函数

subs

3.说明

把符号变量替代为数值

把符号变量替代为矩阵

替换符号矩阵中的元素

4.实例演示

%1_62
syms x y
f=x+y
subs(f,x,1) %将符号表达式f中变量x替换为1
subs(f,y,2)
subs(f,1) %符号表达式f中默认符号变量替换为1,默认符号变量即x,或者靠近x最近的变量
subs(f,x,y) %x替换为y
subs(f,[x y],[1 2]) %将x和y分别替换成1和2
subs(f,x,[1 2]) %x替换为矩阵[1 2]

m=[x y x;y x y] %2行3列的符号变量
m(1,3)=sym('a') %下标索引替换法
subs(m,x,sym('a')) %x替换为a
subs(m,m(1,1),sym('a'))
subs(m,x,x^2+x+1+y) %将x替换为符号表达式
subs(m,x,[2*x 2*y])


1.63 长表达式的缩写

1.长表达式的缩写

2.认识函数

pretty

subexpr

3.说明

长表达式可能含有多个相同的子表达式

可以把这样的子表达式替换并缩写

pretty使用内部算法来选择要缩写的子表达式,可以嵌套缩写

subexpr函数只做一个子表达式的缩写,它不支持嵌套缩写

它默认使用变量sigma来缩写子表达式

4.实例演示

%1_63
syms x
s=(sqrt(5)+x)/2
pretty(s)
ss=(s^2+s+1)*(s^2+s-1)/((s^2-s-1)*(s^2-s+1)^2)
pretty(ss) %嵌套缩写,将表达式中重复出现的子表达式缩写并拎出说明,子表达式符号无法更改
[s1,t]=subexpr(ss,'t') %嵌套缩写,返回表达式名称可指定,且是单行表达


1.64 符号函数绘图

1.简单介绍符号函数、方程和表达式的绘图方法

2.认识函数

fplot

3.实例演示

%1_64
% fplot(@sin) %函数句柄调用
% fplot(sin) %直接传递函数名,报错
% fplot(sin(x)) %函数名传入自变量,报错
%%Matlab是一个综合运行环境,上述为Matlab中基础工作模块中的函数

%% 符号函数工具箱中,也有fplot
% Matlab会根据输入数值类型区别调用工具箱,输入数值型会调用基础模块,输入符号型调用符号函数工具箱
syms x
fplot(sin(x)) %符号工具箱中可以直接调用函数名称
fplot(exp(x))
fplot(sin(x)+x^4*log(x))
fplot(sin(x)+x^4*log(x),[0 10]) %第二个参数指定绘图范围

% f=x^2+x+1 %符号表达式
% fplot(f) %传入符号表达式绘图
f(x)=x^2+x+1 %符号函数
fplot(f) %传入符号函数绘图

(本章结束,本书结束)

欢迎交流和留言

作者/旺旺/ UP:freexyn(邮箱:freexyn@163.com)

整理/注释:韩松岳(邮箱:colincooper@sina.com)

建议、提问、合作、供稿等,请发邮件。

附本书相关链接:

Matlab基础入门手册(第一章 入门)

Matlab基础入门手册(第二章 矩阵)

Matlab基础入门手册(第三章 运算符)

Matlab基础入门手册(第四章 数据类型)

Matlab基础入门手册(第五章 函数/脚本)

【本文】Matlab基础入门手册(第六章 符号函数)

End

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章