为什么我的代码在Mathematica中工作正常但是当转换为python时这不起作用?

时间:2017-06-25 18:54:52

标签: python wolfram-mathematica quad lmfit

我正在尝试模拟一种非常适用于磁性材料分析的模型。最初,我在python中编写了这段代码但没有获得结果;然后,我决定使用Mathematica进行相同的模拟[1]并且它似乎正常工作,至少它显示了类似于预期的曲线,但是当它被转换为python时(使用lmfit包和scipy)。 integrate.quad)它只显示一行。我还应该考虑使其在python中正常工作?

Mathematica code

我在这里:

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()

任何帮助将不胜感激。谢谢!

0 个答案:

没有答案