找到给出最小

时间:2016-11-26 22:30:00

标签: python numpy minimum

我试图解决问题。我需要60个不同的值,对于每个-let的5个A值,从{1}到Z将有A个值。我想尝试函数g的所有可能结果,我实际上可以使用以下代码执行此操作。但我真正需要的还有相应的AZ值。 所以,让我们说,对于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值。我感谢所有的帮助

1 个答案:

答案 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))