代码之家  ›  专栏  ›  技术社区  ›  Liris

scipy.optimize.curve\u fit曲线拟合无法拟合非线性函数

  •  1
  • Liris  · 技术社区  · 6 年前

    我有一个非常非线性的函数,有两个参数,曲线拟合无法拟合:它拟合第一个参数,但不改变第二个参数。

    我也有古典音乐

    .../.local/lib/python3.6/site-packages/scipy/optimize/minpack.py:794: OptimizeWarning: Covariance of the parameters could not be estimated
    
      category=OptimizeWarning)
    

    以下是我试图适应的功能:

    def tand(x):
        return np.tan(x*np.pi/180.)
    
    def sind(x):
        return np.sin(x*np.pi/180.)
    
    def cosd(x):
        return np.cos(x*np.pi/180.)
    
    def coeffAx(A0, alpha):
        return A0*cosd(alpha)**2.
    
    def coeffBx(B0, alpha):
        return B0*cosd(alpha)**2.
    
    def coeffAy(A0,alpha):
        return (1./2.)*A0*cosd(alpha)*sind(alpha)
    
    def coeffBy(B0,alpha):
        return (1./2.)*B0*cosd(alpha)*sind(alpha)
    
    def Growth_rate(k,alpha,A0,B0,mu,r):
        c = (r**2.-1.)/r**2.
        return (k**2./(1.+(k*cosd(alpha))**2.))*(cosd(alpha)*(coeffBx(B0,alpha) - cosd(alpha)/(mu*r**2.)) + sind(alpha)*(coeffBy(B0,alpha) - sind(alpha)/(mu*r))*c - k*cosd(alpha)*(cosd(alpha)*coeffAx(A0,alpha) + sind(alpha)*coeffAy(A0,alpha)*c))
    
    
    def Get_most_unstable(Sigma,alpha,k):
        SigMax = np.amax(Sigma)
        Coord = np.argwhere(Sigma == SigMax)
        kmax = k[Coord[:,1]]
        amax = alpha[Coord[:,0]]
        return np.array([SigMax, kmax, amax])
    
    def lambda_fit(V, C1, C2):
        A0 = 3.5
        B0 = 2
        mu = tand(35)
        # R = C2 * (V -1) + 1
        k = np.linspace(0., 0.6, 1001)
        alpha = np.array([0])
        K,ALPHA = np.meshgrid(k,alpha)
        kM = []
        for v in V:
            Sigma = Growth_rate(K,ALPHA,A0,B0,mu, C2 * (v - 1) + 1)
            kM.append(Get_most_unstable(Sigma,alpha,k)[1])
        return 2*np.pi*C1/np.array(kM)
    

    以下是数据:

    V = np.array([1.0398639 , 1.13022518, 1.27846   , 1.31943454, 1.3898527 ,1.42114085])
    Lambda_trans = [18.56117382616553, 13.747212426683717, 12.149968490349218, 12.034763392608163, 11.944807729994983, 12.6708866218023]
    

    这就是我得到的:

    p, pconv = curve_fit(lambda_fit, V, Lambda_trans, p0 = [1,10], check_finite = True)
    
    /home/gadal/.local/lib/python3.6/site-packages/scipy/optimize/minpack.py:794: OptimizeWarning: Covariance of the parameters could not be estimated
      category=OptimizeWarning)
    
    >>> p
    array([ 0.69145457, 10.        ])
    >>> pconv
    array([[inf, inf],
    
           [inf, inf]])
    

    如您所见,第一个参数已拟合,但第二个参数未拟合。非常奇怪的是,我可以使用第二个参数的值在9.5到10之间获得非常好的拟合。我不明白为什么曲线拟合不能做到这一点?有什么想法吗?我试着添加边界作为 bounds = ([0.5,8], [1.2,12]) 但结果是一样的。

    0 回复  |  直到 6 年前