2016-11-26 4 views
0

Im пытается решить проблему. Мне нужно 60 разных значений, и для каждого значения -let-5 A будут значения 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 результатов. Что мне нужно минимум г на что-то подобное, г в мин приПоиск аргумента, который дает минимум

>>>"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 (очевидно) и минимум г до этого х, но я могу» t найти истинные значения Z и A при этом минимуме. Я попробовал команду argmin(), но это дает мне результат во всех 45 диапазонах. Поэтому я не могу извлечь значение Z. Я ценю всю помощь

+0

Я не совсем уверен, что вы пытаетесь сделать. Есть несколько причин, по которым я смущен. Сначала у вас есть некоторые проблемы с грамматикой, предложения, начинающиеся с, но и. Во-вторых, вы пренебрегли использованием синтаксиса JSON в списке списков и вместо этого использовали вместо него пробелы Z = [[1], [1,2], [1,2,3], [1,2,3,4], [1,2,3,4,5]]. В-третьих, в коде вы используете переменную Zs для обозначения как списка, так и его элементов, что по своей сути запутывает. Пожалуйста, помните, что люди, пытающиеся ответить на эти вопросы, знакомы с вашей проблемой, прежде чем читать вопрос и постарайтесь как можно яснее с вашим кодом и деталями. – kpie

+0

Кроме того, вы не хотите проверять все выходы функций, вы хотите попробовать все входы функций и в своем коде (не так уж и важно для вашего вопроса) дополнительные круглые скобки облегчили бы чтение для меня лично. и у вас может быть проблема с отступлением в отправленном коде ... строка 'minposvec = np.append (minposvec, gvec.argmin())', похоже, слишком впереди с ней. – kpie

+0

Хорошо, спасибо за ваши комментарии. Я не носитель языка, может быть, это может быть оправданием для моего грамматиста. строка, о которой вы говорите, - это то место, где у меня есть проблема. Я пытаюсь найти положение g, поэтому я могу рассчитать аргумент Z, который делает его минимальным. Но поскольку изменение размера Zs с A, индекс минимума g на самом деле не помогает найти значение Z. –

ответ

0

Как насчет замены вашей последней тройки на цикл с этим? (ред)

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)) 
+0

Спасибо, но это не дает результат, который мне нужен. Поскольку все вычисленные значения g меньше, то g_min Он принимает только последний аргумент (который не является «самым» минимумом g) и возвращает одно и то же каждый раз. Я пробовал модифицировать его, используя векторы и добавляя каждый g к ним, а затем найдя среди них минимум. Это работает, но на этот раз я не могу понять, какая комбинация A, Z дала эти минимумы для каждого x's –

+0

. Я не понимаю. Поскольку «g_min» обновляется по мере необходимости, конечно, его окончательное значение является «самым» минимумом всех возвращаемых значений функции 'gibbs'? –

+0

g_min необходим для каждого значения x. Должны быть определенные x и любые соответствующие g_min, в некоторой комбинации A, Z. Тогда мне нужно то, что эти A и Z. Реальная проблема заключается в нахождении A и Zs, при которых g является min. Поскольку размерность Z зависит от A, argmin() приводит меня к путающим результатам. Я не знаю, как найти Z и A, но я думаю, что мне удалось найти минимум g для каждого x. –