Разные результаты при использовании tuple и np.array в функции minimize библиотеки scipy.optimize

Выполняю минимизацию функции, и при использовании данных в формате tuple, и все корректно работает, но очень долго. Хотел оптимизировать код, перевел все на np.array, но теперь получаются другие значения, меня они не удовлетворяют, но по скорости все отлично. Помогите разобраться, что необходимо сделать что бы получить скорость как с np.array, но данные что бы были как с tuple.

import numpy as np
from scipy.optimize import minimize
import time
import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning)
warnings.filterwarnings("ignore", category=UserWarning)

start_time = time.time()

def Bass1(x, P, Q, M):
    return (P*M+(Q-P)*(x))-(Q/M)*(x**2)

def squareMistake1(k: tuple, *sales) -> float:
    p0 = 0
    c0 = sales[0]
    res = 0  # Значение функции
    for i in range(1, len(sales)):
        p = Bass1(c0, P=k[0], Q=k[1], M=k[2])
        c = c0 + p
        res += (c - sales[i])**2
        p0 = p
        c0 = c
    return res


# Готовим данные для минимизации
# Начальные значения параметров
k0 = [0.0008791696672306727, 0.19252826585535315, 3328.9193848309856]
# Все параметры неотрицательные
kb = ((0, None), (0, None), (0, None))

# тот набор данных который необходим, идеальные значения, большое время исполнения
generate = tuple([8.26192344363636, 9.20460066059596, 12.0178164697778, 15.921260267805, 21.2161740066094, 31.420434564131, 38.3904519471421, 52.3307819867071, 62.9113953016839, 85.1161924282732, 104.083879757882, 132.859216030029, 170.682620580279, 220.600045153997, 276.020526299077, 346.465021938078, 440.385091980306, 530.55442135112, 635.49205101167, 705.805860788812, 831.42968828187, 962.227395409379, 1140.31094904253, 1269.52053571083, 1418.17004626655, 1591.2135122193])
# аналогичный набор данных, значения не устраивают, малое время исполнения
# generate = np.array([8.26192344363636, 9.20460066059596, 12.0178164697778, 15.921260267805, 21.2161740066094, 31.420434564131, 38.3904519471421, 52.3307819867071, 62.9113953016839, 85.1161924282732, 104.083879757882, 132.859216030029, 170.682620580279, 220.600045153997, 276.020526299077, 346.465021938078, 440.385091980306, 530.55442135112, 635.49205101167, 705.805860788812, 831.42968828187, 962.227395409379, 1140.31094904253, 1269.52053571083, 1418.17004626655, 1591.2135122193])

# список методов используемый в минимизации
metod_list = ['Nelder-Mead', 'Powell', 'L-BFGS-B', 'TNC', 'SLSQP', 'trust-constr']

for i in metod_list:
    # Минимизируем сумму квадратов
    try:
        res = minimize(squareMistake1, k0, args=generate, method=i, bounds=kb)
    except:
        print(f'Минимизация методом {i} не удалась!')
    k = tuple(res.x)  # Получаем кортеж параметров
    print(f'k = {k}')

end_time = time.time()
total_time = end_time - start_time
print(f'Время выполнения: {total_time} seconds')

Ответы (0 шт):