磁性材料の解析で非常によく使用されるモデルをシミュレートしようとしています。最初に、このコードを python で書きましたが、結果が得られませんでした。次に、Mathematica を使用して同じシミュレーションを作成することにしました [ 1 ]。少なくとも正常に動作しているように見えます。少なくとも期待どおりの曲線を示していますが、python に変換すると (lmfit パッケージと scipy.integrate.quad を使用)線のみを表示します。Pythonで適切に動作させるには、他に何を考慮する必要がありますか?
ここに私が持っているもの:
from lmfit import minimize, Minimizer, Parameters, Parameter, report_fit
from numpy import loadtxt, vectorize, sqrt, log, inf, exp, pi, tanh, linspace
from scipy.integrate import quad
from scipy.constants import codata
import matplotlib.pyplot as plt
from mpmath import coth
T1 = linspace(1, 300, 100)
def PDF(Dmag, v):
# v = params.valuesdict()
pdf=(1/((Dmag*1e-9)*v['w']*sqrt(2*pi)))*exp(-((log((Dmag*1e-9)/Dmag))**2)/(2*v['w']**2))*1e-9
return pdf
def mZFC(Dmag, args):
T1, params = args
v = params.valuesdict()
V = ((pi/6)*(Dmag*1e-9)**3)
nu = v['v0']*exp(-(V*v['Kv'])/(v['kB']*T1))
dt = v['kB']*T1**2/((V*v['Kv'])*v['vT']);
return (v['B']*(v['Ms']*V)**2/(3*(V*v['Kv'])))*(exp(-nu*dt) + ((V*v['Kv'])/(v['kB']*T1))*(1 - exp(-nu*dt)))*PDF(Dmag, v)
def curveZFC(T1, params):
return params['NT']*quad(mZFC, 0.0, inf, [T1, params])[0]
vcurveZFC = vectorize(curveZFC, excluded=set([1]))
kB = codata.value('Boltzmann constant')
params = Parameters()
params.add('Dm' , value= 3.2e-9 , vary= True)
params.add('w' , value= 0.26 , vary= True)
params.add('Ms' , value= 1350000 , vary= True)
params.add('T' , value= 300 , vary= False)
params.add('kB' , value= kB , vary= False)
params.add('NT' , value= 1.7e12 , vary= True)
#m_ZFC params
params.add('B' , value= 0.0050, vary= False)
params.add('v0' , value= 1e10 , vary= False)
params.add('Kv' , value= 178000 , vary= False)
params.add('vT' , value= 0.05 , vary= False)
y2init = vcurveZFC(T1, params)
plt.plot(T1, y2init, 'r*')
plt.show()
どんな助けでも大歓迎です。ありがとう!