使用scipy.optimize非线性求解器时出错

时间:2014-05-15 21:18:28

标签: python-2.7 numpy scipy nonlinear-functions

我正在尝试用M个变量解决一组M个同时的eqns。我输入一个M X 2矩阵作为我的函数的初始猜测,它返回一个M X 2矩阵,如果我的猜测正确,每个条目将等于零。因此,我的函数可以表示为f_k(u1,u2,...uN) = 0 k=1,2,...N。下面是我的函数的代码,(为了简单起见,我遗漏了使用此代码的模块,例如p。或phi。我更想知道是否有其他人之前有过这个错误)

    M = len(p.x_lat)

def main(u_A):

    ## unpack u_A

    u_P = u_total[:,0]
    u_W = u_total[:,1]

    ## calculate phi_A for all monomeric species

    G_W = exp(-u_W)

    phi_W = zeros(M)
    phi_W[1:] = p.phi_Wb * G_W[1:]

    ## calculate phi_A for all polymeric species

    G_P = exp(-u_P)
    G_P[0] = 0.
    G_fwd = phi.fwd_propagator(G_P,p.Np,0)  #(function that takes G_P and propagates outward)
    G_bkwd = phi.bkwd_propagator(G_P,p.Np,0) #(function that takes G_P and propagates inward)

    phi_P = phi.phi_P(G_fwd,G_bkwd,p.norm_graft_density,p.Np)  #(function that takes the two   propagators and combines them to calculate a segment density at each point)

    ## calculate u_A components

    u_intW = en.u_int_AB(p.chi_PW,phi_P,p.phi_Pb) + en.u_int_AB(p.chi_SW,p.phi_S,p.phi_Sb) #(fxn that calculates new potential from the new segment densities)
    u_intW[0] = 0.
    u_Wprime = u_W - u_intW

    u_intP = en.u_int_AB(p.chi_PW,phi_W,p.phi_Wb) + en.u_int_AB(p.chi_PS,p.phi_S,p.phi_Sb) #(fxn that calculates new potential from the new segment densities)
    u_intP[0] = 0.
    u_Pprime = u_P - u_intP

    ## calculate f_A

    phi_total = p.phi_S + phi_W + phi_P
    u_prime = 0.5 * (u_Wprime + u_Pprime)

    f_total = zeros( (M, 2) )
    f_total[:,0] = 1. - 1./phi_total + u_prime - u_Wprime
    f_total[:,1] = 1. - 1./phi_total + u_prime - u_Pprime

    return f_total

我研究了使用python解决非线性方程的方法。我遇到了scipy.optimize library,其中有几个解算器选项http://docs.scipy.org/doc/scipy-0.13.0/reference/optimize.nonlin.html。我首先尝试使用newton_krylov解算器并收到以下错误消息:

  

ValueError: Jacobian inversion yielded zero vector. This indicates a bug in the Jacobian approximation.

我也试过broyden1求解器,它从未收敛但只是停滞不前。以下两者的实施准则:

    sol = newton_krylov(main, guess, verbose=1, f_tol=10e-7)  
    sol = broyden1(main, guess, verbose=1, f_tol=10e-7)  

我的初步猜测如下:

   ## first guess of u_A(x)

    u_P = zeros(M)
    u_P[1] = -0.0001  
    u_P[M-1] = 0.0001

    u_W = zeros(M)
    u_W[1] = 0.0001
    u_W[M-1] = -0.0001

    u_total = zeros( (M,2) )
    u_total[:,0] = u_P
    u_total[:,1] = u_W
    guess = u_total

任何帮助将不胜感激!

0 个答案:

没有答案