Как обсуждалось в комментариях, один из способов достижения этого - использовать
return (result - 1.0) ** 2
в objective
. Тогда результаты не могут стать отрицательными, и оптимизация попытается найти result
таким образом, чтобы оно было близко к вашему целевому значению (например, 1.0
в вашем случае).
Иллюстрация с использованием вашей текущей настройки:
from scipy.optimize import minimize
def objective(x, target_value):
# replace this by your actual calculations
result = x - 9.0
return result - target_value
# add some bounds for all the parameters you have
bnds = [(-100, 100)]
# target_value is passed in args; feel free to add more
res = minimize(objective, (1), args=(1.0,), bounds=bnds)
if res.success:
# that's the optimal x
print(f"optimal x: {res.x[0]}")
else:
print("Sorry, the optimization was not successful. Try with another initial"
" guess or optimization method")
Поскольку мы выбрали -100
в качестве нижней границы для x
и попросили минимизировать цель, оптимальное значение x
равно -100
(будет напечатано, если вы запустите код сверху). Если мы теперь заменим строку
return result - target_value
по
return (result - target_value) ** 2
и оставьте остальные без изменений, оптимальный x
равен 10
, как и ожидалось.
Обратите внимание, что я передаю целевое значение в качестве дополнительного аргумента, чтобы ваша функция была немного более гибкой.