【发布时间】:2018-04-26 04:45:22
【问题描述】:
我正在尝试拟合一个看起来像log(y)=a*log(b-x)+c 的函数,其中a、b 和c 是需要拟合的参数。相关的代码是
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit
def logfunc(T, a, b, c):
v=(a*np.log(b-T))+c
return v
popt, pcov=curve_fit(logfunc, T, np.log(Energy), check_finite=False, bounds=([0.1, 1.8, 0.1], [1.0, 2.6, 1.0]))
plt.plot(T, logfunc(T, *popt))
plt.show
T 和 Energy 是生成的一些数据(我用它来绘制其他东西,所以数据应该没问题)。 T 介于 0.3 和 3.2 之间。我很确定问题在于b=T 存在一个点,因为我不断收到错误ValueError: Residuals are not finite in the initial point。但我不知道如何解决这个问题。
【问题讨论】:
-
永远不要仅仅假设数据是好的。即使在另一个地方没问题,也可能会导致这里出现问题。最好直接在示例中创建人工数据。这使得其他人可以验证问题(此外,找出导致问题的特定数据组合可能会引导您找到实际的解决方案)。
-
注意事项:如果
T介于0.3 和3.2 之间,如果b介于1.8 和2.8 之间,您认为log(b-T)的结果是什么? (此外,我不确定初始值是否全为 1,无论边界如何。) -
@kazemakase 这很重要。无论如何,设置
p0可能是个好主意。此外,如果min(b) < max(T)会遇到问题。所以应该检查一下。最后一个问题:为什么不拟合指数版本呢?这样可以避免log( negativNumber )问题。 -
@kazemakase 感谢您的意见。我对在这里发布问题有点陌生,所以我不太熟悉礼仪,所以我会记住你所说的关于数据的内容。
-
@IlinKaragjozov 这部分是礼仪,但主要是为了您自己的利益。你越容易让别人重现和解决你的问题,你就越有可能得到答案。如果可以简单地复制、粘贴和运行代码,人们就更有可能详细研究问题。
标签: python-3.x numpy scipy curve-fitting