在Python中将Jacobian传递给newton_krylov非线性求解器

问题描述

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

定义方程组的函数如下:

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

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

def jac(x,param3):
    
    dim,=x.shape  # this is the first line of this function that appears to be problematic
    ...
    
    return jacob

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

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

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

这时,我在dim,=x.shape函数中的行jac上收到一条错误消息,内容为:ValueError:太多的值无法解包(预期为1)。

我相信求解器无法理解x中的method=jac(x,param3)是未知变量的向量,但是我不知道如何解决这个问题。

非常感谢有答案的人。

解决方法

向量parallelFor的形状为x,其中n是向量中值的数量。因此,(n,1)返回x.shape,但是您期望它返回(n,1)。一种解决方案是捕获(n,),但不存储它。即

1