Python scipy.optimize.curve_fit:无法进行曲线拟合

Python scipy.optimize.curve_fit:无法进行曲线拟合,python,Python,我还是python新手,在曲线拟合方面遇到了问题。下面的程序是我创建的一个更大程序的简化,但它代表了我的问题 问题是我有一个我称之为burger的函数,我不能拟合曲线。这行:y=np.sqrt(y):是个问题。当我移除它时,我可以完美地安装它,但这不是我想要的功能 我如何拟合这个函数y=np.sqrt(y) 所以,这可能不是你得到的最好答案,但是当你等待别人的时候,这里有一些事情需要考虑 首先,由于您是python新手,可能您不知道,或者可能有理由在列表理解中解决这些问题,但我认为您不需要列表理

我还是python新手,在曲线拟合方面遇到了问题。下面的程序是我创建的一个更大程序的简化,但它代表了我的问题

问题是我有一个我称之为burger的函数,我不能拟合曲线。这行:y=np.sqrt(y):是个问题。当我移除它时,我可以完美地安装它,但这不是我想要的功能

我如何拟合这个函数y=np.sqrt(y)


所以,这可能不是你得到的最好答案,但是当你等待别人的时候,这里有一些事情需要考虑

首先,由于您是python新手,可能您不知道,或者可能有理由在列表理解中解决这些问题,但我认为您不需要列表理解。您可以使用numpy数学操作一次处理整个数组。而不是

    y=((((pi/2.)*P*(1.-nu**2.))/(tan(alpha)))* ...
你可以写

    y = ((((np.pi/2.)*P*(1.-nu**2.))/(np.tan(alpha)))* ...
而不是

    [ burger(t, 3., 2., 1., 0.1) for t in xlist] 
你能行

    burger(xlist, 3., 2., 1., 0.1)
当您使用阵列时,这将快得多

第二,只是浏览一下算法中发生的一些事情。它没有在正确的范围内查找您的参数。我在scipy.optimize页面()上查找了它使用的算法,wikipedia说收敛性取决于初始猜测,并且它找到了局部而非全局的极小值(有时代码中的参数为负值,这在某些情况下导致y的sqrt未定义)。如果有一种方法可以给它一个很好的初步猜测,那么它应该是有效的([1,3,3,2]对我有效)。我的命令是:
pa,j=curve_fit(burger,xlist,ylist,[1,3,3,2],maxfev=10000)

第三,我使用您的代码时遇到的第一个错误是,它达到了最大数量的fevals。添加
maxfev=10000
(或更多,如果需要)作为曲线拟合的最后一个参数

看看吧。如果你能给你的大问题一个初步的猜测,那么也许你会让它收敛。否则,也许另一种算法更合适

更新:请参阅本文,以获得有关此功能工作原理的更详细解释,但如果您再给它一个kwg,
diag
,则可以让它工作而无需猜测

使用:

    burger(xlist, 3., 2., 1., 0.1)
    pa,j = curve_fit(burger,xlist,ylist, diag=(1./xlist.mean(), 1./ylist.mean()), maxfev=10000)