7.8 符号代数方程求解
从学习代数开始,我们就一直在探索关于方程的求解理论,从最初的代入消元法和加减消元法,到数值计算中的牛顿迭代法、高斯消元法,一直到微分方程的求解理论,方程在数学中的重要性就包含在这漫长的探索、深化过程中。
由于代数方程只涉及符号对象的代数运算,相对比较简单,它还可以细分为线性方程和非线性方程两类。前者往往可以很容易地求得所有解,但是对于后者来说,却经常容易丢掉一些解,这时就必须借助函数绘制图形,通过图形来判断方程解的个数。
这里所讲的一般代数方程包括线性、非线性和超越方程等,求解指令是solve。当方程组不存在符号解,又无其他自由参数时,solve指令将给出数值解。该指令的调用方式包括以下几种。
● g=solve(eq):其中eq可以是符号表达式或不带符号的字符串,该函数用于求解方程eq=0,其自变量采用默认变量,可以通过函数findsym来确定。
● g=solve(eq,var):求解方程eq=0,其自变量由参数var指定。其中eq和上一种调用方式相同。返回值g是由方程的所有解构成的列向量。
● g=solve(eq1,eq2,…,eqn):求解由符号表达式或不带符号的字符串eq1,eq2,…,eqn组成的方程组。其中的自变量为整个方程组的默认变量,即将函数findsym作用于整个方程组时返回的变量。
● g=solve(eq1,eq2,…,eqn,var1,var2,…,varn):求解由符号表达式或不带等号的字符串eq1,eq2,…,eqn组成的方程组。其自变量由输入参数var1,var2,…,varn指定。
对于上面的4种调用方式,输出的解有以下3种情况:
● 对于单个方程单个输出参数的情况,将返回由多个解构成的列向量。
● 对于有和方程数目相同的输出参数的情况,方程组的解将分别赋给每个输出参数,并按照字母表的顺序进行排列。
● 对于只有一个输出参数的方程组,方程组的解将以结构矩阵的形式赋给输出参数。
例7-33:符号代数方程求解示例。
在命令行窗口中输入:
clear syms a b c x; f = sym(a * x + b * x^-1 + c) solve(f)
输出结果:
f = c + a*x + b/x ans = -(c + (c^2 - 4*a*b)^(1/2))/(2*a) -(c - (c^2 - 4*a*b)^(1/2))/(2*a)
在命令行窗口中输入:
clear syms a b c x; f = sym(a * x^2 + b * x + c) solve(f, x)
输出结果:
f = a*x^2 + b*x + c ans = -(b + (b^2 - 4*a*c)^(1/2))/(2*a) -(b - (b^2 - 4*a*c)^(1/2))/(2*a)
在命令行窗口中输入:
solve(f, a)
输出结果:
ans = -(c + b*x)/x^2
在命令行窗口中输入:
clear syms x y; f1 = sym(x^2 + y^2 == 25) f2 = sym(x * y == 12) [x, y] = solve(f1, f2)
输出结果:
f1 = x^2 + y^2 == 25 f2 = x*y == 12 x = -3 -4 4 3 y = -4 -3 3 4
在命令行窗口中输入:
clear syms x y a b; f1 = sym(x^2 + y^2 == a^2) f2 = sym(x * y == b) S = solve(f1, f2, x, y)
输出结果:
f1 = x^2 + y^2 == a^2 f2 = x*y == b S = 包含以下字段的 struct: x: [4×1 sym] y: [4×1 sym]
在命令行窗口中输入:
S.x
输出结果:
ans = -((a^2/2 - (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(3/2) - a^2*(a^2/2 - (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(1/2))/b -((a^2/2 + (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(3/2) - a^2*(a^2/2 + (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(1/2))/b ((a^2/2 - (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(3/2) - a^2*(a^2/2 - (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(1/2))/b ((a^2/2 + (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(3/2) - a^2*(a^2/2 + (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(1/2))/b
在命令行窗口中输入:
S.y
输出结果:
ans = (a^2/2 - (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(1/2) (a^2/2 + (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(1/2) -(a^2/2 - (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(1/2) -(a^2/2 + (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(1/2)