我试图解决问题。我需要60个不同的值,对于每个-let的5个A
值,从{1}到Z
将有A
个值。我想尝试函数g
的所有可能结果,我实际上可以使用以下代码执行此操作。但我真正需要的还有相应的A
和Z
值。
所以,让我们说,对于x = 1,我有A = 1,2,3,4,5和Z = 1,1,2,1,2,3,1,2,3,4,1 ,2,3,4,5
这使得45个结果。我需要的是最小的g,比如g,min是
>>>"The x , A , and Z values that makes g min are:"
>>>[0.0001 , 3.0, 2.0, 0.015006343],
[0.01263, 9.0, 7.0, 0.01609543],
..... and so on, 60 rows in total.
from __future__ import division
import numpy as np
import math
#*************constants************
b1 = 0.9917949
b2 = 0.01911
b3 = 0.000840
b4 = 0.10175
b5 = 0.000763
mu = 1.66057*10**(-24) #gram
c = 3.0*10**10 #cm/sec
me=9.1093897e-28 #gram
e=4.80320425e-10 #statcoulumbs
h = 6.62607004e-27
hbar=h/(2.0*math.pi)
lambd=hbar/(me*c)
Xvec=np.logspace(-3,3,60)
Zvec=np.zeros(0,'float')
minpos=np.zeros(0,'int')
gvec=np.zeros(0,'float')
minofgvec=np.zeros(0,'float')
minposvec=np.zeros(0,'float')
def gibbs(Zs,A,x):
efe=me*c**2*(x**2+1)**0.5
El=(4./3)*Zs*(-1.444)*Zs**(2./3)*e**2*x*(3*math.pi**2)**(-1./3)*lambd**(-1./3)
SEMF = mu*c**2 * (b1*A + b2*A**(2./3) - b3*Zs + b4*A*((1./2) - (Zs/A))**2 + (b5*Zs**2)/(A**(1./3)))
g=(SEMF+Zs*efe+(4./3)*Zs*El)/A
return g
for x in (1,2,3): #was -in Xvec, for simplicity I tried 1,2,3
for A in range(1,6):
for Zs in np.arange(1, A+1 , 1 , dtype=float)
g=gibbs(Zs,A,x)
gvec=np.append(gvec,g)
#minposvec=np.append(minposvec,gvec.argmin())
#minofgvec=np.append(minofgvec,min(gvec))
#minpos=np.append(minpos,minposvec.argmin())
#Zvec=np.append(Zvec,(1+minposvec))
我可以找到所有值,我可以将Xvec(显然)和g的最小值写入x,但我无法找到最小的真实Z和A值。我尝试了argmin()
命令,但它给了我全部45个范围的结果。所以我无法提取Z值。我感谢所有的帮助
答案 0 :(得分:0)
用这个替换你的上一个三重for循环怎么样? (的被修改强>)
results = {}
for x in (1,2,3):
A_min = Z_min = 0
g_min = np.inf
for A in range(1,6):
for Z in np.arange(1, A+1 , 1, dtype=float):
g = gibbs(Z, A, x)
if g < g_min:
A_min, Z_min, g_min = A, Z, g
# Collect results
results[x] = {'g': g_min, 'A': A_min, 'Z': Z_min}
# Print out results
for x, values in results.items():
g = values['g']
A = values['A']
Z = values['Z']
print('For x = {}, the lowest g is {}, with A = {}, Z = {}'.format(x, g, A, Z))