【问题标题】:scipy.optimize.curve_fit : Not able to do a curve fittingscipy.optimize.curve_fit :无法进行曲线拟合
【发布时间】:2014-01-02 13:21:29
【问题描述】:

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

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

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

# -*- coding: utf-8 -*-
"""
Created on Wed Dec 11 22:14:54 2013

@author: 
"""
import numpy as np
import matplotlib.pyplot as plt
import pdb
import scipy.optimize as optimization
from math import *
from scipy.optimize import curve_fit

import math
import moyenne

####################Function Burger###############################

def burger(t, E1, E2, N,tau):
    nu=0.4 #Coefficient de Poisson
    P=50 #Peak force
    alpha=70.3 #Tip angle
    y=((((pi/2.)*P*(1.-nu**2.))/(tan(alpha)))*(1./E1 + 1./E2*(1.-np.exp(-t/tau)) + 1./((N)*(1.-nu))*t))
    y=np.sqrt(y)
    return y

#######exemple d'utilisation##########   
xlist=np.linspace(0,1,100) 
ylist=[ burger(t,3, 2,1,0.1) for t in xlist] 

#pdb.set_trace()
pa,j = curve_fit(burger,xlist,ylist)

yfit=[burger(x,*pa) for x in xlist]

plt.figure()
plt.plot(xlist,ylist,marker='o')
plt.plot(xlist,yfit)
plt.show()

【问题讨论】:

    标签: python


    【解决方案1】:

    因此,这可能不是您得到的最佳答案,但在您等待其他人时,这里有一些事情要考虑。

    首先,由于您是 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 页面 (here) 上查找了它使用的算法,维基百科说收敛取决于最初的猜测,并且它找到了局部的,而不是全局的最小值(有时你的代码会达到负值对于在某些情况下使 y 的 sqrt 未定义的参数)。如果有一种方法可以给它一个很好的初步猜测,那么它应该可以工作([1., 3., 3., 2] 对我有用)。我解决它的命令是:pa,j = curve_fit(burger,xlist,ylist, [1., 3., 3., 2], maxfev=10000))。

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

    检查一下。如果您可以对更大的问题进行初步猜测,那么也许您会使其收敛。否则,也许不同的算法会更合适?

    更新:请参阅此question 以更详细地解释其工作原理,但如果您再给它一个 kwg diag,您就可以毫无疑问地让它工作。

    用途:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 2021-11-14
      相关资源
      最近更新 更多