以下概述了用户可能希望对代码进行的特定修改。
fmin
和fzero
实现,这些函数通过包装器Fline
、dFline
和gradline
进行调用。然而,用户可能有更好的方法在优化过程中进行线搜索,或者出于经济性考虑希望补充fmin
和fzero
的功能。
sg_
算法是可能的,且无需了解太多细节。大多数无约束最小化包含线搜索(y
\rightarrow y
+t*v
)、海森堡应用(H*v
)和内积(v'w
)。为了正确几何化算法,只需将这些组件分别替换为move(Y,V,t)
、dgrad(Y,V)
和ip(Y,V,W)
。
invdgrad_CG
(使用共轭梯度法)和invdgrad_MINRES
(使用MINRES算法)中逆变换协变海森堡的代码。任何能够稳定逆变换黑盒线性算子的矩阵逆变换程序都可以替代这些,且无需对代码进行其他修改。
A*Y
或Y*B
的产品或复杂的矩阵函数(如Jordan示例中的B(Y)
)可以保存在工作区中。计算grad
和dgrad
时的一些项也可以同样保存(事实上,我们当前的实现基本上每次应用协变海森堡时都会重新计算梯度)。
tangent
和dtangent
函数与grad
和dgrad
函数分开,但通常会发现当这些函数内联时,有些项会相互抵消,因此不需要计算。在进行线搜索最小化时,也可以考虑内联move
函数,以便可以重复使用数据,加快函数评估和点更新。
SGParameters
和FParameters
来保存可以放在所有函数参数列表中的数据。用户可能希望修改代码,以便将这些数据作为单独的参数显式传递给每个函数。
invdgrad
,没有预处理步骤。没有预处理的共轭梯度性能可能非常差,而对黑盒线性算子如dgrad
进行预处理是一个非常困难的问题。用户可以尝试为dgrad
找到一个好的预处理方法。