非约束问题软件包
绘制搜索数据
功用函数 FindMinimumPlot 和 FindRootPlot 显示 FindMinimum 和 FindRoot 对一维和二维函数进行计算的搜索数据. 它们使用与 FindMinimum 和 FindRoot 基本相同的参数,除此之外它们还有另外的选项,这些选项影响了它们为画图所调用的图形函数,并且它们不具有 FindMinimum 和 FindRoot 所有的 HoldAll 属性.
FindMinimumPlot[f,{x,xst},opts] | 绘制步骤和在 FindMinimum[f,{x,xst}] 中对函数 f 和它的导数进行计算的点,叠加在 f 与 x 的关系图上;opts 可以包括 FindMinimum 和 Plot 中的选项 |
FindMinimumPlot[f,{{x,xst},{y,yst}},opts] | 绘制步骤和在 FindMinimum[f,{{x,xst},{y,yst}}] 中对函数 f 和它的导数进行计算的点,叠加在 f 作为 x 和 y 的函数的等值线图上;opts 可以包括 FindMinimum 和 ContourPlot 中的选项 |
FindRootPlot[f,{x,xst},opts] | 绘制步骤和在 FindRoot[f,{x,xst}] 中对函数 f 和它的导数进行计算的点,叠加在 f 与 x 的关系图上;opts 可以包括 FindRoot 和 Plot 中的选项 |
FindRootPlot[f,{{x,xst},{y,yst}},opts] | 绘制步骤和在 FindRoot[f,{{x,xst},{y,yst}}] 中对函数 f 和它的导数进行计算的点,叠加在 f 作为 x 和 y 的函数的等值线图上;opts 可以包括 FindRoot 和 ContourPlot 中的选项 |
请注意,为了简化对函数 f 的处理并减少可能造成的混淆,FindRootPlot 不接受方程;它对于 f=0 求根.
对步骤和计算过程中的点都进行了颜色编码,以便于检测,如下所示:
- 用蓝线和蓝点显示步骤.
- 用绿点显示函数计算.
- 用红点显示梯度计算.
- 用青色点显示 Hessian 计算.
- 用黄色的点显示残差函数的计算.
- 用紫色的点显示雅可比计算.
- 用大黑点表示搜索终止.
FindMinimumPlot 和 FindRootPlot 使用默认参数 "Plot" 返回步骤图.
FindMinimumPlot 和 FindRootPlot 使用参数 "SolutionData" 返回一个 Association,里面含有键 {Plot,Solution,Statistics},其中:
- Plot 是显示的图形对象.
- Solution 是 FindMinimum 或 FindRoot 的结果.
- Statistics 是一个规则列表,显示步骤数、函数及其导数的计算.
测试问题
[MGH81] 中提出的所有测试问题,都已经在 Optimization`UnconstrainedProblems` 程序包中编译成 Wolfram 语言代码. 我们使用一个数据结构,可用 FindMinimum 和 FindRoot 以无缝的方式对问题进行处理,以便于求解与测试. 关于 FindMinimum 和 FindRoot 的问题列表分别储存在 $FindMinimumProblems 和 $FindRootProblems 中,可以用 GetFindMinimumProblem 和 GetFindRootProblem 访问每一个问题.
$FindMinimumProblems | 适合 FindMinimum 的问题列表 |
GetFindMinimumProblem[prob] | 在一个 FindMinimumProblem 数据结构中,以默认大小和初始值获取问题 prob |
GetFindMinimumProblem[prob,{n,m}] | 在一个 FindMinimumProblem 数据结构中,获取具有 n 个变量的问题 prob,使其有 m 个平方和的形式 |
GetFindMinimumProblem[prob,size,start] | |
在一个 FindMinimumProblem 数据结构中,使用给定的 size 和初始值 start 获取问题 prob | |
FindMinimumProblem[f,vars,opts,prob,size] | |
一个包含利用 FindMinimum 求解的极小化问题的数据结构 |
获取 FindMinimum 问题.
$FindRootProblems | 适合 FindRoot 的问题列表 |
GetFindRootProblem[prob] | 在一个 FindRootProblem 数据结构中,使用默认大小和初始值获取问题 prob |
GetFindRootProblem[prob,n] | 在一个 FindRootProblem 数据结构中,获取具有 n 个变量(和 n 个方程)的问题 prob |
GetFindRootProblem[prob,n,start] | 在一个 FindRootProblem 数据结构中,获取具有大小 n 和初始值 start 的问题 prob |
FindRootProblem[f,vars,opts,prob,size] | |
一个包含利用 FindRoot 求解的极小化问题的数据结构 |
获取 FindRoot 问题.
GetFindMinimumProblem 和 GetFindRootProblem 都是提供给其他命令所用的传递选项. 它们也接受选项 Variables->vars,用以指明对问题使用什么变量.
选项名
|
默认值
| |
Variables | X#& | 整数 的函数,用以产生一个 变量问题的变量,或者具有一个长度为 的包含变量的列表的问题的变量 |
一旦您有一个 FindMinimumProblem 或者 FindRootProblem 对象,除了简单地求解该问题之外,您还可以运行各种各样的测试.
ProblemSolve[p,opts] | 求解问题 p,产生与 FindMinimum 或者 FindRoot 相同的输出 |
ProblemStatistics[p,opts] | 求解该问题,给出一个列表 {sol,stats},其中 sol 是ProblemSolve[p] 的输出,而 evals 是显示所用的步骤数目和计算次数的规则列表 |
ProblemTime[p,opts] | 求解该问题,给出一个列表 {sol,Time->time},其中 sol 是ProblemSolve[p] 的输出,而 time 是求解该问题所花的时间;如果 time 小于一秒,该问题会被多次求解,以获得平均时间 |
ProblemTest[p,opts] | 求解该问题,给出一个规则列表,包括:从 ProblemStatistics[p] 和 ProblemTime[p] 得到的步骤和计算次数统计以及时间,还有显示与参照解比较所得到的准确度和精确度的规则 |
FindMinimumPlot[p,opts] | 绘制求解一个 FindMinimumProblem p 的步骤和计算点的图 |
FindRootPlot[p,opts] | 绘制求解一个 FindRootProblem p 的步骤和计算点的图 |
对 FindMinimumProblem 和 FindRootProblem 数据对象进行操作.
任何前面所述的命令都接受选项,可将这些选项直接传递给 FindMinimum 或者 FindRoot,并且覆盖这些函数在问题建立时可能已经指定的任何选项.
ProblemTest 给出了对同样的问题两个不同的方法之间轻松比较的办法.
由这些函数返回的大多数规则都是不言自明的,但是,有一些规则还是需要一些描述的. 下面是说明这些规则的列表.
"FunctionAccuracy" | 函数值的准确度 -Log[10,error in f] |
"FunctionPrecision" | 函数值的精确度 -Log[10,relative error in f] |
"SpatialAccuracy" | 极小值点或者根的位置的准确度 -Log[10,error in x] |
"SpatialPrecision" | 极小值点或者根的位置的精确度 -Log[10,relative error in x] |
"Messages" | 在问题求解的过程中发出的消息列表 |
一个非常有用的比较法是看看一系列方法如何影响某一特定问题的. 这是很容易做到的,我们只需要建立一个 FindMinimumProblem 对象,并将一个问题测试映射到一个方法列表上.
通过将方法映射到 $FindMinimumProblems 或者 $FindRootProblems 中的名称上,我们有可能产生关于一个特定的方法如何影响各种问题的表格.
空间精度显示为 ERROR 的两个情况都是关于线性问题的,这些问题没有一个孤立的极小值点. 对空间精度相当差的一个情况,有多个极小值点,并且该方法达到一个与参照点不同的极小值. 许多这些函数有多个局部极小值,所以有可能所报告的误差比较大,是因为这个方法到达与参照点不同的极小值.