2015-07-16 2 views
0

Я пытаюсь минимизировать функцию, которая имеет аргументы S1, S2, S3 и n1, n2 и n3. Имеются также весы: w1, w2 и w3.Минимизация Multivariable Функция Python SciPy

Это функция:

f = (w1**2 * n1**2 + w2**2 * n2**2 + w3**2 * n3**2)/(w1**2 * S1**2 + w2**2 * S2**2 + w3**2 * S3**2 + 2*w1*S1*w2*S2 * 2*w1*S1*w2*S2 + 2*w2*S2*w3*S3) 

Я хочу знать, учитывая S1, S2, S3, n1, n2 и n3, какие w1, w2 и w3 минимизирует f?

Вот мой код до сих пор:

def opt(S1, S2, S3, n1, n2, n3): 
    xo = np.array([0,1,.01]) 
    from scipy.optimize import minimize 
    signoise = lambda w1,w2,w3: (w1**2 * n1**2 + w2**2 * n2**2 + w3**2 * n3**2)/(w1**2 * S1**2 + w2**2 * S2**2 + w3**2 * S3**2 + 2*w1*S1*w2*S2 * 2*w1*S1*w2*S2 + 2*w2*S2*w3*S3) 
    w1min, w2min, w3min = scipy.optimize.minimize(signoise, (.4, .2, .4)) 
    return w1min, w2min, w3min 

scipy.optimize.minimize принимает два аргумента, функции и начальное предположение. Я не знаю, если это работает для функций многих переменных, потому что я получаю

error : <lambda>() takes exactly 3 arguments (1 given) 

Хорошо, я последовал предложению CodyKramer в. Когда я тестировал его с произвольными значениями для S1, S2, S3, n1, n2, n3, я получил все это как ответ: status: 0 success: True njev: 1 nfev: 5 hess_inv: array ([[1, 0 , 0], [0, 1, 0], [0, 0, 1]]) fun: 5.1874999894628917e-18 x: массив ([0,4, 0,2, 0,4]) сообщение: «Оптимизация завершена успешно». jac: array ([-1.81249989e-17, -4.62499946e-17, 1.53125002e-17]) Является ли последняя строка «jac» тремя числами, которые я искал?

+0

Ответ является массив 'x' в вашем выводе. 'jac' является [якобиевой матрицей] (https://en.wikipedia.org/wiki/Jacobian_matrix_and_determinant), которая является (в основном) первой производной от' x', а 'hess' является [матрицей Гессиана] (https: //en.wikipedia.org/wiki/Hessian_matrix), который является (в основном) второй производной от 'x' – CoryKramer

ответ

1

Проблема заключается в том, что, как написано, ваш lambda принимает 3 аргумента, а не 1 аргумент (который является последовательностью с 3 элементами). Я бы вытащить целевую функцию в отдельную функцию

def signoise(w): 
    w1, w2, w3 = w # unpack your tuple into each variable 
    # populate your S and n coefficients 
    return w1**2 * n1**2 + w2**2 * n2**2 + w3**2 * n3**2)/(w1**2 * S1**2 + w2**2 * S2**2 + w3**2 * S3**2 + 2*w1*S1*w2*S2 * 2*w1*S1*w2*S2 + 2*w2*S2*w3*S3 

Затем вы можете модифицировать функцию

def opt(S1, S2, S3, n1, n2, n3): 
    xo = np.array([0,1,.01]) 
    from scipy.optimize import minimize 
    return scipy.optimize.minimize(signoise, (.4, .2, .4)) 
+0

Хорошо, я последовал твоему предложению. Когда я тестировал его с произвольными значениями для S1, S2, S3, n1, n2, n3, я получил все это в качестве ответа: status: 0 success: True njev: 1 nfev: 5 hess_inv: array ([ [1, 0, 0], [0, 1, 0], [0, 0, 1]]) fun: 5.1874999894628917e-18 x: массив ([0,4, 0,2, 0,4]) сообщение: «Оптимизация завершена успешно». jac: array ([-1.81249989e-17, -4.62499946e-17, 1.53125002e-17]) Является ли последняя строка «jac» тремя числами, которые я искал? – hazel

+0

Можете ли вы, пожалуйста, изменить свой вопрос, чтобы включить это? К сожалению, все форматирование теряется в разделе комментариев, поэтому трудно разобрать этот вывод визуально – CoryKramer

Смежные вопросы