非约束问题软件包

绘制搜索数据

功用函数 FindMinimumPlotFindRootPlot 显示 FindMinimumFindRoot 对一维和二维函数进行计算的搜索数据. 它们使用与 FindMinimumFindRoot 基本相同的参数,除此之外它们还有另外的选项,这些选项影响了它们为画图所调用的图形函数,并且它们不具有 FindMinimumFindRoot 所有的 HoldAll 属性.

FindMinimumPlot[f,{x,xst},opts]绘制步骤和在 FindMinimum[f,{x,xst}] 中对函数 f 和它的导数进行计算的点,叠加在 fx 的关系图上;opts 可以包括 FindMinimumPlot 中的选项
FindMinimumPlot[f,{{x,xst},{y,yst}},opts]绘制步骤和在 FindMinimum[f,{{x,xst},{y,yst}}] 中对函数 f 和它的导数进行计算的点,叠加在 f 作为 xy 的函数的等值线图上;opts 可以包括 FindMinimumContourPlot 中的选项
FindRootPlot[f,{x,xst},opts]绘制步骤和在 FindRoot[f,{x,xst}] 中对函数 f 和它的导数进行计算的点,叠加在 fx 的关系图上;opts 可以包括 FindRootPlot 中的选项
FindRootPlot[f,{{x,xst},{y,yst}},opts]绘制步骤和在 FindRoot[f,{{x,xst},{y,yst}}] 中对函数 f 和它的导数进行计算的点,叠加在 f 作为 xy 的函数的等值线图上;opts 可以包括 FindRootContourPlot 中的选项

绘制搜索数据.

请注意,为了简化对函数 f 的处理并减少可能造成的混淆,FindRootPlot 不接受方程;它对于 f=0 求根.

对步骤和计算过程中的点都进行了颜色编码,以便于检测,如下所示:

  • 用蓝线和蓝点显示步骤.
  • 用绿点显示函数计算.
  • 用红点显示梯度计算.
  • 用青色点显示 Hessian 计算.
  • 用黄色的点显示残差函数的计算.
  • 用紫色的点显示雅可比计算.
  • 用大黑点表示搜索终止.

FindMinimumPlotFindRootPlot 使用默认参数 "Plot" 返回步骤图.

FindMinimumPlotFindRootPlot 使用参数 "SolutionData" 返回一个 Association,里面含有键 {Plot,Solution,Statistics},其中:

  • Plot 是显示的图形对象.
  • SolutionFindMinimumFindRoot 的结果.
  • Statistics 是一个规则列表,显示步骤数、函数及其导数的计算.
下面加载软件包:
这里显示在二维空间中 FindMinimum 寻找函数 的一个局部极小值所用的步骤和计算,起始点为 . 我们赋给 ContourPlot 选项,以使得等值线不被显示,同时用灰度图显示函数值. 由于在默认情况下 FindMinimum 使用拟牛顿法,所以只显示了在同样的点所发生的函数计算和梯度计算,由中心为绿色的红色圆圈表示:
这里显示在二维空间中 FindMinimum 用来寻找函数 的局部极小值所用的步骤和计算,起始点为 . 因为该问题是一个平方和的形式,在默认情况下,FindMinimum 使用高斯-牛顿/Levenberg-Marquard 方法,该方法推导出一个残差函数,并只对该函数及其雅可比进行计算. 用黄色圆点显示计算残差函数的点. 被大紫色圆圈包围的黄点表示计算雅可比行列式的点:
这里显示了二维空间中 FindMinimum 用来寻找函数 的一个局部极小值所用的步骤和计算,起始点为 ,所用的是牛顿法. 进行了所有函数、梯度和 Hessian 矩阵计算的点由同心绿色、红色和青色圆圈显示. 请注意,在这个例子中,所有的牛顿步满足 Wolfe 条件,所以不存在与 Hessian 矩阵分开计算函数和梯度的点,但事实并非总是如此. 而且还要注意到,牛顿法找到的是与默认方法不同的局部极小值:
这里显示了 FindMinimum 用来寻找函数 的一个局部极小值所用的步骤和计算,在函数图中,两个起始值互相叠加在一块. 我们赋给 Plot 选项,用粗的紫色曲线表示函数. 因为有两个初始值,FindMinimum 使用的是无导数的主轴法,因此这里只有用绿色圆点显示的函数计算:
这里显示了 FindRoot 用来求函数 的一个根所用的步骤和计算,起始点为 . 如前所述,该函数是一个残差,并且 FindRoot 中的默认方法对残差和它的雅可比行列式进行计算,如图中黄色圆点紫色圆圈所示. 请注意,这个图与对函数 采用默认方法的 FindMinimumPlot 产生的图几乎相同,因为残差是相同的. FindRootPlot 还用红色和绿色显示了残差函数每个组成部分的零等值线:

测试问题

[MGH81] 中提出的所有测试问题,都已经在 Optimization`UnconstrainedProblems` 程序包中编译成 Wolfram 语言代码. 我们使用一个数据结构,可用 FindMinimumFindRoot 以无缝的方式对问题进行处理,以便于求解与测试. 关于 FindMinimumFindRoot 的问题列表分别储存在 $FindMinimumProblems$FindRootProblems 中,可以用 GetFindMinimumProblemGetFindRootProblem 访问每一个问题.

$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 问题.

GetFindMinimumProblemGetFindRootProblem 都是提供给其他命令所用的传递选项. 它们也接受选项 Variables->vars,用以指明对问题使用什么变量.     

选项名
默认值
VariablesX#&整数 的函数,用以产生一个 变量问题的变量,或者具有一个长度为 的包含变量的列表的问题的变量

指定变量名.

下面加载软件包:
获取 FindMinimumProblem 数据结构中的 Beale 问题:
获取 FindMinimumProblem 数据结构中的鲍威尔奇异函数问题:

一旦您有一个 FindMinimumProblem 或者 FindRootProblem 对象,除了简单地求解该问题之外,您还可以运行各种各样的测试.

ProblemSolve[p,opts]求解问题 p,产生与 FindMinimum 或者 FindRoot 相同的输出
ProblemStatistics[p,opts]求解该问题,给出一个列表 {sol,stats},其中 solProblemSolve[p] 的输出,而 evals 是显示所用的步骤数目和计算次数的规则列表
ProblemTime[p,opts]求解该问题,给出一个列表 {sol,Time->time},其中 solProblemSolve[p] 的输出,而 time 是求解该问题所花的时间;如果 time 小于一秒,该问题会被多次求解,以获得平均时间
ProblemTest[p,opts]求解该问题,给出一个规则列表,包括:从 ProblemStatistics[p]ProblemTime[p] 得到的步骤和计算次数统计以及时间,还有显示与参照解比较所得到的准确度和精确度的规则
FindMinimumPlot[p,opts]绘制求解一个 FindMinimumProblem p 的步骤和计算点的图
FindRootPlot[p,opts]绘制求解一个 FindRootProblem p 的步骤和计算点的图

FindMinimumProblemFindRootProblem 数据对象进行操作.

任何前面所述的命令都接受选项,可将这些选项直接传递给 FindMinimum 或者 FindRoot,并且覆盖这些函数在问题建立时可能已经指定的任何选项.

使用 FindRoot 求解鲍威尔奇异函数问题,并给出了根:    
下面的例子与前面的例子做同样的事情,但包括关于所要求的步骤和计算的统计数据:    
使用 FindMinimum 求解 Beale 问题,并且对几个试验所需的时间求平均以得到解决这个问题所需时间的平均值:
使用 FindMinimum 求解 Beale 问题,将结果与参照解比较,并给出了一个显示测试结果的规则列表:

ProblemTest 给出了对同样的问题两个不同的方法之间轻松比较的办法.

FindMinimum 求解 Beale 问题,采用牛顿法,将结果与参照解进行比较,并且给出测试结果的规则列表:

由这些函数返回的大多数规则都是不言自明的,但是,有一些规则还是需要一些描述的. 下面是说明这些规则的列表.

"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 对象,并将一个问题测试映射到一个方法列表上.

获取 Chebyquad 问题. 下面只显示简略的输出结果,以节省空间:
下面给出了可能的方法列表:
下面的表格从准确度和计算时间方面比较各种不同方法:

通过将方法映射到 $FindMinimumProblems 或者 $FindRootProblems 中的名称上,我们有可能产生关于一个特定的方法如何影响各种问题的表格.

建立一个用 FindMinimum 测试一个问题的函数. 除了对 MaxIterations 的较大设置,以使得默认的(Levenberg-Marquardt)方法可以运行到收敛以外,都使用 FindMinimum 的默认设置:
制作一个表格,显示对 $FindMinimumProblems 中所有问题测试的一些结果. 这可能需要花费几分钟时间:

空间精度显示为 ERROR 的两个情况都是关于线性问题的,这些问题没有一个孤立的极小值点. 对空间精度相当差的一个情况,有多个极小值点,并且该方法达到一个与参照点不同的极小值. 许多这些函数有多个局部极小值,所以有可能所报告的误差比较大,是因为这个方法到达与参照点不同的极小值.