我想用scipy.root解决一个非线性方程组。出于性能原因,我想使用LinearOperator提供系统的雅可比矩阵。但是,我不能让它工作。这里是一个使用罗森布鲁克函数的梯度的最小示例,其中我首先将雅可比(即罗森布鲁克函数的黑森)定义为LinearOperator。
import numpy as np
import scipy.optimize as opt
import scipy.sparse as sp
ndim = 10
def rosen_hess_LO(x):
return sp.linalg.LinearOperator((ndim,ndim) ,matvec = (lambda dx,xl=x : opt.rosen_hess_prod(xl,dx)))
opt_result = opt.root(fun=opt.rosen_der,x0=np.zeros((ndim),float),jac=rosen_hess_LO)
在执行时,我得到以下错误:
TypeError: fsolve: there is a mismatch between the input and output shape of the 'fprime' argument 'rosen_hess_LO'.Shape should be (10, 10) but it is (1,).
这里我漏掉了什么?
发布于 2021-03-09 19:23:30
部分答案:
我能够将我的“精确”雅可比矩阵输入到scipy.optimize.nonlin.nonlin_solve中。这真的很让人头疼。长话短说,我定义了一个继承自scipy.optimize.nonlin.Jacobian的类,其中我定义了"update“和"solve”方法,以便求解器使用我的确切雅可比矩阵。
我希望每个问题的性能结果都会有很大的不同。让我详细介绍我对一个“几乎”强制函数的~10k维临界点求解的经验(即,如果我花时间删除一个4维对称生成器,这个问题将是强制性的),具有许多局部最小值(因此可能有许多许多临界点)。
长话短说,这给出了远离最优的可怕结果,但在较少的优化周期内实现了局部收敛。每个优化周期的成本(对于我手头的个人问题)都比“标准”的krylov lgmres高得多,所以最终甚至接近最优,我真的不能说这是值得的。
老实说,我对scipy.optimize.root的“krylov”方法的雅可比有限差分近似印象非常深刻。
https://stackoverflow.com/questions/66369256
复制相似问题