2016-11-26 7 views
0

私は問題を解決しようとしています。私は60の異なった値が必要です、そしてそれぞれの--letのsay-5 Aの値には、Zの値が1からAになります。そして、私は関数gのすべての可能な結果を​​試してみたいと思うし、実際に次のコードでそれを行うことができます。しかし、私が実際に必要とするのは、対応するAZの値です。 x = 1の場合、A = 1,2,3,4,5とZ = 1、 3,4,5 となり、これは45の成果をもたらします。私は必要なのgが、私はすべての値を見つけることができます最小値を与える引数を見つける

>>>"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(明らかに)とそのxにグラムの最小値を書き込むことができますが、私は「できれば分で、何かのようにグラムの最小値でありますその最小値で真のZ値とA値を見つける。私はargmin()コマンドを試しましたが、それは私にすべての45の範囲の結果を与えます。だから私はZの値を抽出することはできません。私はすべての助けをありがとう

+0

私はあなたが何をしようとして、本当にわかりません。私が混乱する理由がいくつかあります。まず、文法上の問題がありますが、やはりとandで始まる文です。次に、リストのリストでJSON構文を使用することを怠り、代わりにスペースを使用することを選択しました.Z = [[1]、[1,2]、[1,2,3]、[1,2,3,4] [1,2,3,4,5]]。 3番目のコードでは、変数Zsを使用してリストとその要素の両方を意味しますが、これは本質的に混乱します。これらの質問にお答えしようとする人は、あなたの問題に精通しておらず、あなたのコードと詳細をできるだけ明確にしようとすることを覚えておいてください。 – kpie

+0

また、すべての関数の出力を試したくなく、すべての関数の入力を試してみたい、コード内に問題がある場合でも、かっこを追加すると個人的に読みやすくなります。あなたが掲示したコードにインデントの問題があるかもしれません...行 'minposvec = np.append(minposvec、gvec.argmin())'の前にマンタブがあるようです。 – kpie

+0

あなたのコメントをありがとう。私はネイティブスピーカーではなく、おそらくそれが私の文法の言い訳になります。あなたが話しているラインは私が問題を抱えている場所です。私はgの位置を見つけようとしているので、最小にするZ引数を計算するかもしれません。しかし、Zの次元が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の最小値を与えたのはわかりません –

+0

私は分かりません。 'g_min'は必要に応じて更新されるので、確かに最終値は' gibbs'関数のすべての返り値の「最小」ですか? –

+0

x値ごとにg_minが必要です。いくつかのA、Zの組み合わせでは、特定のxとそれに対応するg_minが必要です。それから、私はそれらのAとZのものが必要です。 実際の問題は、gが最小であるAとZを見つけることです。 Zの次元はAに依存するので、argmin()は私に混乱する結果をもたらします。私はZとAを見つける方法がわかりませんが、私はすべてのxに対して最小のgを見つけることに成功したと思います。 –

関連する問題