我试图解决一组M个同时具有M个变量的eqns . 我输入一个M X 2矩阵作为我的函数的初始猜测,它返回一个M X 2矩阵,如果我的猜测正确,每个条目将等于零 . 因此,对于 k=1,2,...N ,我的函数可以表示为 f_k(u1,u2,...uN) = 0 . 下面是我的函数的代码,(为了简单起见,我遗漏了与这段代码一起使用的模块,例如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 scipy.optimize library . 我首先尝试使用 newton_krylov 解算器并收到以下错误消息:

ValueError:雅可比反演产生零向量 . 这表明雅可比近似中的一个错误 .

我也试过 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

任何帮助将不胜感激!