我想把下面的matlab代碼翻譯成python代碼。該代碼計算氘分子的對數狀態的數值,然後繪製結果。當我嘗試將它翻譯爲python時,似乎我陷入了一個嵌套的for循環中,該循環計算出一筆總和。過去幾天我一直在網上搜索,但沒有成功。關於matlab/python轉換的建議
因爲這是一個物理代碼,我會在代碼中提到一些方面。所以首先我們計算分區函數(Z)。之後,有一個計算能量,它是ln(Z)到β的偏導數。由此我們可以計算比熱(大約)作爲能量與溫度的導數。
所以MATLAB代碼如下所示:
epsilon = 0.0038*1.60217662*10^-19;
k = 1.38*10^-23;
T = 1:.1:2000;
beta = 1./(k*T);
%partitionfunction
clear Z Zodd;
for i = 1:length(T)
clear p;
for s = 1:2:31;
a = 2*s+1;
b = s^2+s;
p(s) = 3*a*exp(-b*epsilon*beta(i));
end
Zodd(i) = sum(p);
end
%energy
ln_Zodd = log(Zodd);
for i = 1 : (length(T)-1)
Epara(i) = -(ln_Zodd(i+1)-ln_Zodd(i))/(beta(i+1)-beta(i));
end
%heat capacity
for i = 1 : (length(T)-2)
Cpara(i) = (Epara(i+1)-Epara(i))/(T(i+1)-T(i));
end
%plot
x = k*T/epsilon;
plot(x(1:6000),Cpara(1:6000)/k, 'r');
axis([0 7 0 1.5]);
ylabel('C_v/k');
xlabel('kT/eps');
相應的Python代碼:
import numpy as np
import matplotlib.pyplot as plt
import math
epsilon=0.0038*1.60217662*10**-19
k = 1.38*10**-23
T = np.arange(1,2000,0.1)
beta = 1/(k*T)
#partitionfunction
for i in np.arange(1,len(T)):
for s in np.arange(1,31,2):
p[s] = 3*(2*s+1)*math.exp(-(s**2+s)*epsilon*beta(i))
Zodd[i] = sum(p)
#energy
ln_Zodd = math.log(Zodd)
for i in np.arange(1,(len(T) - 1)):
Epara[i]=- (ln_Zodd(i + 1) - ln_Zodd(i))/(beta(i + 1) - beta(i))
#heat capacity
for i in np.arange(1,(len(T) - 2)):
Cpara[i]=(Epara(i + 1) - Epara(i))/(T(i + 1) - T(i))
#plot
x = k*T/epsilon
plt.plot(x(np.arange(1,6000)),Cpara(np.arange(1,6000))/k,'r')
plt.axis([0, 7, 0, 1.5])
plt.ylabel('C_v/k')
plt.xlabel('kT/eps')
plt.show()
這應該是計算(近似)這個問題,因爲解析表達式的方法最簡單的方法更多地參與。我是Python的新手,所以任何建議或更正,讚賞。
這可能更適合Code Review:http://codereview.stackexchange.com/。這種問題在這裏是無關緊要的。 – rayryeng