测试问题
[MGH81] 中提出的所有测试问题,都已经在
程序包中编译成 Mathematica 代码. 我们使用一个数据结构,可用 FindMinimum 和 FindRoot 以无缝的方式对问题进行处理,以便于求解与测试. 关于 FindMinimum 和 FindRoot 的问题列表分别储存在
和
中,可以用
和
访问每一个问题.
| $FindMinimumProblems | 适合 FindMinimum 的问题列表 |
| GetFindMinimumProblem[prob] | 在一个 数据结构中,以默认大小和初始值获取问题 prob |
| GetFindMinimumProblem[prob,{n,m}] | 在一个 数据结构中,获取具有 n 个变量的问题 prob,使其有 m 个平方和的形式 |
| GetFindMinimumProblem[prob,size,start] |
| 在一个 数据结构中,使用给定的 size 和初始值 start 获取问题 prob |
| FindMinimumProblem[f,vars,opts,prob,size] |
| 一个包含利用 FindMinimum 求解的极小化问题的数据结构 |
获得 FindMinimum 问题.
| $FindRootProblems | 适合 FindRoot 的问题列表 |
| GetFindRootProblem[prob] | 在一个 数据结构中,使用默认大小和初始值获取问题 prob |
| GetFindRootProblem[prob,n] | 在一个 数据结构中,获取具有 n 个变量(和 n 个方程)的问题 prob |
| GetFindRootProblem[prob,n,start] | 在一个 数据结构中,获取具有大小 n 和初始值 start 的问题 prob |
| FindRootProblem[f,vars,opts,prob,size] |
| 一个包含利用 FindRoot 求解的极小化问题的数据结构 |
获得 FindRoot 问题.
和
都是提供给其他命令所用的传递选项. 它们也接受选项 Variables->vars,用以指明对问题使用什么变量.
| | |
| Variables | X#& | 整数 的函数,用以产生一个 变量问题的变量,或者具有一个长度为 的包含变量的列表的问题的变量 |
指明变量名.
这里是在一个

数据结构中获取Beale问题.
| Out[2]= |  |
这里是在一个

数据结构中获取鲍威尔奇异函数问题.
| Out[3]= |  |
一旦您有一个
或者
对象,除了简单地求解该问题之外,您还可以运行各种各样的测试.
| ProblemSolve[p,opts] | 求解问题 p,产生与 FindMinimum 或者 FindRoot 相同的输出 |
| ProblemStatistics[p,opts] | 求解该问题,给出一个列表 ,其中 sol 是ProblemSolve[p] 的输出,而 evals 是显示所用的步骤数目和计算次数的规则列表 |
| ProblemTime[p,opts] | 求解该问题,给出一个列表 ,其中 sol 是ProblemSolve[p] 的输出,而 time 是求解该问题所花的时间;如果 time 小于一秒,该问题会被多次求解,以获得平均时间 |
| ProblemTest[p,opts] | 求解该问题,给出一个规则列表,包括:从 ProblemStatistics[p] 和 ProblemTime[p] 得到的步骤和计算次数统计以及时间,还有显示与参照解比较所得到的准确度和精确度的规则 |
| FindMinimumPlot[p,opts] | 画出求解一个 p 的步骤和计算点的图 |
| FindRootPlot[p,opts] | 画出求解一个 p 的步骤和计算点的图 |
和
数据对象的操作.
任何前面所述的命令都可以采用选项,这些选项直接传递给 FindMinimum 或者 FindRoot,并且重载这些函数在问题建立时可能已经指定的任何选项.
| Out[4]= |  |
下面的例子与前面的例子做同样的事情,但包括有所要求的步骤和计算的统计.
| Out[5]= |  |
这里使用
FindMinimum 求解Beale问题,并且对几个试验所需的时间求平均以得到解决这个问题所需时间的平均值.
| Out[6]= |  |
这里使用
FindMinimum 求解Beale问题,将结果与参照解比较,并给出了一个显示测试结果的规则列表.
| Out[7]= |  |
给出了对同样的问题两个不同的方法之间轻松比较的办法.
| Out[8]= |  |
由这些函数返回的大多数规则都是不言自明的,但是,有一些规则还是需要一些描述的. 下面是说明这些规则的列表.
| "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" | 在问题求解的过程中发出的消息列表 |
一个非常有用的比较法是看看一系列方法如何影响某一特定问题的. 这是很容易做到的,我们只需要建立一个
对象,并将一个问题测试映射到一个方法列表上.
这里获得 Chebyquad 问题. 下面只显示简略的输出结果,以节省空间.
Out[9]//Short= |
| |  |
下面的表格从准确度和计算时间方面比较各种不同方法.
Out[11]//TableForm= |
| |  |
通过将方法映射引导
或者
中的名称上,我们有可能产生关于一个特定的方法如何影响各种问题的表格.
这里制作一个表格,显示对

中所有问题测试的一些结果. 这可能需要花费几分钟时间.
Out[13]//TableForm= |
| |  |
空间精度显示为
的两个情况都是关于线性问题的,这些问题没有一个孤立的极小值点. 对空间精度相当差的一个情况,有多个极小值点,并且该方法达到一个与参照点不同的极小值. 许多这些函数有多个局部极小值,所以有可能所报告的误差比较大,是因为这个方法到达与参照点不同的极小值.