前提・実現したいこと
Pythonで変数xに合わせてヘルムホルツの自由エネルギーFを求め、温度毎にプロットしようとしています。
Fを求める過程はできたので、それを関数化し、for文で任意範囲でプロットしようとしました。
関数化はできたと思い、手打ちでt=400,500,,,1100を回すと目標のグラフが得られました。
for文で回すと望まないグラフのように0と1を繋ぐ直線が現れました。この直線を除きたいです。
発生している問題・エラーメッセージ
for文を使うと直線が現れてしまう。
該当のソースコード
Python
1import math 2import matplotlib.pyplot as plt 3 4Ua=3.39416e2 #金属Aの凝集エネルギー 5Ub=2.8842e2 #金属Bの凝集エネルギー 6N=6.02e23 #アボガドロ定数 7z=12 #配位数 8k=1.3806e-23 #ボルツマン定数 9 10vaa=6.1e-20 #金属A-A相互作用エネルギー 11vbb=6.0e-20 #金属B-B相互作用エネルギー 12vab=5.7e-20 #金属A-B相互作用エネルギー 13v=vab-((vaa+vbb)/2) 14 15F=0 #自由エネルギーF 16 17x2=[i/100 for i in range(1,100)] #x座標0.01~0.99を0.01刻み 18 19 20#xli=[] 座標x用のリスト 21#free=[] 自由エネルギーF用のリスト 22 23 24 25#Fを求める 26def free_en(t): 27 #U = - Ua*(1-x) -Ub*x - N*z*v*x(1-x) 28 #S = -N*k*( (x*ln(x)) + ((1-x)*ln(1-x)) ) 29 #F = U + S*t 30 x=0 31 x1=1e-11 32 33 #関数の中でxliとfreeを宣言、に変更 34 xli=[] 35 free=[] 36 37 #x=0だとlogが使えないからx1でFを求める 38 F= -(Ua*(1 - x1)) -(Ub*x1) -(N*z*k*x1*(1-x1)) - N*k*t*(x1*math.log(x1)+(1-x1)*math.log(1-x1)) 39 free.append(F) 40 xli.append(x) 41 x+=0.01 42 43 for j in range(0,99):#x=0.01~0.99までのときのFを求める 44 U= - (Ua*(1 - x2[j])) - (Ub*x2[j]) - (N*z*v*x2[j]*(1-x2[j])) 45 S= N*k*((x2[j]*math.log(x2[j]))+(1-x2[j])*math.log(1-x2[j])) 46 F= U + S*t 47 free.append(F) 48 xli.append(x) 49 x+=0.01 50 51 #x=1だと(1-x)でまたlogに0が入るからx1を使う 52 F= -(Ua*(1 - x1)) -(Ub*x1) -(N*z*k*x1*(1-x1)) - N*k*t*(x1*math.log(x1)+(1-x1)*math.log(1-x1)) 53 free.append(F) 54 xli.append(x) 55 56 return xli, free 57 58 59for l in range(400,1200,100): #400~1100でプロットしたい 60 xli, free = free_en(l) 61 #plt.plot(xli,free) 62 plt.plot(xli,free,label="t={}".format(l))#凡例を加えた 63 plt.legend() 64 65 66
試したこと
なにが原因か分からないため試したことがないです。
free_en(400)
plt.plot(xli,free, label="t=400")
plt.legend()
~~↑これを500,600,700,,1100についてやったら目標のグラフができた。~~~~
for l in range(400,1200,100): #400~1100でプロットしたい
xli, free = free_en(l)
plt.plot(xli, free,label="t={}".format(l))
plt.legend()
頂いた回答に凡例を加えた。
補足情報(FW/ツールのバージョンなど)
望まないグラフ
0~1を繋ぐ直線が出てきた。これがいらない。
温度毎に色を変えたいし凡例も入れたいけれどまず直線を消したい。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/02 14:35