首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在scipy.root中使用LinearOperator作为雅可比矩阵

在scipy.root中使用LinearOperator作为雅可比矩阵
EN

Stack Overflow用户
提问于 2021-02-25 21:17:19
回答 1查看 84关注 0票数 1

我想用scipy.root解决一个非线性方程组。出于性能原因,我想使用LinearOperator提供系统的雅可比矩阵。但是,我不能让它工作。这里是一个使用罗森布鲁克函数的梯度的最小示例,其中我首先将雅可比(即罗森布鲁克函数的黑森)定义为LinearOperator。

代码语言:javascript
运行
复制
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)

在执行时,我得到以下错误:

代码语言:javascript
运行
复制
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,).

这里我漏掉了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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”方法的雅可比有限差分近似印象非常深刻。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66369256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档