Python optimize.root()找不到平滑函数的解决方案

Python optimize.root()找不到平滑函数的解决方案,python,scipy,solver,Python,Scipy,Solver,我希望我的问题可以在没有可运行代码的情况下得到回答,因为创建一个小但运行的版本太复杂了。以下代码是我的项目的一部分: x0 = [0.5, 0.5] solution = optimize.root(solveMe, x0, args=(Param, Result, False), method='broyden1') if solution.status != 1: Result.__dict__ two.plot_some_function(solveMe, np.arang

我希望我的问题可以在没有可运行代码的情况下得到回答,因为创建一个小但运行的版本太复杂了。以下代码是我的项目的一部分:

x0 = [0.5, 0.5]
solution = optimize.root(solveMe, x0, args=(Param, Result, False), method='broyden1')
if solution.status != 1:
    Result.__dict__
    two.plot_some_function(solveMe, np.arange(0.1, 1.5, 0.1), np.arange(0.1, 1.5, 0.1), Param, Result, False)
    raise Exception ('did not converge')
solveMe是一个返回两个残差的向量Fx0的函数。当root不收敛时,我为这两个变量创建一个介于0.1和1.5之间的网格,并在二维网格上为任何xo绘制Fx0的输出。我还检查是否存在两个残差都接近于零的网格点。守则如下:

# for debuggign
def plot_some_function(func, x, y, *args):

    from matplotlib import cm
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D

    X, Y = np.meshgrid(x, y)
    Z0 = np.empty(X.shape)
    Z1 = np.empty(X.shape)

    for idx in np.ndindex(X.shape):
        x, y = X[idx], Y[idx]
        Z0[idx], Z1[idx] = func([x,y], *args)
        if (abs(Z0[idx]) < 0.1) & (abs(Z1[idx]) < 0.1):
            print idx

    for Z in [Z0, Z1]:
        fig, ax = plt.subplots()
        p = ax.pcolor(X, Y, Z, cmap=cm.RdBu, vmin=abs(Z).min(), vmax=abs(Z).max())
        cb = fig.colorbar(p, ax=ax)
    plt.show()
对应于0.2,0.1和0.3,0.2

但为什么根不收敛呢?其产出如下

  status: 2
 success: False
     fun: array([ 0.01725503,  0.25234002])
       x: array([ 0.36981866,  0.4440247 ])
 message: 'The maximum number of iterations allowed has been reached.'
     nit: 300
矩阵网格中的额外微调实际上为我提供了以下坐标:

solveMe([0.165, 0.258], Param, Result, False)
Out[6]: array([ 0.00012388,  0.00105457])

这比解算器发现的要小得多。

您确定存在解算器最大值为0.0、0.0的解算器吗?从你的图中,它看起来不是那样的,但很难判断网格是否相当粗糙。看起来两个分量的值都是正的。是的,图很奇怪,我认为其中一个被镜像了,或者类似的事情发生在轴上。这就是为什么我添加了代码来检查两者都接近0.0的点,我仍然不确定是否至少在理论上存在这样一个点,solveMex应该正好为0,0。你对这个函数真正了解多少?如果您认为SoVeMeX=1E-4,1E-3足够接近0,0被认为是根,那么您应该增加ToL,或者为您使用BROYDEN1的特定解算器设置容差选项,在这种情况下。但可能有一个很大的地区存在这种情况。在这种情况下,解x真的有用吗?我肯定它至少有一个根。不过,我还不能表现出它的独特性。“1e-f”的要点是,我证明了至少有一点是我通过非常粗糙的网格搜索找到的,比解算器找到的要好。根查找器的性能仅与他们最初的猜测一样好。因为返回的消息是已经达到了迭代次数,这意味着您没有特别接近解决方案,或者该函数在该一般区域是病态的。我会仔细看看这个函数——上面的图的z范围是0到360万,函数返回的值小于1。如果函数非常复杂,您无法提供它,那么根附近的行为(如果存在)也可能非常复杂。
solveMe([0.165, 0.258], Param, Result, False)
Out[6]: array([ 0.00012388,  0.00105457])