Python 如何调试scipy.optimize.root()

Python 如何调试scipy.optimize.root(),python,debugging,optimization,scipy,Python,Debugging,Optimization,Scipy,我尝试解决以下环境: 给定价格p=(p1,p2),状态变量向量z,求解最优(“个体”)决策F(p,z)(在离散网格上),该向量包含F1,F2 给定一个常数f=(f1,f2),找到根(“超额需求”)f(p,z)=f 因此,我解决这个问题的方法是[(Param,Grid)只包含参数等]: def iterateIndividual (Prices, Param, Grid): returns F1, F2 def computeRoots (Prices, states, Param,

我尝试解决以下环境:

  • 给定价格
    p=(p1,p2)
    ,状态变量向量
    z
    ,求解最优(“个体”)决策
    F(p,z)
    (在离散网格上),该向量包含
    F1,F2
  • 给定一个常数f=(f1,f2),找到根(“超额需求”)
    f(p,z)=f
因此,我解决这个问题的方法是[(
Param
Grid
)只包含参数等]:

def iterateIndividual (Prices, Param, Grid):
    returns F1, F2

def computeRoots (Prices, states, Param, Grid):
    F1, F2 = iterateIndividual(Prices, Param, Grid)
    excessDemand = np.concatenate( ( (F1 - Grid.A)[..., np.newaxis], (F2 - Grid.M)[..., np.newaxis]), axis=-1)
    return excessDemand

def solveEverything(states, Grid, Param):
    from scipy.optimize import root

    guessA = ones(states.shape)
    guessM = ones(states.shape)
    #zipPrices returns object of shape `(A, B, 2)`, stacking the guesses on the third dimension
    guess = zipPrices(guessA, guessM)
    sol = root(computeExcessDemand, guess, method='krylov', options={'disp':True}, args=[states, Param, Grid])

对于求解
f=f
的每个状态,都应该有一个唯一的对
p
,而且,它应该满足全局收敛的条件。一个问题可能是,
iterateIndividual
生成了一个离散的网格,我没有对其进行插值。但是,
root()
告诉我

ValueError: Jacobian inversion yielded zero vector. This indicates a bug in the Jacobian approximation.
这是不幸的,因为我实际上想使用半牛顿方法(自动近似雅可比矩阵)

使用
broyden1
broyden2
显示解算器从一开始就卡住了:

In[388]: sol = root(computeExcessDemand, guess, method="broyden2", options={'disp':True}, args=[states, Param, Grid])
0:  |F(x)| = 131.909; step 1; tol 0.9
1:  |F(x)| = 159.687; step 1; tol 0.9999
2:  |F(x)| = 159.687; step 1; tol 0.9
3:  |F(x)| = 159.687; step 1; tol 0.9

我如何调试它?

另外:我在stackoverflow上发布这个是否正确,或者网络的其他站点是否更适合?“一个问题可能是,
迭代单个
产生一个离散网格…”这正是问题所在。
期望目标函数是连续的。