Python 如何使用数据的Scipy曲线拟合获得对数函数拟合

Python 如何使用数据的Scipy曲线拟合获得对数函数拟合,python,scipy,curve-fitting,Python,Scipy,Curve Fitting,我正在尝试获得适用于以下数据的*log(b/x)^c类型(简化为10个数据点) 我尝试过其他一些问题中描述的方法,但解决方案永远不会收敛。我猜我的初始条件很差。我能够得到另一个指数函数,但应用程序需要给定形式的对数拟合。随附适用的配合数据以供参考 import numpy as np from scipy.optimize import curve_fit x=[0, 0.89790454, 1.79580908, 2.69371362, 3.59161816, 4.48952269, 5.

我正在尝试获得适用于以下数据的*log(b/x)^c类型(简化为10个数据点)

我尝试过其他一些问题中描述的方法,但解决方案永远不会收敛。我猜我的初始条件很差。我能够得到另一个指数函数,但应用程序需要给定形式的对数拟合。随附适用的配合数据以供参考

import numpy as np
from scipy.optimize import curve_fit


x=[0, 0.89790454, 1.79580908, 2.69371362, 3.59161816, 4.48952269, 5.38742723, 6.28533177, 7.18323631, 8.08114085]
y=[0.39599324, 0.10255828, 0.07094521, 0.05500624, 0.04636146, 0.04585985,  0.0398909,  0.03340628, 0.03041699, 0.02498938]
x = np.array(x,dtype=float) 
y = np.array(y,dtype=float)


def func(x, a, b, c):
    #return a*np.exp(-c*(x*b))+d

    return a*(np.log(b/x)**c)

popt, pcov = curve_fit(func, x, y, p0=[.5,.5,1],maxfev=10000)

print(popt)

a,b ,c = np.asarray(popt)

将您的功能替换为

定义函数(x,a,b,c): #返回a*np.exp(-c*(x*b))+d t1=np.log(b/x) t2=a*t1**c 打印(a、b、c、t1、t2) 返回t;
Yow将很快看到
t1=np。log(b/x)
可能为负值(每当bnan结果。

我的拟合软件没有问题(结果如下)

通常,使用回归迭代法进行非线性拟合困难的一个原因是设置参数的初始值以开始迭代过程


什么是
a*(np.log(b/x)**c)
对于
x=0
来说应该是什么意思?好吧,这一点很好。那么呢?老实说,我不能得到任何适合的日志,这可能是一个非常无知的问题,但在自然日志方面,它的等效函数是什么?很明显,我不是一个数学爱好者,总是把这些搞混。我想要一个基于自然对数的拟合是因为理论推导是这样说的,而我的数据是实验性的。如果你不介意我问的话,那是哪个软件?用符号ln=自然对数和log=对数基数10,关系是ln(y)=ln(10)*log(y)。因此,上述拟合方程变为ln(y)=ln(a)-b*x**c。或者如果您更喜欢Log(y)=(ln(a)-b*x**c)/ln(10)=Log(a)-b*x**c/ln(10)。或者Log(y)=Log(a)-Log(e)*b*x**cMy软件是基于非常规方法自制的:。