#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 ) )
wherealpha
— желаемая константа иdelta
соответствует допустимой ошибке.2. Я уже пробовал такую вещь, но компьютер не может
alpha
так легко ее найти.3. Ну, проверяет ли одно соответствие здравомыслию
a
иb
предполагаетalpha
, что в первую очередь это разумно?4. Пробовал с первыми 3 последовательностями.
alpha1=10^-4,alpha2=10^-8,alpha3=5
так что прямо сейчас между ними существует большая разница. @mikuszefski5. Хм, похоже, тогда модель на самом деле недействительна.
Ответ №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)
Я не уверен, что это именно то, что вы ищете, но, возможно, это поможет указать правильное направление.