我正在使用 basin-hopping 算法来寻找 Lennard-Jones 簇的能量最小值并使用参数来获得最佳结果。但是,我还想绘制每次迭代发生时的最低能量,以便我可以绘制盆地跳跃达到最低能量所需的步骤。我知道 .fun 可用于访问最后一次迭代,但无论如何我可以访问其他迭代中的那些吗?
from scipy.optimize import basinhopping
import numpy as np
import matplotlib.pyplot as plt
def LJ(r):
r6 = r**6
r12 = r6*r6
return 4*(1/r12 - 1/r6)
def total_energy(positions):
"""
Calculate the total energy
input:
positions: 3*N array which represents the atomic positions
output
E: the total energy
"""
E = 0.0
## positions = [1,2,3,1,2,2] for 2 atoms
N_atom = int(len(positions)/3)
pos = positions.reshape(N_atom,3)
for i in range(N_atom - 1):
for j in range(i+1,N_atom):
pos1 = pos[i]
pos2 = pos[j]
dist = np.linalg.norm(pos1-pos2)
E += LJ(dist)
return E
def init_pos(N,L=5):
return L*np.random.random_sample((N*3))
n_atom = 11
# reference min: -32.765970
iter_num = 50
minimizer_dict = dict(method='BFGS')
pos = init_pos(n_atom)
res = basinhopping(total_energy, pos, niter=iter_num, T=5.0, stepsize=5.0, disp=True, minimizer_kwargs = minimizer_dict)
我不知道在此之后要做什么才能在每次迭代后访问最小值