Итак, у меня есть набор значений (средние значения интенсивности по радиусу на изображении), и я хочу установить полиномиальную функцию для имитации эффекта виньетирования на рисунке.
Проблема в том, что функция scipy.optimize.minimize возвращает мне только 0 параметров.
Вот некоторые примеры данных Z_RB, если вы хотите повторить то, что я делаю:
Примечание: значения 0 в конце должны игнорироваться в процессе подбора.
https://pastebin.com/MKqKgPFr
График данных: https://imgur.com/a/7HRM3N5
Кроме того, ограничения не работают, мне нужно, чтобы моя функция была монотонно убывающей и начинающейся с 1. Ошибка: «IndexError: массивы, используемые в качестве индексов, должны иметь целочисленный (или логический) тип» Это не главный вопрос , но если у вас есть совет для меня там, я был бы рад услышать его, я, вероятно, создам второй вопрос для этого, как только сам примерка сработает.
Большая часть моего кода работала в других случаях раньше.
Вызов scipy.optimize.minimize работает с упрощенной функцией, но, поскольку я не слишком много с ней работал, возможно, я просто что-то вызываю неправильно
Функция звука, насколько я могу проверить это.
Потеря тоже должна сработать, но это наиболее вероятный виновник, поскольку раньше это приводило к проблемам.
Расчет Z_RB работает, я в этом уверен.
Вызов функции подгонки (p - степень многочлена):
polpar = np.zeros(p)
if config["fitter"]==1:
V_fit = calc.fit_my_polyfit(Z_RB, polpar, filename)
Функция подгонки:
def fit_my_polyfit(Z_RB,param,title):
last = np.amax(np.flatnonzero(Z_RB))
print("polyfit with regularization")
r = np.arange(0, len(Z_RB),dtype='uint32')
b = (None,None)
bnds = (b,)
for i in range(len(param)-1):
bnds = bnds + (b,)
cons = ({'type': 'ineq', 'fun': lambda param: -np.diff(f(r,param))},
{'type': 'eq', 'fun': lambda param: f(r, param)[0]-1})
#The Constraints don't work, so they aren't called at the Moment
res = minimize(loss, param, method='trust-constr', args=(Z_RB[3:last]), bounds=bnds)
print(res.x)
var = res.x
V_fit = f(r,var)
Z_corr = np.minimum(np.divide(Z_RB, V_fit), 1)
plt.figure(1)
plt.clf()
plt.plot(r, Z_RB, 'b-')
plt.plot(r, V_fit, 'r-')
plt.plot(r, Z_corr, "g-")
plt.show()
return V_fit
Функция потерь:
def loss(param, Z_RB):
r = np.arange(0, len(Z_RB),dtype='uint32')
V = f(r,param)
ll = 1
lr = 1
L2 = m.sqrt(np.sum(np.power(np.subtract(Z_RB,f(r, param)),2)))
reg = np.sum(np.power(param,2))
return ll*L2 +lr*reg
Функция полинома:
def f(r, param):
V = np.zeros(len(r),dtype='float32')
poly = np.poly1d(param)
V = poly(r)
return V
Это текущий вывод:
https://pastebin.com/P8iCCjan