我是python的新手,我正在尝试使digamma函数适合我的数据,但是我得到了一个 raise TypeError(“无法从“+repr(x)”创建mpf”) error'TypeError:无法从数组([0.5'})创建mpf,并且有很多0.5
这是我的数据data
import numpy as np
from numpy import exp, loadtxt, pi, sqrt, sinh, log
from lmfit import Minimizer, Parameters, report_fit
from mpmath import digamma
import math
k = 1.38e-23
hcut = 1.0e-34
q = 1.6e-19
B = 7.15
data = loadtxt('Rxx-HLN.csv')
x = data[:, 2]
y1 = data[:, 3]
s = 1/y1
s0 = s[1]
y = s-s0
# define objective function: returns the array to be minimized
def fcn2min(params, x, y):
"""Model a decaying sine wave and subtract data."""
Bs = params['Bs']
Bp = params['Bp']
Be = params['Be']
model = (log(Bp/x)-digamma(0.5+(Bp/x)))+((log((Bs+Be)/x)-digamma(0.5+((Bs+Be)/x))))-((log((1.33*Bs+Bp)/x)-digamma(0.5+((1.33*Bs+Bp)/x))))
return model - y
#
params = Parameters()
params.add('Bs', value=9.1e-31)
params.add('Bp', value=1e-12)
params.add('Be', value=9.1e-31)
# do fit, here with the default leastsq algorithm
minner = Minimizer(fcn2min, params, fcn_args=(x, y))
result = minner.minimize()
# calculate final result
final = y + result.residual
# write error report
report_fit(result)
# try to plot results
try:
import matplotlib.pyplot as plt
plt.plot(x, y, 'bo')
plt.plot(x, final, 'r')
plt.show()
except ImportError:
pass
我认为这与强积金有关
我想你最好还是用
scipy.special.digamma
。mpmath
模块执行任意精度的计算,但是您的代码和lmfit
中的其余计算都使用了双精度计算的numpy/scipy(或者转到C/Fortran代码)。也就是说,拟合算法不会给出比双精度更好的结果另外(可能与您首先选择的
mpmath
有关)scipy
和lmfit
中的双精度拟合算法在处理跨越多个数量级的参数值时效果不佳。也就是说,您可能需要重述您的问题,以便参数值预期在1.e-7到1.e+7的范围内,并放入q
和hcut
等缩放因子。似乎你在做这件事,但你可能需要对此保持警惕相关问题 更多 >
编程相关推荐