7.4 符号表达式替换
在处理一些结构较为复杂、变量较多的数学模型时,引入一些新的变量进行代换,以简化其结构,从而达到解决问题的目的,这种方法叫作变量代换法。
例如,求不定积分,设,则
变量代换法是一种非常有效的解题方法,尤其是在处理一些复杂的不等式问题时,效果明显。合理代换往往能简化题目的信息,凸显隐含条件,沟通量与量之间的关系,对发现解题思路、优化解题过程有着重要的作用。
MATLAB提供了subs函数和subexpr函数进行变量代换,或者叫作符号表达式的替换。subs函数利用符号变量或符号表达式替换目标符号表达式中的符号变量(包括符号常量);subexpr函数利用符号变量替换目标符号表达式中的某个子符号表达式。
7.4.1 subs替换函数
函数subs可以用指定符号替换符号表达式中的某一特定符号,其调用格式如下。
● R=subs(S):用工作区中的变量值替代符号表达式S中的所有符号变量。如果没有指定某符号变量的值,则返回值中该符号变量不被替换。
● R=subs(S,New):用新符号变量New替代原来符号表达式S中的默认变量。确定默认变量的规则与函数findsym的规则相同。
● R=subs(S,Old,New):用新符号变量New替代原来符号表达式S中的变量Old。当New是数值形式的符号时,实际上用数值代替原来的符号来计算表达式的值,只是所得结果仍然是字符串形式。
例7-21:subs替换函数示例。
在命令行窗口中输入:
syms x y t; f = sym(x^2 + x * y + y^2) x = 2; subs(f)
输出结果:
f = x^2 + x*y + y^2 ans = y^2 + 2*y + 4
在命令行窗口中输入:
y = 2; subs(f)
输出结果:
ans = 12
在命令行窗口中输入:
subs(f, t^2)
输出结果:
ans = t^4 + t^2*y + y^2
在命令行窗口中输入:
subs(f, {'x', 'y'}, {3, 4})
输出结果:
ans = 37
7.4.2 subexpr替换函数
函数subexpr将表达式中重复出现的字符串用变量代替,其调用格式如下。
● [Y,SIGMA]=subexpr(S,SIGMA):指定用变量SIGMA的值(必须为符号对象)来代替符号表达式(可以是矩阵)中重复出现的字符串。替换后的结果由Y返回,被替换的字符串由SIGMA 返回。
● [Y,SIGMA]=subexpr(S,'SIGMA'):这种形式和上一种形式的不同之处在于,第二个输入参数是字符或字符串,它用来替换符号表达式中重复出现的字符串。其他参数与上面的形式相同。
例7-22:subexpr替换函数示例。
在命令行窗口中输入:
syms a b c d x solutions = solve(a * x^3 + b * x^2 + c * x + d == 0, x, 'MaxDegree', 3)
输出结果:
solutions = (((d/(2*a) + b^3/(27*a^3) - (b*c)/(6*a^2))^2 + (- b^2/(9*a^2) + c/(3*a))^3)^(1/2) - b^3/(27*a^3) - d/(2*a) + (b*c)/(6*a^2))^(1/3) - b/(3*a) - (- b^2/(9*a^2) + c/(3*a))/(((d/(2*a) + b^3/(27*a^3) - (b*c)/(6*a^2))^2 + (c/(3*a) - b^2/(9*a^2))^3)^(1/2) - b^3/(27*a^3) - d/(2*a) + (b*c)/(6*a^2))^(1/3) (- b^2/(9*a^2) + c/(3*a))/(2*(((d/(2*a) + b^3/(27*a^3) - (b*c)/(6*a^2))^2 + (c/(3*a) - b^2/(9*a^2))^3)^(1/2) - b^3/(27*a^3) - d/(2*a) + (b*c)/(6*a^2))^(1/3)) - (3^(1/2)*((- b^2/(9*a^2) + c/(3*a))/(((d/(2*a) + b^3/(27*a^3) - (b*c)/(6*a^2))^2 + (c/(3*a) - b^2/(9*a^2))^3)^(1/2) - b^3/(27*a^3) - d/(2*a) + (b*c)/(6*a^2))^(1/3) + (((d/(2*a) + b^3/(27*a^3) - (b*c)/(6*a^2))^2 + (- b^2/(9*a^2) + c/(3*a))^3)^(1/2) - b^3/(27*a^3) - d/(2*a) + (b*c)/(6*a^2))^(1/3))*1i)/2 - b/(3*a) - (((d/(2*a) + b^3/(27*a^3) - (b*c)/(6*a^2))^2 + (- b^2/(9*a^2) + c/(3*a))^3)^(1/2) - b^3/(27*a^3) - d/(2*a) + (b*c)/(6*a^2))^(1/3)/2 (- b^2/(9*a^2) + c/(3*a))/(2*(((d/(2*a) + b^3/(27*a^3) - (b*c)/(6*a^2))^2 + (c/(3*a) - b^2/(9*a^2))^3)^(1/2) - b^3/(27*a^3) - d/(2*a) + (b*c)/(6*a^2))^(1/3)) + (3^(1/2)*((- b^2/(9*a^2) + c/(3*a))/(((d/(2*a) + b^3/(27*a^3) - (b*c)/(6*a^2))^2 + (c/(3*a) - b^2/(9*a^2))^3)^(1/2) - b^3/(27*a^3) - d/(2*a) + (b*c)/(6*a^2))^(1/3) + (((d/(2*a) + b^3/(27*a^3) - (b*c)/(6*a^2))^2 + (- b^2/(9*a^2) + c/(3*a))^3)^(1/2) - b^3/(27*a^3) - d/(2*a) + (b*c)/(6*a^2))^(1/3))*1i)/2 - b/(3*a) - (((d/(2*a) + b^3/(27*a^3) - (b*c)/(6*a^2))^2 + (- b^2/(9*a^2) + c/(3*a))^3)^(1/2) - b^3/(27*a^3) - d/(2*a) + (b*c)/(6*a^2))^(1/3)/2
继续输入:
[r, sigma] = subexpr(solutions)
输出结果:
r = sigma - b/(3*a) - (- b^2/(9*a^2) + c/(3*a))/sigma (- b^2/(9*a^2) + c/(3*a))/(2*sigma) - b/(3*a) - (3^(1/2)*(sigma + (- b^2/(9*a^2) + c/(3*a))/sigma)*1i)/2 - sigma/2 (- b^2/(9*a^2) + c/(3*a))/(2*sigma) - b/(3*a) + (3^(1/2)*(sigma + (- b^2/(9*a^2) + c/(3*a))/sigma)*1i)/2 - sigma/2 sigma = (((d/(2*a) + b^3/(27*a^3) - (b*c)/(6*a^2))^2 + (- b^2/(9*a^2) + c/(3*a))^3)^(1/2) - b^3/(27*a^3) - d/(2*a) + (b*c)/(6*a^2))^(1/3)