Взаимное ограничение для нескольких сеансов подгонки кривой

#python #python-3.x #optimization #scipy #curve-fitting

#python #python-3.x #оптимизация #scipy #подгонка кривой

Вопрос:

У меня есть N последовательности 2D-данных (x,y) , которые я пытаюсь вписать в модель логистической функции y(x)=L/(1 a exp(b*(x-c))) . Однако я хотел бы наложить ограничения a,b,c . Обычно, если я хочу ограничить их значения, я использую параметры из lmfit , и это выполняет свою работу. На этот раз я хотел бы, чтобы отношение a/b было постоянным (с погрешностью 0,01). Есть ли какой-либо способ подгонки всех N последовательностей, чтобы разница между соотношениями a_i/b_i была сведена к минимуму?

Комментарии:

1. просто замените a на b * alpha * ( 1 0.01 * 2 / pi * arctan( delta ) ) where alpha — желаемая константа и delta соответствует допустимой ошибке.

2. Я уже пробовал такую вещь, но компьютер не может alpha так легко ее найти.

3. Ну, проверяет ли одно соответствие здравомыслию a и b предполагает alpha , что в первую очередь это разумно?

4. Пробовал с первыми 3 последовательностями. alpha1=10^-4,alpha2=10^-8,alpha3=5 так что прямо сейчас между ними существует большая разница. @mikuszefski

5. Хм, похоже, тогда модель на самом деле недействительна.

Ответ №1:

Всегда полезно иметь пример кода, который показывает, что вы пытаетесь сделать. Кроме того, неясно, имеете ли вы в виду, что a_i/b_i это должна быть одна и та же константа для всех N наборов данных — давайте предположим, что так и должно быть. В таком случае может быть достаточно определить такие параметры:

 import numpy as np
from lmfit import Parameters, Model

def logistic(x, amp, a, b, c):
    return amp / (1   a*np.exp(b*(x-c)))
 
params = Parameters()
params.add('b2a_scale' value=1, vary=True) # ?
N = 5
model = Model(logistic, prefix='p1_')

for i in range(1, N 1):
    params.add('p%d_amp' % i, value=1, min=0)
    params.add('p%d_c' % i, value=1)
    params.add('p%d_b' % i, value=5)
    params.add('p%d_a' % i, expr='p%d_b * b2a_scale' % i)
    if model > 1:
        model  = Model(logistic, prefix='p%d_' % i)
  

Я не уверен, что это именно то, что вы ищете, но, возможно, это поможет указать правильное направление.