有时候,你可能会遇到较复杂的方程(组),希望用MATLAB来求解。MATLAB的符号运算正好可用于求解方程(组)。此外,它还有许多其他功能。例如,展开和简化、因式分解以及微积分运算等。MATLAB的符号运算虽然是数值运算的补充,但是它仍然是科学计算研究中不可替代的重要内容。与数值运算相比,符号运算不需要预先对变量赋值,其运算结果以标准的符号形式表达。比如说计算sin(π),数值运算的结果是1.2246e-16,符号运算的结果是0。前者是近似的,后者是精确的。
MATLAB符号运算功能非常强大,本文只介绍大部分常用的符号运算功能。注:本文代码的运行环境是MATLAB R2016b。
这一步骤是符号运算的第一步,后面的步骤都是在此基础上进行的。
%创建符号数 (只能用sym函数)s0 = 1 / sym(7) %符号数,不适合大型符号数s1 = sym('1/7') %符号数s2 = sym('3 + 4i') %符号复数 %创建符号变量 (sym函数和syms函数都行)%--sym函数s3 = sym('x') %符号变量 %--syms函数syms a b c %创建多个符号变量,值为本身syms(sym('[d e; e d]')) %用已存在的符号变量矩阵创建多个符号变量 %创建符号矩阵 (sym函数和syms函数都行)s4 = sym('[2 5 6; 9 8 6]') %符号数矩阵s5 = sym('x', [2 3]) %符号变量矩阵,矩阵内的元素不会被创建为符号变量A = [a b c; c b a] %用已存在的符号变量创建符号变量矩阵% syms A B [2 3] %仅2017及以上版本支持,同时创建多个符号矩阵代码运行结果如下。可以看到s5是一个2x3的符号变量矩阵,但矩阵内元素不会被创建成符号变量。

要表达一个数学函数可以用符号函数或符号 表达式 。
%创建符号表达式syms x yf = x^2 + 5*x + 4 %符号表达式subs(f, x, [2 1]) %分别将f中的x换成2和1f2 = sym('x^2 + 2*x + 1 = 0') %创建方程k = piecewise(x <= 0, x + y, x > 0, x - y); %分段符号表达式%更多分段符号表达式/函数的介绍详见:https://ww2.mathworks.cn/help/symbolic/piecewise.html#responsive_offcanvas %创建符号函数%--用syms函数syms G(x, y) F(z) %创建多个符号函数,变量名为括号前字母, 值为本身,其自变量也创建对应的符号变量F(z) = z^2 + 5*z + 4 %符号函数F([2 1]) %分别计算F(2)和F(1)G(x, y) = piecewise(x <= 0, x + y, x > 0, x - y); %分段符号函数,有多个条件用&&连接 %--用symfun函数syms x yg = symfun(x^2 + y^2, [x y]) %因变量 = symfun(公式,[自变量1 自变量2])g([2 3], [1 2]) %分别计算g(2, 1)和g(3, 2)代码运行结果如下。从图中可以看出符号表达式与符号函数之间的区别,它们的类型不同,且计算函数值的方式的也不同。

符号运算是精确计算,不会产生截断误差。并且可以根据需要,给出完全的封闭解或任意精度的数值解。本节讨论符号运算中的基本运算,可分为算术运算和关系运算。
3.1. 算术运算
数值运算中的一些运算符,例如‘+’、‘-’、‘*’、‘/’、’.*‘、’./‘、‘^’等,在符号运算中也可以使用。由于比较简单,且和数值运算相同,这里不做展示。
3.2 关系运算
关系运算符在符号运算中也可以使用,包括’>‘、’>=‘、’<‘、’<=‘、’==‘、’~=‘等。但是,在符号运算中这些运算并不是用来做关系比较,而是通过这些关系运算符构建关系式,作为后续操作(例如,解方程)的限制条件。若要对两个符号式做关系比较,可以使用函数isAlways、isequal或isequaln。
%关系运算syms xassume(x > 2); %假设x是大于2的solve((x + 1)*(x - 1)*(x - 2)*(x - 4)*(x - 6) == 0) %在设定的条件下,解方程 %函数isAlways、isequal以及isequaln%--isAlways:判断两个符号式构成的关系比较式的真假A1 = [x, sym(9); 2*x^2, tan(x)];B1 = [2*x, sym(6); x^2, sin(x)/cos(x)];res1 = isAlways(A1 > B1) %对于数组情况,分别比较相应元素,结果为同等大小的logical数组 %--isequal和isequaln:都是判断输入的两个符号式是否相等。但前者将NAN视为不相等,后者将NAN视为相等A2 = [x+1, nan]B2 = [x+1, nan]res2 = isequal(A2, B2)res3 = isequaln(A2, B2) %对于数组情况,相应元素全部相等,返回1;反之,返回0代码运行结果如下。

MATLAB符号运算提供了许多数学操作,例如解方程、微积分、线性代数运算、简化、变换等。本节将简单介绍微积分、解方程以及变换,更多详细功能介绍请看官方帮助文档。
4.1 微积分
微积分是数学中非常重要的 分析工具 。MATALB提供了许多微积分的相关操作,这里简单介绍求极限、微分以及积分。详细功能见微积分帮助文档。
%求极限syms xf1 = limit((exp(x) - 1) / x, x, 0) %计算x逼近0时,f的双向极限值 %微分syms x yf2 = diff(sin(x*y), x, y) %f先对x求导,再对y求导 %积分syms x yf3 = x / (y^2 + 1);res1 = int(f3, x) %f关于x的不定积分res2 = int(f3, x, 1, 3) %f关于x在[1, 3]上的定积分%changeIntegrationVariable函数:换元积分法%integrateByParts函数:分部积分法代码运行结果如下。

4.2 解方程
利用MATALB可以求解多种方程(组),例如线性方程、非线性方程、 微分方程 等。详见方程求解帮助文档。
%线性方程:所有未知数都是一次的。可用矩阵形式表示。(用linsolve)syms x y zeqns = [x+y-2*z == 0, x+y+z == 1, 2*y-z == -5];[A, b] = equationsToMatrix(eqns) %将线性方程转为矩阵形式X = linsolve(A, b) %linsolve函数大的对象是矩阵形式的线性方程 %非线性方程:(用solve函数或vpasolve函数)%--求解析解syms x yeqns = [2*x^2 + y^2 == 0, 2*x - y == 4];[solx soly] = solve(eqns, [x y]) %--求数值解syms xeqn = x^6 - x^2 == 2;s1 = vpasolve(eqn, x) %不指定求解范围s2 = vpasolve(eqn, x, [-3, 3]) %指定求解范围 %常微分方程:未知函数是一元函数的微分方程称作常微分方程syms y(t) a beqn = diff(y, t, 2) == 2 * a^2 * y; %二阶常微分方程diffY = diff(y, t);cond = [y(0)==b, diffY(0)==1]; %初始条件ySol(t) = dsolve(eqn, cond)代码运行结果如下。

4.3 变换
傅里叶 变换、拉普拉斯变换以及Z变换是数学中的常用变换,也是对于工科学生很重要的变换。MATLBA为上述变换都提供了相应的函数来实现。下面开始介绍这些函数的简单使用,每个变换的定义不进行说明,详细说明见变换函数的帮助文档。
%傅里叶变换syms tf = cos(2 * t);f_FT = fourier(f) %傅里叶变换f_IFT = ifourier(f_FT) %傅里叶逆变换% fourier(f, y) %指定变换变量,默认是w% fourier(f, t, y) %指定自变量和变换变量,默认自变量可以用symvar查看 %拉普拉斯变换syms tf = 2 * t;f_LT = laplace(f) %拉普拉斯变换f_ILT = ilaplace(f_LFT) %拉普拉斯逆变换% laplace(f, y) %指定变换变量,默认是s% laplace(f, t, y) %指定自变量和变换变量 %Z变换syms n zf = sin(n);f_ZT = ztrans(f) %Z变换f_IZT = iztrans(f_ZT) %逆Z变换% ztrans(f, y) %指定变换变量,默认是z% ztrans(f, t, y) %指定自变量和变换变量代码运行结果如下。

对于前面提到的符号表达式、符号方程、符号函数等,MATLBA提供了丰富的绘图函数来绘制它们。这些图可以是2D或3D形式的直线、轮廓线、曲面或网格。甚至,还可以创建动画图。下面展示2D和3D形式的曲线图,更详细说明见绘图帮助文档。
syms xfplot(tan(x) * sin(x)); %2D曲线 syms txt = exp(-t/10).*sin(5*t); %参数方程yt = exp(-t/10).*cos(5*t);zt = t;figurefplot3(xt, yt, zt) %3D曲线代码运行结果如下。

博主:虔诚~似锦(主博客)
个性签名:如果你愿意努力,人生最坏的结果也不过是大器晚成。
------------------------------------------------------------------------------------
如果这篇文章对你帮助的话,记得在下方点赞哦,博主在此感谢!🎉🎉🎉
如果对这篇文章有疑问,请在评论区指出,欢迎探讨,共同进步。😄😄😄
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删