Как установить ограничения для моих параметров при создании кривой с помощью библиотеки lmfit? - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь сделать curvfit, используя библиотеку lmfit. Моя цель состоит в том, чтобы кривая начиналась с x = 0, а f (0) = «константа». Я также хочу, чтобы его минимумы были при х = 1. Однако при наложении моих ограничений в модель f (1)> f (0).

F (x) = A exp (B x) + C x 2 + D x + E
F '(x) = A B exp (B * x) + 2 * C x + D
F' '(x) = A
B 2 exp (B x) + 2C

F (0) = постоянная = A + E =>E = константа - A
F '(1) = 0 = A B exp (B) + 2 * C + D => D = - (2 * C + B A exp (B))
F '' (1)> 0 => A * B 2exp (B) + 2 * C> 0 => C> -AB 2 * exp (B)) / 2

Это дает нам следующее ограниченное уравнение:
F (x) = C x (x-2) + A * (exp (B x) - B exp (B * x) -1) + константа

в дополнение к следующему неравенству, которое необходимо соблюдать:
F '' (1)> 0 => A * B ** 2 * exp (B) + 2 * C> 0 => C> -B2AeB / 2

Изображение расчетов в слове для удобства чтения

def model_5(x, a, b, c):
    return  c*x*(x-2) + a*(np.exp(b*x) - x*b*np.exp(b) - 1) + 0.003591687375349475

model_5b = Model(model_5)

pars_5b = Parameters()
pars_5b.add('a', value = 0.007)
pars_5b.add('b', value = 0.05)
pars_5b.add('delta', value = 0.02, min=0, vary=True)
pars_5b.add('c', expr="delta - 0.5*a*(b**2)*exp(b) ")

model_5b.fit(y, x=X, params=pars_5b, method="trf")

# Output from above fit
Variables
name    value   initial value   min max vary    expression
a   9.9227e-05  0.007   -inf    inf True    
b   0.08377349  0.05    -inf    inf True    
delta   5.7477e-11  0.02    0.00000000  inf True    
c   -3.7855e-07 0.019990801377906712    -inf    inf False   delta - 0.5*a*(b**2)*exp(b)

# Create predictions with the fitted models values
pred_5b = model_5(X, 9.9227e-05, 0.08377349, -3.7855e-07)

# Check if f(1) equals the minima
pred_5b[1] == np.min(pred_5b) # returns False, should return true



При размещении моих ограничений в модели f (1)> f (0), f (1) не является минимумом. Тем не менее, это должно быть при включении ограничений. Поэтому я чувствую, что должен вводить ограничения неправильно. Может ли кто-нибудь помочь мне направить меня в правильном направлении?

Разница в этом, в отличие от других вопросов, которые я обнаружил в Stackoverflow, состоит в том, что ограничение включает неравенство с оптимизируемыми параметрами. То есть C> -B2AeB / 2

1 Ответ

0 голосов
/ 29 октября 2019

Я думаю, что математика ограничений правильная (потрясающая!), И проблема в:

# Check if f(1) equals the minima
pred_5b[1] == np.min(pred_5b) # returns False, should return true

Это действительно правильно только если x[1] = 1. То есть pred_5b[1] является вторым элементом pred_5b, а не (обязательно) значением pred_5b при x=1.

...