MATLAB函数 solve, vpasolve, fsolve, fzero, roots 功能和信息概览
求解函数
多项式型
非多项式型
一维
高维
符号
数值
算法
solve
支持,得到全部符号解
若可符号解则得到根
支持
支持
支持
当无符号解时
符号解方法:利用等式性质得到标准可解函数的方法
基本即模拟人工运算
vpasolve
支持,得到全部数值解
(随机初值)得到一个实根
支持
支持
$\times$
支持
未知
fsolve
由初值得到一个实根
由初值得到一个实根
支持
支持
$\times$
支持
优化方法,即用优化方法求解函数距离零点最近,具体方法为信赖域方法。
包含预处理共轭梯度(PCG)、狗腿(dogleg)算法和Levenberg-Marquardt算法等
fzero
由初值得到一个实根
由初值得到一个实根
支持
$\times$
$\times$
支持
一维解非线性方程方法,二分法、二次反插和割线法的混合运用
roots
支持,得到全部数值解
$\times$
支持
$\times$
$\times$
支持
特征值方法,即将多项式转化友矩阵(companion matrix)
然后使用求矩阵特征值的算法求得所有解(那是另外一个问题了)
也就是说,之前写了几篇关于非线性求解的,如二分法、牛顿法(参见二分法、不动点迭代、牛顿法)、二次反插法(参见插值法),只有一个库函数用了类似的方法。
各函数用法详解
1. (符号/数值)解方程(组)函数 solve
solve 是基本的用于符号解方程的内置函数,返回类型为符号变量矩阵($m\times n$ sym)。当无法符号求解时,抛出警告并输出一个数值解。基本形式为:
solve(eqn, var, Name, Val); % eqn为符号表达式/符号变量/符号表达式的函数句柄, var为未知量; Name为附加要求,Val为其值
可以用solve解一维方程。对于多项式,solve可以返回其所有值。
func1 = @(x)x^3 - 20*x^2 - 25*x + 500; % 创建函数句柄.句柄中的变量不属符号变量,不需要定义!
syms x exp1; % 定义符号变量 x, exp1;
exp1 = x^3 - 20*x^2 - 25*x + 500; % 符号表达式,包含符号变量. 符号变量必须先有上一行定义!
solve(exp1 == 0, x) % 命令行输入a,传入一个包含符号表达式的等式,x为所要求的变量
solve(exp1, x) % 命令行输入b,传入一个符号表达式,函数默认求其零点
solve(func1(x), x) % 命令行输入c,传入参数func1(x)等价于传入了符号表达式,和输入b完全一样
solve(func1(x) == 0, x) % 命令行输入d,这句话和a完全一样
solve(func1, x) % 命令行输入e,传入参数func1,这是一个函数句柄,函数默认求其零点
ans = % 命令行输出,三个解,为3*1的符号向量。对以上五种输入输出都完全一样
-5
5
20
对于不可符号求解的函数零点/方程解,solve抛出警告并返回一个数值解:
exp1 = atan(x) - x - 1; % 不可符号求零点的表达式
solve(exp1 == 0, x) % 命令行输入
% 命令行输出:
警告: Cannot solve symbolically. Returning a numeric approximation instead.
ans =
-2.132267725272885131625420696936
值得注意的是,虽然称之为“数值解”,并且输出了一个位数非常多的小数,但查看数据类型发现ans的数据类型