Как ограничить параметр LMFit только отрицательными значениями? - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь получить двумерную подгонку 2D полиномиальной функции второго порядка (D (I, V)) с использованием пакета LMFit. Мне нужно определить значения коэффициентов D (I, V), чтобы я мог определить параметры для модели неидеального диода.

D (I, V) = d1 * V + i1 * I + d1i1 * V * I + d2 * V ^ 2 + i2 * I ^ 2

Ссылка на изображение уравнения включена сюда: Уравнение D (I, V)

I и V - экспериментальные данные по току и напряжению.

Параметры d2 и i2 должны быть отрицательными. Я прочитал документацию LMFit об ограничениях неравенства https://lmfit.github.io/lmfit-py/constraints.html#using -inequality-constraints , но у меня возникают проблемы с реализацией неравенства для d2, i2 <0, так как я не знаю, какие значения установить максимум из d2 и i2 быть. </p>

Модель D (I, V):

def D_2d(vi_mesh, d1, i1, d1i1, d2, i2):
    # unpack 1D list into 2D x and y coordinates
    (v, i) = vi_mesh

    # make 2D integral difference function matrix
    D = (i1 * i) + (d1 * v) + (d1i1 * v * i) + (i2 * i ** 2) + (d2 * v ** 2)

    # flatten the 2D matrix into 1D
    return np.ravel(D)

Подгонка рассчитывается с использованием:

# Initial guesses for the DIF function coefficients
guess_vals = [1, -1, 1, -1, -1]

# Fit model to DIF function
lmfit_result = lmfit_model.fit(
    np.ravel(DIF),
    vi_mesh=vi_mesh,
    d1=Parameter("d1", value=guess_vals[0], vary=True),
    i1=Parameter("i1", value=guess_vals[1], vary=True),
    d1i1=Parameter(
        "d1i1", value=guess_vals[2], expr="sqrt(1 + (4*d2*i2))", vary=True
    ),
    d2=Parameter("d2", value=guess_vals[3], vary=True),
    i2=Parameter("i2", value=guess_vals[4], vary=True),
)

Как сделать Я ограничиваю d2 и i2 быть отрицательными?

1 Ответ

0 голосов
/ 03 мая 2020

Ну, вы можете сделать

Parameter("d2", value=guess_vals[3], vary=True, max=0)

и так далее.

Я должен сказать, что ваш синтаксис lmfit_model.fit() может не работать, если вы не написали свой собственный класс около lmfit. Обычно можно создать экземпляр lmfit.Parameters, который содержит полный набор объектов lmfit.Parameter.

То есть, если ваша функция D_2d является функцией модели, которую вы хотите использовать для моделирования данных, нормальная Рекомендованный подход будет следующим:

d_model = lmfit.Model(D_2d)
params = d_model.make_params(d1=1, i1=-1, d1i1=1, d2=-1, i2=-1)
params['d2'].max = 0 # make sure value is negative
params['i2'].max = 0 # make sure value is negative
params['d1i1'].expr = 'sqrt(1 + (4*d2*i2))'. # your constraint 

result = d_model.fit(np.ravel(DIF), params, vi_mesh=vi_mesh)

Я надеюсь, что вы начали ...

...