passing the Jacobian to newton_krylov nonlinear solver in python

十年热恋 提交于 2020-12-13 04:41:52

问题


I want to solve a nonlinear system of algebraic equations by using newton_krylov solver in python.

The function defining the system of equations looks like:

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

It gets a vector x at the input, together with three vectors param1, param2, param3 and one number param4, that serve as parameters, and it returns another vector f at the output. I have also a function that gives the Jacobian of the system; it looks like

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

This function takes at input a vector x, together with the same parameters as sys a part from param4, and it returns another vector jacob.

Finally the solver is called as following

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

At this point I get an error message at the line dim, =x.shape in the jac function that reads: ValueError: too many values to unpack (expected 1).

I believe that the solver does not understand that x in method=jac(x, param1, param2, param3) is the vector of unknowns variables, but I do not know how to solve this problem.

A big thanks to anyone who might have the answer.


回答1:


The vector x has shape (n,1) where n is the number of values in the vector. Because of this, x.shape returns (n,1), but you are expecting it to return (n,). A solution is to capture the 1, but not store it. i.e.

dim,_ = x.shape


来源:https://stackoverflow.com/questions/64665632/passing-the-jacobian-to-newton-krylov-nonlinear-solver-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!