Matlab系列之符号运算(上)

article/2025/9/18 22:17:04

Matlab系列之符号运算

  • 前言
  • 创建符号对象
  • 基本操作
    • 符号变量的基本操作
    • 符号表达式的基本操作
      • 四则运算
      • 多项式的操作
      • 符号表达式化简
      • 符号表达式的替换
      • 反函数求解
      • 复合函数
    • 更多精彩等你发现~

前言

看到文章的名字,可能很多人都没懂意思,如果叫它的另一个名字:代数运算,或许你就懂了;与正常的数值计算对数值处理有点不一样,符号运算处理的是符号;符号除了可以代表数以外,还可以代表多项式、函数、数学结构等等,MATLAB的符号数学工具箱(Symbolic Math Toolbox简成sym)具有丰富的内容,工具箱中符号表达式的计算都是在Maple内核下运行。Maple是一款数学软件,具体我也没了解过,反正符号运算功能很强就对了,本篇将对符号对象、符号变量以及符号表达式进行一些使用介绍,下一篇再对符号矩阵、符号微积分、符号积分变换以及符号方程求解进行记录。

注:使用的是MATLAB R2019B的版本

创建符号对象

符号对象在MATLAB中的使用也很好理解,直接使用sym或者syms函数生成其相关的变量或表达式,格式如下:

S=sym(x)
S=syms var1,var2,var3...%var代表变量名

S就是生成的符号对象,x代表字符、字符串、表达式等等,如果x代表的是一个数,则S为该数的一个符号表示;如果x是字符串,则S为一个符号变量或者符号表达式,如下示例:

s1=sqrt(2)%对数值2进行开方运算
s2=sym(sqrt(2))%将根号2转为字符表达式即“根号2”
s22=double(s2)%将对应的符号对象s2转为对应的运算结果

结果:

image-20201001184445147

如果表达式的元素都定义成符号变量,则所得结果会按代数式的规则进行运算,如:

sym(2)/sym(5)+sym(1)/sym(2)

结果:

ans = 9/10

使用sym函数进行符号变量和符号表达式进行演示,然后观察运行结果,就可以很清楚的理解符号对象了,看以下的举例,可以看到生成字符表达式使用了一个str2sym的函数将字符串直接转换成了sym的格式,因此此时的sym()这个其实可以不写了,不过为了理解,还是加上了。

注:旧版本(测试了下r2016a)就没有str2sym这个函数了,直接使用sym就可以。

x=sym('x')
y=sym(str2sym('hello_world'))
z=sym(str2sym('(1+sqrt(3))/2'))
s=sym(str2sym('a*x^2+b*x+c'))

结果:

image-20201001185156729

syms函数用于创建符号变量,然后再将生成的符号变量使用在符号表达式上,这个就不需要再像刚刚那样进行字符串的转化了,举例:

syms a b c x
f=a*x^2+b*x+c
f-a%进行符号表达式的运算

结果:

image-20201001185335832

以上主要介绍了符号变量与符号表达式的创建,接下来再对符号方程进行创建,首先都知道,方程和表达式的区别就在于表达式是由数字和变量组成的代数式,方程则在此基础上多了个等式,所以创建的方式和生成符号表达式类似:

s=sym(str2sym('a*x^2+b*x+c=0'))

结果:

image-20201001185606037

基本操作

既然创建了符号对象,当然需要拿来使用了,具体可以怎么用,以下将进行介绍。

符号变量的基本操作

介绍几个与符号变量相关的函数,symvar(注:旧的版本用的findsym)、digits与vpa函数;

symvar用于实现在表达式中寻找所有的自变量或者指定数量的独立自变量,格式如下:

symvar(s)%寻找表达式s中所有的符号变量
symvar(s,n)%在表达式s中寻找靠近字母x的n个符号变量

至于为什么默认是寻找‘x’附近的符号变量,就不清楚了,还有要知道一点,如果找到两个符号变量与x的距离相同,就ASCII码者大的优先,i、j、pi不做符号变量,做简单的示例演示:

%先创建符号变量,再创建函数,再求函数也就是表达式的符号变量
syms a b x m t
f=a*x^m+b*t
symvar(f,1)
symvar(f,2)
symvar(f,5)%找出靠近x的5个自变量
symvar(f)%找出所有的自变量

结果:

image-20201001185901258

digts和vpa函数用于控制符号运算的精度。

digts(n)代表将符号计算的精度设置成n,即小数位数,如果没有设置这个,则使用默认值32;

vpa即"variable precision arithmetic",使用方法:fv=vpa(f),即按照digits指定的精度对f进行计算,然后将值赋给fv;也可以fv=vpa(f,n),即在n位精度下,得到f的计算结果,并赋值给fv。

使用举例:

digits(10)
f1=vpa(sin(sym('pi')/6))
f2=vpa(pi)
f3=vpa(str2sym('(1+sqrt(3))/2'))

结果:

image-20201001190444778

符号表达式的基本操作

符号表达式的操作更多,可以进行四则运算、合并同类项、因式分解、反函数求解等等,接下来一一介绍。

四则运算

这个就和普通的算术表达式一样,加减乘除,直接举例看结果:

syms x y a b
f1=sin(x)+cos(y)
f2=a+b
f3=f1*f2
f3=f1/f2

结果:

image-20201001190514465

多项式的操作

为方便,就将多项式因式分解、多项式展开、合并同类项等等与多项式有关的就放一块进行了,关于对应的数学含义我就不说了,不懂的话,就建议好好打打数学基础…

先看下几种有符号多项式相关的函数及其使用格式:

factor(S)%因式分解
expand(S)%多项式展开
collect(S)%按照默认变量x合并同类项
collect(S,y)%按变量y合并同类项
horner(f)%将一般的符号多项式转成嵌套形式

看完格式了,就直接看以下的各个举例操作:

%因式分解
f=sym(str2sym('x^3-1'))
factor(f)%因式分解结果:(x-1)*(x^2+x+1)

结果:

image-20201001190800907

%多项式展开
syms  x y
f=(x+1)^5
expand(f)
f=cos(x+y)
expand(f)

结果:

image-20201001190955046

%合并同类项
syms x y 
f=(exp(x)+x)*(x+2)*(y+1)
c1=collect(f)
c2=collect(f,y)
c3=collect(f,exp(x))

结果:

image-20201001191330478

%将一般形式转换为嵌套形式
f=sym(str2sym('x^3-5*x^2+6*x-7'))
horner(f)

结果:

image-20201001191418129

如果表达式是一个有理分式,或者展开后是有理分式,就可以使用numden函数来提取符号表达式中的分子和分母,使用格式:

[n,d]=numden(s)

注:s为符号表达式,n和d分别代表分子(numerator)和分母(denominator)

举例:

syms x y
f=x/y+y/x
[n,d]=numden(f)

从结果可以看到,函数将表达式进行了合并后才进行分子和分母的提取,如下:

image-20201001191452456

多项式的基本操作就到这,接下来介绍下符号表达式的化简,和我们理解的表达式化简一个意思

符号表达式化简

化简有两个函数,simplify和simple(注:R2015a的版本把这个函数移掉了),simplify利用的是Maple的化简规则对符号表达式进行化简,会用到大量的代数恒等式和函数恒等式,比如:求和、开方、整数幂、三角函数、指数函数、对数函数超几何分布、伽马函数等等,力求得到最简的结果。

举例:

f=sym(str2sym('sin(x)^2+cos(x)^2'));%三角公式
s=sym(str2sym('exp(c*log(sqrt(a+b)))'));
f1=simplify(f)
s1=simplify(s)

结果:

image-20201001191554183

simple函数可以使用不同的化简方法,然后将使用的方法与化简结果一起输出,如果没有指定输出项,就会将所有使用到的化简方法和化简结果输出。

使用格式如下,我电脑上没有15a的版本就不演示例程了:

[r,how]=simple(s)%r为化简结果,how为使用的化简方法,s为符号表达式

符号表达式的替换

MATLAB的符号工具箱提供了两个替换函数,subs和subexpr;

subs:替换和被替换的符号变量都可以由自己指定,有以下的三种调用方式

subs(s,old,new)
subs(s,new)
subs(s)

s是符号表达式,old就是s中的某个符号变量,也是需要被替换掉的变量,new就是你自己想要替换后显示的那个符号变量,而这三种调用方式的含义直接看代码来理解会好理解些:

举例:

%exam1
syms a b
e1a=subs(a+b,a,3)%3替换a
e1b=subs(cos(a)+sin(b),{a,b},{sym('alpha'),2})%多重替换,将alpha和2分别替换a和b
%exam2
f=sym(str2sym('x^2+3*x+1'))%创建符号表示
e2=subs(f,'x',2)%将表达式中的x替换为2,即求解x=2时,f的值
%exam3
syms x y
e3=symvar(x + y, 1)%未输入old的变量时,默认替换符号表达式中的‘x’
%exam4
syms x
y=x^2;
x=2;%将x的值设为2
e4a=y%依旧是符号表达式x^2
e4b=subs(y)%使用新的值来表示y

结果:

%exam1
e1a = 
b + 3 
e1b = 
sin(2) + cos(alpha) 
%exam2
f = 
x^2 + 3*x + 1 
e2 = 
11 
%exam3
e3 = 
x 
%exam4
e4a = 
x^2 
e4b = 
4

subexpr:这个是将符号表达式中重复出现的字符串用符号变量替换,未指定新的符号变量,则使用默认的变量,从而简化符号表达式,使用格式有这么以下三种:

[r,sigma] = subexpr(expr)
[r,vari] = subexpr(expr,'var')
[r,vari] = subexpr(expr,var)

r是简化后的表达式;

sigma和vari都是代表重复的字符串,也就是被替换掉的那个字符串,而写成这两个格式,是为了区分是否指定了变换的符号变量,若无则默认以sigma这个变量对表达式进行简化,若有指定的就按指定的进行简化了,可以看下面的举例;

expr代表含有重复字符串的符号表达式,var和‘var’其实是等效的,不过前提是var必须要有定义或存在于工作变量区,因此‘var’就相当于var定义再使用的步骤。

举例:

syms a b c x
solutions = solve(a*x^2 + b*x + c == 0, x)%求解二次方程
[r,s1] = subexpr(solutions)
[r,s2] = subexpr(solutions,'var')

结果:

image-20201001175916958

从上面的结果可以很清楚的看出,简化后的表达式形式以及被替换的重复字符串是哪个,如果遇到很复杂的一串表达式的时候,用用简化不是很香吗?

反函数求解

反函数的理解就简单许多,直接看它的使用格式:finverse(f,var),f代表自变量是var的符号函数,var若没写,则返回的反函数自变量和原函数自变量相同,看以下的简单举例:

syms x y
f=tan(x)+tan(y);
f1=finverse(f)%未指定反函数自变量
f2=finverse(f,y)%指定反函数自变量为y

结果:

image-20201001181344514

从结果可以看到未指定反函数的自变量时,默认采用了x,显然有一定的先后顺序,然后指定y是自变量后,结果就明显不同了。

复合函数

在进行一些复杂计算时,经常遇到复合函数,在MATLAB中求解复合函数用compose函数,使用的格式如下:

compose(f,g)%返回f=f(x)和g=g(y)的复合函数f(g(y)),自变量为y
compose(f,g,z)%返回f=f(x)和g=g(y)的复合函数f(g(z)),自变量为z
compose(f,g,x,z)%返回f=f(x)和g=g(y)的复合函数f(g(y)),x为函数f的独立变量,自变量为z
compose(f,g,x,y,z)%返回f=f(x)和g=g(y)的复合函数f(g(z)),自变量为x和y分别为f和g的独立变量,自变量为z

可能看到使用格式的后两个的表述,会有点懵逼,但是仔细看一下举例操作,就可以很好的理解独立变量的意思了:

%创建函数
syms x y z u t
f=1/(1+x^2)
g=sin(y)
h=x^u
s=exp(-y/t)
%执行函数复合操作
e1=compose(f,g)
e2=compose(h,g,z)
e3=compose(h,g,u,z)
e4=compose(h,s,x,y,z)
e5=compose(h,s,u,t,z)

生成的函数结果:

image-20201001184042115

执行的复合函数操作结果:

image-20201001184120523
本次的记录到此结束,可能因为版本的问题,会有一些命令不兼容,这些就需要靠度娘或者Google之类的来给你们解决了,当然也可以在讨论区进行评论~,很明显没有自己搜来得快,不是吗?



更多精彩等你发现~




http://chatgpt.dhexx.cn/article/4S2IMHN8.shtml

相关文章

MATLAB学习之符号运算

创建符号变量数值与符号的转换数值矩阵转换为符号矩阵符号替换 本文介绍MATLAB中的符号运算; 1. 创建符号变量 符号常量是不含变量的符号表达式,用 sym 命令来创建符号常量。 sym(‘常量’):创建符号常量。 asym(sin(2)) sym 命令也可以把…

MATLAB08:符号运算

pdf版本笔记的下载地址: MATLAB08_符号运算(访问密码:3834) MATLAB08:符号运算 创建符号变量创建符号数字创建符号变量 符号运算符号表达式的化简与代入符号表达式的化简符号表达式的代入 求方程的解析解解单变量方程解多变量方程解方程组 符…

MATLAB基础(三)符号运算

符号对象的建立 符号对象的建立:sym 和 syms sym 函数用来建立单个符号变量,一般调用格式为:符号变量 sym(A) 参数 A 可以是一个数或数值矩阵,也可以是字符串 例如:asym(a) a 是符号变量 bsym(1/3) …

MATLAB符号运算部分知识总结

1. 符号表达式的定义 1.1符号变量的定义 符号变量通过命令syms和sym定义,syms命令一次定义一个或多个符号变量,sym命令一次只能定义一个符号变量。定义好的符号函数可以通过命令symvar检查其自变量。 MATLAB系统有默认的符号自变量,主要为&am…

[MATLAB]符号计算

符号计算 一、数值微积分1.1 数值计算与符号计算的区别1.2 符号对象1.3 符号常量1.4 符号变量1.4.1 符号变量的创建1.4.2 创建符号矩阵1.4.3 自由符号变量 1.5 符号表达式1.6 符号计算的运算符1.7 符号运算中的函数运算1.8 符号计算与数值计算的区别 二、符号数字及表达式2.1 数…

MATLAB符号运算

在数学、物理学及力学等各种学科和工程应用中,经常还会遇到符号运算的问题。在MATLAB中,符号运算是为了得到更高精度的数值解,但数值的运算更容易让读者理解,因此在特定的情况下,分别使用符号或数值表达式进行不同的运…

matlab 运算符

1、字符串 字符串是用单引号来标示的,例如:SI Have a Dream.,赋值号之后在单引号内的字符即是一个字符串,而S是一个字符串变量。 2、运算符 MATLAB 运算符分为算术运算符、关系运算符和逻辑运算符。 1、算术运算符 矩阵算术运算符 运算符…

将stylus 样式 转换成sass,scss

因为有一个项目使用的是 stylus. 后来的项目使用了 scss, 但是很多样式代码都可以共用的, 就是格式不太一样 要是一点一点来转化 就累死了 就想着网上找到一个工具也可以 能实现快速转换 没想到还真有 npm install -g stylus-converter mac sudo npm install -g s…

@import ‘./common/stylus/mixins.styl‘引起的一系列错误

import ./common/stylus/mixins.styl’引起的一系列错误 环境&#xff1a;vue-cli 4 代码&#xff1a; <template><div><h1>App 组件</h1><button class"btn btn1">按钮1</button><button class"btn btn2">按…

stylus的使用

欢迎访问我的博客地址 : 博客地址 stylus的使用 前提条件是已经有了vue项目&#xff0c;如果没有&#xff0c;请先建立&#xff0c;具体方法看这里https://cn.vuejs.org/v2/guide/installation.html 安装stylus 建立好项目后我们来安装stylus npm install -D stylus-loader s…

CSS预处理框架——Stylus

目录 内容介绍一、特征二、选择器&#xff08;Selectors&#xff09;  1、缩排 :book:  2、规则集  3、父级引用  4、消除歧义 三、变量&#xff08;Variables&#xff09;  1、变量 :mag:  2、标识符&#xff08;变量名&#xff0c;函数等&#xff09;  3、属性…

引入tinymce-vue后调试器报错 Refused to apply styl

今天在使用tinymce-vue的时候&#xff0c;遇到这些报错&#xff1a; 其中橙色框部分是因为没有引入对应插件导致的&#xff08;code , lineheight , indent2em&#xff09;;再我们下载的包中其实已经有了这些插件&#xff0c;只是页面没有引入&#xff0c;我们只需要页面引入就…

html list-style的作用,list-style是什么意思?list-style样式属性详解

本篇文章给大家带来的内容是关于list-style是什么意思?list-style样式属性详解&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。 一、list-style作用与用处 list-style是设置列表li的样式。比如li前面为阿拉伯数字、圆点、实…

.styl格式的CSS样式文件是什么文件

.styl格式的CSS样式文件是什么文件 Stylus 是一个 基于Node.js的CSS的预处理框架 。可以说是一种新型语言&#xff0c;其本质上做的事情与sass/less等类似。Stylus 比less更强大&#xff0c;而且基于nodejs&#xff1b;比sass更符合我们的思路。 最近研究了一下vue.js项目的高…

python中pip模块卸载并重装

** python中pip模块卸载并重装 ** 1、卸载已有的pip python -m pip uninstall pip2、重新安装 将https://bootstrap.pypa.io/get-pip.py中的内容复制下来&#xff0c;保存文件名为get-pip.py&#xff0c;之后cmd进入命令行输入如下命令即可&#xff1a; python get-pip.py

pip的安装和卸载

待安装系统环境 系统&#xff1a;macOS 10.15.5 依赖&#xff1a;Python 2.7.16 查看本机python版本的方法 $ python --versionPython 2.7.16 检测是否安装pip方法 $ pip-bash: pip: command not found command not found的提示说明你还没有安装pip 安装 安装好Python…

python中 pip不慎卸载了,重新安装方法

pip不慎卸载了&#xff0c;重新安装方法 今天不小心把pip给删除了&#xff0c;然后就搜怎么安装。弄了半天才弄好&#xff0c;这边记录一下&#xff1a; 1.下载安装文件 官方网站给出了安装的方法https://packaging.python.org/tutorials/installing-packages/#use-pip-for-…

pip 批量安装和卸载package

文章目录 1、pip批量安装package2、pip批量卸载package3、pip换国内源 1、pip批量安装package 将需要安装的包保存在aa.txt中 cd到aa.txt所在目录&#xff0c;运行&#xff1a; $ pip install -r aa.txt2、pip批量卸载package 将需要卸载的包保存在aa.txt中 cd到aa.txt所在…

两种方法彻底删除pip下载的所有第三方库,第二种最快

快速删除pip所有库 前言第一种第二种方法 前言 昨天有小伙伴在群里问怎么删除所有第三方库&#xff0c;已经太久没人问这种问题了&#xff0c;这让我突然意识到还是有很多小伙伴都是处于初学阶段的&#xff0c;于是今天给大家分享一下两种快速删除第三方库的方法&#xff0c;帮…

python pip 卸载环境内所有的包

那么如何一次性删除所有的包呢&#xff1f;首先需要执行以下代码&#xff1a; pip freeze>modules.txt 这时候就能够把所有的第三方模块的模块名称以及第三方模块的版本号等等信息保存在了这个 modules.txt文件中&#xff0c;之后的操作就是对这个文件进行操作了。 执行如…