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