scipy.optimize.curve_fit не может соответствовать нелинейной функции - PullRequest
0 голосов
/ 25 сентября 2018

У меня очень нелинейная функция с двумя параметрами, которые не подходит для curve_fit: она подходит для первого, но не меняет второй.

Я также получаю классический

.../.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. Я не могу понять, почему curve_fit не может это сделать ..?Есть идеи ?Я пытался добавить границы как bounds = ([0.5,8], [1.2,12]), но результат тот же.

...