2.4 联立方程组的精确求解
前面介绍过,利用图解方法只能求出给定方程的实数根,并不能求出方程的复数根,具体例子可以参见例2-12。另外,如果联立方程有多个实数根,则只能用图形方法绘制出根所在的位置,并不能直接得出根的具体值,需要逐个根进行局部放大求解,求解过程比较烦琐。此外,前面介绍的数值求解方法由于每次只能求出方程的一个根,使用起来有时也不方便。
MATLAB工具箱提供了代数方程的解析求解函数solve(),可以直接用于求解解析解存在的代数方程。如果方程的解析解不存在,则可以采用vpasolve()函数求取方程的高精度数值解,解的误差可能达到10
-
30
或更高精度,远大于双精度数据结构下的数值解。本书称这类解为准解析解,以区别于方程的解析解与双精度意义下的数值解。
2.4.1 低阶多项式方程的解析求解
一元一次和一元二次方程可以利用solve()函数直接求解,该函数还可以用于含有其他参数的方程求解。不过如果有其他参数的存在,则可能利用现有的solve()函数不易得出三次或四次方程的解析解,尽管这些方程是存在代数解法的,除非给出特别的控制选项,后面将通过例子演示。
solve()函数的调用格式为
式中,待求解的方程由符号表达式eqn
i
表示,自变量由
x
i
表示。返回的解是一个结构体型变量,其解由
S
.
x
i
直接提取。在调用格式中eqn
i
可以是单个的方程也可以是向量、矩阵描述的一组方程,还可以将所有的方程描述成一个向量与矩阵符号表达式eqn
1
,直接求解这些方程。
当然,用下面的调用格式还可以直接获得方程的解。
[
x
1
,
x
2
,
…
,
x
n
]=solve(...),%输入变量表示与前面一致
从函数的调用和使用方面看,这种直接返回变量的调用格式比返回结构体变量的格式更实用,所以本书尽量使用这样的格式。
例2-22
试重新求解例2-2中的鸡兔同笼问题。
解
声明符号变量,并将方程用符号表达式表示出来,则可以调用solve()函数直接求解给定的方程。注意,方程中的等号应该由双等号表示。
得出方程的解为
x
1
=23,
x
2
=12。返回变量的名字还可以选择为其他的变量,此外,如果方程右边为零,则可以省略等号。例如,上面的求解语句还可以修改成
>> syms x1 x2; [x0,y0]=solve(x1+x2-35,2*x1+4*x2-94)
例2-23
中国唐代数学家王孝通所著《缉古算经》中有一道应用题,翻译成现代数学符号可以写出下面的三次方程,试求解该方程。
解
利用符号运算方法可以直接求解这个三次方程。
得出方程的三个解如下。王孝通只得到了31这个解,由于它为整数,是原应用题的解,其他两个是负数,不是应用题的解。