Я хочу минимизировать пиковую разницу list1[i] - list2[i], используя метод scipy.optimize.minimize. Элементы в list1 и list2 являются числами с плавающей запятой.
Например:
список1 = [50, 50,5, 52, 53, 55, 55,5, 56, 57, 60, 61]
Как минимизировать list1[i] - list2[i], учитывая, что у меня есть два ограничения:
<сильный>1. список2 = список1[0]
<сильный>2. список2[i+1]-список2[i]‹=1,5
По сути, два последовательных элемента в списке2 не могут быть разделены более чем на 1,5, а первый элемент списка2 является первым элементом списка1.
Может быть, есть другой способ, кроме scipy.optimize.minimize, но я не знаю, как это сделать. Я думаю, что оптимальные значения для list2 могут быть следующими: list2 = [50, 50,5, 52, 53, 54,5, 55,5, 56, 57, 58,5, 60]
В этом случае пиковая разница составляет 1,5. Но, возможно, алгоритм находит более оптимальное решение, где разница между элементами list1 и list2 меньше.
Вот что я пробовал, но потерпел неудачу:
import numpy as np
from scipy.optimize import minimize
list1 = [50, 50.5, 52, 53, 55, 55.5, 56, 57,60, 61]
list2 = [list1[0]]
#Define objective
def peakDifference(*args):
global list2
peak_error = []
for list1_i, list2_i in zip(list1, list2):
peak_error.append(list1_i-list2_i)
return max(peak_error)
peak_error = peakDifference()
#Define constraints
def constraint1(*args):
for x in range(len(list2) - 1):
return list2[x+1] - list2[x] - 1.5
con1 = {'type': 'ineq', 'fun': constraint1}
#Optimize
sol = minimize(peakDifference,list2, constraints=con1)
Traceback (most recent call last): File "C:/Users/JumpStart/PycharmProjects/anglesimulation/venv/asdfgh.py", line 27, in <module>
sol = minimize(peakDifference,list2, constraints=con1) File "C:\Users\JumpStart\anaconda3\lib\site-packages\scipy\optimize\_minimize.py", line 625, in minimize
return _minimize_slsqp(fun, x0, args, jac, bounds, File "C:\Users\JumpStart\anaconda3\lib\site-packages\scipy\optimize\slsqp.py", line 412, in _minimize_slsqp
a = _eval_con_normals(x, cons, la, n, m, meq, mieq) File "C:\Users\JumpStart\anaconda3\lib\site-packages\scipy\optimize\slsqp.py", line 486, in _eval_con_normals
a_ieq = vstack([con['jac'](x, *con['args']) File "C:\Users\JumpStart\anaconda3\lib\site-packages\scipy\optimize\slsqp.py", line 486, in <listcomp>
a_ieq = vstack([con['jac'](x, *con['args']) File "C:\Users\JumpStart\anaconda3\lib\site-packages\scipy\optimize\slsqp.py", line 284, in cjac
return approx_derivative(fun, x, method='2-point', File "C:\Users\JumpStart\anaconda3\lib\site-packages\scipy\optimize\_numdiff.py", line 426, in approx_derivative
return _dense_difference(fun_wrapped, x0, f0, h, File "C:\Users\JumpStart\anaconda3\lib\site-packages\scipy\optimize\_numdiff.py", line 497, in _dense_difference
df = fun(x) - f0 TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneType'
Process finished with exit code 1