gpt4 book ai didi

python-3.x - 如何将 log(a-x) 类型的函数与 scipy.曲线拟合?

转载 作者:行者123 更新时间:2023-12-03 16:41:34 27 4
gpt4 key购买 nike

我正在尝试拟合一个看起来像 log(y)=a*log(b-x)+c 的函数,其中 abc是需要拟合的参数。相关的代码是

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

TEnergy 是生成的一些数据(我用它来绘制其他东西,所以数据应该没问题)。 T 介于 0.3 和 3.2 之间。我很确定问题在于存在 b=T 的点,因为我不断收到错误 ValueError: Residuals are not finite in the initial point。但我不确定如何解决这个问题。

最佳答案

您可能会发现 lmfit 包 ( http://lmfit.github.io/lmfit-py/ ) 对此类问题很有用。与 scipy.optimize 包或 curve_fit() 函数相比,这提供了一种更高层次的曲线拟合问题方法以及更好的参数和模型抽象。

对于这里的问题,lmfit的两个重要特性是

  1. 设置变量界限的能力。 curve_fit() 也可以做到这一点,但只能通过使用最小/最大边界的有序列表来实现。对于 lmfit,边界属于参数对象。
  2. 有一种方法可以显式设置处理 NaN 值的策略,这肯定会给您的适应性带来问题。

使用 lmfit,您的脚本将大致编写为

import numpy as np
import matplotlib.pyplot as plt
from lmfit import Model

def logfunc(T, a, b, c):
return (a*np.log(b-T))+c

log_model = Model(logfunc, nan_policy='raise') # raise error on NaNs
params = log_model.make_params(a=0.5, b=2.0, c=0.5) # initial values
params['b'].min = 1.8 # set min/max values
params['b'].max = 2.6
params['c'].min = 0.1 # and so forth

result = log_model.fit(np.log(Energy), params, T=T)

print(result.fit_report())

plt.plot(T, Energy, 'bo', label='data')
plt.plot(T, np.exp(result.best_fit), 'r--', label='fit')
plt.legend()
plt.xlabel('T')
plt.ylabel('Energy')
plt.gca().set_yscale('log', basey=10)
plt.show()

这比您的起始脚本稍微冗长一些,因为它提供了带标签的图,并且因为使用参数对象而不是标量提供了更大的灵 active 和清晰度。

根据您的需要,您可以考虑将 nan_policy 设置为“省略”,这将在出现 NaN 时忽略它们——这绝不是一个好主意,但有时有助于您开始查找位置 log(b-T) 有效。你也可以改变你的模型函数来做类似的事情

def logfunc(T, a, b, c):
arg = b - T
arg[np.where(arg < 1.e-16)] = 1.e-16
return a*np.log(arg) + c

明确防止 NaN 的一个明显原因。

关于python-3.x - 如何将 log(a-x) 类型的函数与 scipy.曲线拟合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47265395/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com