Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.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 以变量为积分限的非线性最小二乘拟合_Python_Physics_Numeric_Curve Fitting - Fatal编程技术网

Python 以变量为积分限的非线性最小二乘拟合

Python 以变量为积分限的非线性最小二乘拟合,python,physics,numeric,curve-fitting,Python,Physics,Numeric,Curve Fitting,我试图用python制作一些非线性拟合,其中包含一个积分,积分的极限取决于自变量。代码如下: import numpy as np import scipy as sc import matplotlib.pyplot as plt from scipy.optimize import curve_fit from scipy.integrate import quad T,M=np.genfromtxt("zfc.txt", unpack=True, skiprows = 0) #here

我试图用python制作一些非线性拟合,其中包含一个积分,积分的极限取决于自变量。代码如下:

import numpy as np
import scipy as sc
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy.integrate import quad


T,M=np.genfromtxt("zfc.txt", unpack=True, skiprows = 0) #here I load the data to fit
plt.plot(T,M,'o')

def arg_int1(x,sigma,Ebm):
    return (1/(np.sqrt(2*np.pi)*sigma*Ebm))*np.exp(-(np.log(x/float(Ebm))**2)/(2*sigma**2))
def arg_int2(x,sigma,Ebm):
    return (1/(np.sqrt(2*np.pi)*sigma*x))*np.exp(-(np.log(x/float(Ebm))**2)/(2*sigma**2))



def zfc(x,k1,k2,k3):   
    Temp=x*k2*27/float(k2/1.36e-16) 
    #Temp=k2*27/float(k2/1.36e-16) #apparently x can't be fitted with curve_fit if appears as well in the integral limits
    A=sc.integrate.quad(arg_int1,0,Temp,args=(k3,k2))[0]
    B=sc.integrate.quad(arg_int2,Temp,10*k2,args=(k3,k2))[0]
    M=k1*(k2/1.36e-16*A/x+B)
    return M
T_fit=np.linspace(1,301,301)


popt, pcov = curve_fit(zfc,T,M,p0=(0.5,2.802e-13,0.46))

M_fit=np.zeros(301)
M_fit[0]=zfc(100,0.5,2.8e-13,0.46)
for i in range (1,301):    
    M_fit[i-1]=zfc(i,popt[0],popt[1],popt[2])
plt.plot(T_fit,M_fit,'g')
我得到的eror是:

  File "C:\Users\usuario\Anaconda\lib\site-packages\scipy\integrate\quadpack.py", line 329, in _quad
    if (b != Inf and a != -Inf):

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我不明白,因为函数定义得很好。我知道我的问题的解决方案是反馈参数(我已经用mathematica进行了拟合)。我试图寻找Bloch-Gruneisen函数的拟合(自变量也定义了积分极限),但没有找到任何线索。

问题在于
scipy.optimize.curve_-fit
期望
zfc
对数组参数起作用,也就是说,给定一个x值的n数组和三个n数组
k1
k2
k3
值,
zfc(x,k1,k2,k3)
应返回一个包含函数对应值的n数组。但是,这可以通过使用
np.vectorize
为函数创建包装来轻松实现:

zfc_wrapper = np.vectorize(zfc)
popt, pcov = curve_fit(zfc_wrapper,T,M,p0=(0.5,2.802e-13,0.46))
下次如果您能提供一些示例输入数据,那就太好了。我设法用一些任意函数的测试数据运行它,但情况并非总是如此

干杯