微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Python中将Jacobian传递给newton_krylov非线性求解器:第2部分

如何解决在Python中将Jacobian传递给newton_krylov非线性求解器:第2部分

该问题与this older question中的问题相同。我在此处复制粘贴主体:

我想通过在python中使用newton_krylov求解器来求解非线性代数方程组。

定义方程组的函数如下:

def sys(x,param1,param2,param3,param4):
    
    ...
    
    return f

在输入处获得一个向量x,以及三个向量param1param2param3一个数字param4,它们作为参数,并在输出处返回另一个向量f。 我还有一个函数可以给出系统的雅可比行列式。看起来像

def jac(x,param3):
    
    ...
    
    return jacob

函数在输入时使用向量x,以及与sys相同的参数,是param4的一部分,然后返回另一个向量jacob

最后,求解器的调用方式如下

sol=newton_krylov(lambda x:sys(x,param4),guess,method=jac(x,param3))

问题: 我想了解传递外部jac的正确方法是什么。使用实际语法,似乎求解器无法理解x中的method=jac(x,param3)是未知变量的向量。

解决方法

根据您的求解器调用和类似求解器 scipy.optimize.root 中的文档,我会尝试更改

method=jac(x,param1,param2,param3)

method=lambda x: jac(x,param3)

这与您已经为 jac(x,*params) 所做的相同的方式包装 sys,导致可调用的 jac(x) 被传递给 newton_krylov。否则,Python 将尝试评估 jac(x,*params),然后将结果传递给 method(在搜索潜在未定义变量 x 并在可以时引发 NameError 的过程中)没找到)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。