下边是我的代码
运行时,对变量atoms2进行赋值操作时,会同时修改atoms1的内容
按理说不应该这样的啊,是我写的不对吗
import numpy as np
import random
import math
import scipy.optimize as opt
count = 0
re = 0.1564
u_exp = 3.07
a_f = 1.3
a_ca = 4.4
x = []
writes = []
result = ''
def calc_x2(atoms):
x = 0
y = 0
z = 0
a2d = 2.542
b2a = 0.529177249
for atom in atoms:
x += (atom['site'][0]/b2a )* atom['q']
y += (atom['site'][1]/b2a )* atom['q']
z += (atom['site'][2]/b2a )* atom['q']
x,y,z =x*a2d, y*a2d,z*a2d
u = math.sqrt(x**2+y**2+z**2)
x2 = (u -3.07) ** 2
return x2
def make_atoms(atoms,x0):
#x0 = [q_ca,beta_ca]
q_ca = x0[0]
beta_ca = x0[1]
atoms[4]['q'] = q_ca
atoms[5]['q'] = -(q_ca-2)
atoms[4]['beta'] = beta_ca
atoms[5]['beta'] = beta_ca
return atoms
def cacl_ener(x0,atoms):
k = 1/(4*math.pi*0.08854187818)
v_sum = 0
atoms[1]['site'] = np.array([x0[0],x0[1],x0[2]])
atoms[3]['site'] = np.array([x0[3],x0[4],x0[5]])
atoms[5]['site'] = np.array([x0[6],x0[7],x0[8]])
atom = [0,1,2,3,4,5]
for i in range(0,5):
atom = atom[1:]
bi = atoms[i]['beta']
qi = atoms[i]['q']
for j in atom:
bj = atoms[j]['beta']
qj = atoms[j]['q']
r = np.linalg.norm(atoms[i]['site'] - atoms[j]['site'])
bij = (bi * bj) /(math.sqrt(bi*bi+bj*bj))
erf= math.erf(bij * r)
e_coul = k * qi * qj *erf /r
v_sum += e_coul
r_f_1 = np.linalg.norm(atoms[0]['site'] - atoms[1]['site'])
r_f_2 = np.linalg.norm(atoms[2]['site'] - atoms[3]['site'])
r_ca= np.linalg.norm(atoms[4]['site'] - atoms[5]['site'])
v_pol_f_1 = k * (atoms[1]['q']**2/(2*a_f)) * r_f_1**2
v_pol_f_2 = k * (atoms[3]['q']**2/(2*a_f)) * r_f_2**2
v_pol_ca = k * (atoms[5]['q']**2/(2*a_ca)) * r_ca**2
v_sum = v_sum + v_pol_f_1+ v_pol_ca + v_pol_f_2
return(v_sum)
def p_min(delta_x2,t):
probability = np.exp(-delta_x2/t)
return probability
def deal(atoms1,atoms2,delta_x2,t):
if delta_x2 < 0:
return atoms2
else:
return atoms1
def solve():
atoms1 = atoms
count = 0
skl = 0
t = 1000
t_min = 1
jishu = 0
r = 1000
count_skl_1 = 0
count_skl_2 = 0
while t >= t_min:
jishu += 1
t *= 0.95
t = 1000
x0 =([0, 1, -0.461,0, -1.669, -0.561,0., 0. , 0.355])
with open('x2.txt','w') as f:
f.write('')
while t >= t_min:
for i in range(0,r):
write = {'id':0,'x2':'','atoms':atoms1}
if skl == 1:
count_skl_1 += 1
elif skl == 2:
count_skl_2 += 1
if count % jishu == 0:
count_1 = (count/jishu) /(r/100)
s = str(count) + '|' + str(jishu*100)
print(count_1,':',' 1:',count_skl_1,' 2:',count_skl_2)
count_skl_1 = 0
count_skl_2 = 0
if count == jishu * 100 -1:
print('\n')
count += 1
if count == 1:
result = opt.minimize(cacl_ener,x0,method='L-BFGS-B',args = atoms1)
x0 = (result['x'][0],result['x'][1],result['x'][2],result['x'][3],result['x'][4],result['x'][5],result['x'][6],result['x'][7],result['x'][8])
atoms1[1]['site'] = np.array([result['x'][0],result['x'][1],result['x'][2]])
atoms1[3]['site'] = np.array([result['x'][3],result['x'][4],result['x'][5]])
atoms1[5]['site'] = np.array([result['x'][6],result['x'][7],result['x'][8]])
x2_1 = calc_x2(atoms1)
q_ca = atoms1[4]['q']
beta_ca = atoms1[4]['beta']
delta_q_ca = random.uniform(-0.1,0.1)
if q_ca + delta_q_ca > 20 or q_ca + delta_q_ca < 2:
q_ca = q_ca - delta_q_ca
else:
q_ca = q_ca + delta_q_ca
delta_beta_ca = random.uniform(-0.1,0.1)
if beta_ca + delta_beta_ca >20 or beta_ca + delta_beta_ca < 0:
beta_ca -= delta_beta_ca
else:
beta_ca += delta_beta_ca
delta_atoms = [q_ca,beta_ca]
atoms2 = make_atoms(atoms1,delta_atoms)
result = opt.minimize(cacl_ener,x0,method='L-BFGS-B',args = atoms2)
x0 = (result['x'][0],result['x'][1],result['x'][2],result['x'][3],result['x'][4],result['x'][5],result['x'][6],result['x'][7],result['x'][8])
atoms2[1]['site'] = np.array([result['x'][0],result['x'][1],result['x'][2]])
atoms2[3]['site'] = np.array([result['x'][3],result['x'][4],result['x'][5]])
atoms2[5]['site'] = np.array([result['x'][6],result['x'][7],result['x'][8]])
x2_2 = calc_x2(atoms2)
delta_x2 = x2_2 - x2_1
print(delta_x2)
atoms1 = deal(atoms1,atoms2,delta_x2,t)
if atoms1 == atoms2:
skl = 2
print(skl)
x2_1 = x2_2
else:
skl = 1
write['id'] = count
write['x2'] =x2_1
write['atoms'] = atoms1
writes.append(write)
with open('x2.txt','a') as f:
f.write(str(write) + '\n')
t = t * 0.95
result = atoms1
if __name__ == "__main__":
atoms = [{'beta': 9.139, 'q': 5.590, 'site': np.array([0, 1.869, -0.361])}, \
{'beta': 9.139, 'q': -6.590, 'site': np.array([-0.23324962, 0.16647118, 0.29554485])}, \
{'beta': 9.139, 'q': 5.590, 'site': np.array([0, -1.869, -0.361])}, \
{'beta': 9.139, 'q': -6.590, 'site': np.array([-0.23324962, 0.16647118, 0.29554485])}, \
{'beta': 13.772, 'q': 20, 'site': np.array([0., 0. , 0.325 ])}, \
{'beta': 13.772, 'q': -22, 'site': np.array([0.15000612, 0.0927579 , 0.29707778])}]
count = 0
re = 0.1564
u_exp = 3.07
a_f = 1.3
a_ca = 4.4
x = []
writes = []
result = ''
solve()