我要解决三个非线性方程。我有分析性的解决方案可以与结果进行比较。我在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]) ))
我很希望上面给出的三个方程具有数值解,以便与解析解保持一致。