Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用scipy.integrate.quad和lmfit进行非线性磁模型拟合(带定积分)_Python_Integrate_Quad_Lmfit - Fatal编程技术网

Python 使用scipy.integrate.quad和lmfit进行非线性磁模型拟合(带定积分)

Python 使用scipy.integrate.quad和lmfit进行非线性磁模型拟合(带定积分),python,integrate,quad,lmfit,Python,Integrate,Quad,Lmfit,我想用一个包括朗之万函数和对分布函数[]的磁模型拟合一条具有超顺磁行为的磁滞曲线。为了拟合这个方程,我必须解一个定积分。我试图使用scipy.integrate.quad来实现这个目的和lmfit的特性,但我没有——至少——去模拟一条合理的曲线(见下面的代码)。可用于模拟该方程的一些实际物理参数为:Dm=3.2E-9m,w=0.26,NT=1.7E12,kB=1.38E-23j/K和T=300K。使用该值进行模拟,必须产生超顺磁曲线,如下面链接中所示。我将感谢任何建议,使这个代码的工作,并改善它

我想用一个包括朗之万函数和对分布函数[]的磁模型拟合一条具有超顺磁行为的磁滞曲线。为了拟合这个方程,我必须解一个定积分。我试图使用scipy.integrate.quad来实现这个目的和lmfit的特性,但我没有——至少——去模拟一条合理的曲线(见下面的代码)。可用于模拟该方程的一些实际物理参数为:Dm=3.2E-9m,w=0.26,NT=1.7E12,kB=1.38E-23j/K和T=300K。使用该值进行模拟,必须产生超顺磁曲线,如下面链接中所示。我将感谢任何建议,使这个代码的工作,并改善它

www.dropbox.com/pri/get/superpara.dat?_subject_uid=197016565&w=AADkHqW1w-gE9pQkG0oLoE7tNG1J-rWxN0lcIM9ioXWiLA

from lmfit import minimize, Minimizer, Parameters, Parameter, report_fit
from numpy import loadtxt, vectorize, sqrt, log, log10, inf, exp, pi, tanh
from scipy.integrate import quad
import matplotlib.pyplot as plt

dat = loadtxt('superpara.dat')

u0_H   = dat[:, 0]
dat1 = dat[:, 1]

def PDF(Dmag, u0_H, params):
    v = params.valuesdict()
    pdf = (1/(v['w']*sqrt(2*pi)*Dmag))*exp(-(log(Dmag/v['Dm']))**2 / (2*v['w']**2))
    x = (pi/(6*v['kB']*v['T']))*v['Ms']*(u0_H*1e-4)*Dmag**3
    return (pi/6)*v['Ms']*(Dmag**3)*( (1/tanh(x))-(1/x) )*pdf

def curve(u0_H, params):
    return params['NT']*quad(PDF, 0.0, inf, args=(u0_H, params))[0]

vcurve = vectorize(curve, excluded=set([1]))

def fit_function(params, u0_H, dat1):
    model1 = vcurve(u0_H, params)
    resid1 = dat1 - model1
    return resid1.flatten()

params = Parameters()
params.add('Dm' , value= 3.2e-9  , vary= True)
params.add('w'  , value= 0.26    , vary= True)
params.add('Ms' , value= 0.1     , vary= True)
params.add('T'  , value= 300     , vary= False)
params.add('kB' , value= 1.38e-23, vary= False)
params.add('NT' , value= 1.7e12  , vary= True)

minner = Minimizer(fit_function, params, fcn_args=(u0_H, dat1))
result = minner.minimize()

report_fit(result)

y1_fit = vcurve(u0_H, result.params)
y1_init = vcurve(u0_H, params)

plt.plot(u0_H, dat1, 'k+', u0_H, y1_init, 'b-', u0_H, y1_fit, 'r-')
plt.show()

了解什么不起作用会很有帮助,包括输出和任何错误消息,以及您期望的内容。如果使用合理的参数调用
vcurve()
,是否会得到类似于数据的内容?它不会显示任何错误消息,拟合后初始值也不会更改。这里的输出:Dm:3.2000e-09+/-0(0.00%)(init=3.2e-09)w:0.26000000+/-0(0.00%)(init=0.26)Ms:0.10000000+/-0(0.00%)(init=0.1)T:300(固定)kB:1.38e-23(固定)NT:1.7000e+12+/-0(0.00%)(init=1.7e+12)初始参数具有物理意义,我没有得到类似于我的数据的东西!我已经意识到,当我为Dm、kB和NT给出接近单位的值时,它显示了一个拟合结果,但某些参数的误差非常大。我建议您首先验证调用
curve()
是否按照您的预期工作(提供与数据类似的合理输出),然后验证调用
vcurve()是否正常
按预期工作。只有在
curve()
将输入转换为正确的输出后,才能期望拟合方法能够细化参数值。@MNewville我尝试调用vcurve()(由于使用四元函数后需要矢量化,因此无法调用curve())。它不起作用!这可能与scipy.integrate.quad无法解决此函数有关吗?如果
vcurve()
不起作用,那么将此作为模型进行曲线拟合肯定不起作用。但你知道下一步该去哪里!而且,是的,可能肯定与
integrate.quad
有关。我看不出有什么明显的错误,但是你的函数看起来有点复杂。。。。