Почему мой python fsolve дает другой результат, чем Matlab fsolve? - PullRequest
0 голосов
/ 28 июня 2019

Мне нужно решить три нелинейных уравнения.У меня есть аналитическое решение, чтобы сравнить результат с.Я использовал fsolve в Matlab, и он работал отлично.Попытка того же в 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]) ))

Мне бы хотелось, чтобы численное решение для трех приведенных выше уравнений совпадало с аналитическим решением.

...