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上发布这个是否正确,或者网络的其他站点是否更适合?“一个问题可能是,
迭代单个
产生一个离散网格…”这正是问题所在。根
期望目标函数是连续的。