为什么我的python fsolve与Matlab的fsolve给出不同的结果?

时间:2019-06-28 12:47:28

标签: python nonlinear-optimization

我要解决三个非线性方程。我有分析性的解决方案可以与结果进行比较。我在Matlab中使用过fsolve,它运行良好。在python中尝试相同不会给我相同的结果。

我已经仔细输入了三个方程并检查了错误,但是我确信它们是正确的。

代码的第一位定义了所使用的参数:

# Define parameters
k = 1
l = 1
n = 1
m = 0.1
c = 10
e = -0.5

# Define numerics variables
N = 250 # number of points in counting field
pi = np.pi

# Initial guess based on steady state solution
frac = (c*k*l*(n-m))/((k+l)*(k*l + c**2))
zGuess_ss = np.array([frac, n+0.5-(c/k)*frac, m+0.5 + (c/l)*frac])

# Define variables
chi_p = np.linspace(-2*pi, 2*pi, N) # Photon Counting Field
f = np.zeros(N,dtype=complex)
g = np.zeros(N,dtype=complex)
E = np.zeros(N,dtype=complex)
A = np.zeros(N,dtype=complex)
Cumul_numeric = np.zeros(N,dtype=complex)
Cumul_analytic = np.zeros(N,dtype=complex)

第二个代码显示了实际过程。

# Define function that contains set of equations
def photonCounting(v,*param):
    x = v[0]
    y = v[1]
    z = v[2]

    k,l,n,m,c,A,E = param

    F = np.zeros(3)
    F[0] = np.real(-c*x - k*y*(E-A) - k*y + k*(n+0.5) + k*(E+A)*(0.25+y**2));
    F[1] = np.real(c*x - l*z + l*(m+0.5) + k*(E+A)*x**2);
    F[2] = np.real(0.5*c*(y-z) - 0.5*(l + k + (E-A)*k)*x + k*y*x*(E+A));

    return F
# Find root for range of counting fields
for i in range(N):
    E[i] = (np.exp(-1j*chi_p[i]) - 1) * (n + 1)
    A[i] = (np.exp(1j*chi_p[i]) - 1) * n


    # Numerics solution
    zGuess = np.array([0.2,0.2,0.2])
    param = (k,l,n,m,c,A[i],E[i])
    Z = root(photonCounting,zGuess_ss,args=param) # Z[x,y,z]
    #Cumul_numeric[i] = (k * Z[1] * (A[i] + E[i]) - 0.5 * k * (E[i] - A[i]))
    Cumul_numeric[i] = (k * Z.x[1] * (A[i] + E[i]) - 0.5 * k * (E[i] - A[i]))


    # Analytic solution
    Cumul_analytic[i] = 0.5*(k+l) - 0.5*cm.sqrt(k**2 + l**2 - 2*c**2 + 2*cm.sqrt((c**2+k*l)**2-4*c**2*k*l*(m*E[i]+(m+1)*A[i]) ))

我很希望上面给出的三个方程具有数值解,以便与解析解保持一致。

0 个答案:

没有答案