2015-10-13 2 views
0

Из учебника scipy я действительно не понимаю, как работает optimize.minimize. Я хочу, чтобы свести к минимуму c3 в следующий набор уравнений:Какая переменная сведена к минимуму с помощью scipy.optimize.minimize/Как это работает?

0 = cos(b1)+ cos(b2)- 0.0166 
0 = sin(b1)+ sin(b2)+ 0.3077*c3 - 0.6278 
0 = cos(b1)- cos(b2)+ 5.4155*c3 - 4.3547 

в интервалах:

c3[0,1] 
b1,b2[0,2*pi] 

Вот мой код:

def fun(x): 
    return 4.9992-5.7233*x[0]-2*np.cos(x[2])-np.sin(x[2])-np.sin(x[1]) 
bnds = ((0,1),(0,2*np.pi),(0,2*np.pi)) 
i = optimize.minimize(fun, (0.05,np.pi*0.5,np.pi), method='SLSQP', bounds=bnds) 

Выход является

status: 0 
success: True 
    njev: 6 
    nfev: 30 
    fun: -3.9601679766628886 
     x: array([ 1.  , 1.57079633, 0.46367497]) 
message: 'Optimization terminated successfully.' 
    jac: array([ -5.72330004e+00, 0.00000000e+00, 6.11841679e-05, 
     0.00000000e+00]) 
    nit: 6 

Результат: то же самое в L-BFGS-B Я понимаю, что здесь c3 стал 1, который все еще в порядке, но я хотел, чтобы он был ниже. Если я применил fsolve к функции, она найдет корень для c3 = 0.46. Кстати, зачем мне писать x [0], x [1] и x [2] вместо c3, b1, b2 в коде? Есть ли более умный способ использования ограничений, например?

+0

'Из скудного учебника Я действительно не понимаю, как оптимизировать. Minimize works' Вы можете рассказать нам, что именно вы не понимаете? Есть ли какой-то конкретный пункт? – cel

+0

Во-первых, я не понимаю, как сказать, чтобы свести к минимуму c3, во-вторых, я не получаю разницу между ограничениями и границами. Математически говоря, граница - это ограничение неравенства, не так ли? – Fips

ответ

2

У вас есть три трансцендентные уравнения для 3 переменных b1, b2 и c3. Что вам нужно сделать, так это решить эти 3 уравнения для ваших переменных. Поскольку уравнения трансцендентны, возможно, что нет решения, одного решения или множества решений. Решая их Mathematica дает:

In[30]:= eq1 = 0 == Cos[b1] + Cos[b2] - 0.0166; 
eq2 = 0 == Sin[b1] + Sin[b2] + 0.3077*c3 - 0.6278; 
eq3 = 0 == Cos[b1] - Cos[b2] + 5.4155*c3 - 4.3547; 

In[42]:= Reduce[{eq1, eq2, eq3, b1 >= 0, b1 <= 2*Pi, b2 >= 0, 
    b2 <= 2*Pi, c3 >= 0, c3 <= 1}, {b1, b2, c3}] 

During evaluation of In[42]:= Reduce::ratnz: Reduce was unable to solve the system with inexact coefficients. The answer was obtained by solving a corresponding exact system and numericizing the result. >> 

Out[42]= b1 == 0.214076 && b2 == 2.85985 && c3 == 0.446303 

Так что есть на самом деле только одно решение. Теперь вы можете также использовать root найти это решение вашей системы уравнений численно:

import scipy as sp 
import scipy.optimize 

def f(x): 
    b1, b2, c3 = x 
    e1 = sp.cos(b1) + sp.cos(b2) - 0.0166 
    e2 = sp.sin(b1) + sp.sin(b2) + 0.3077*c3 - 0.6278 
    e3 = sp.cos(b1) - sp.cos(b2) + 5.4155*c3 - 4.3547 
    return e1, e2, e3 

res = sp.optimize.root(f, [0.5, 1.0, 1.0]) 
print('b1 = {}, b2 = {}, c3 = {}'.format(*res.x)) 

дает:

b1 = 0.214076256767, b2 = 2.85985240432, c3 = 0.446302998585 

То, что вы сделали с minimize, чтобы минимизировать сумму трех уравнений, которые не эквивалентно «минимизировать с3 в (совокупности) уравнений».

minimize не предназначен для того, что вы хотите. «Свернуть» делает что-то вроде минимизации поиска x, который минимизирует f(x) = x**2. Ответ, очевидно, будет «x = 0».

Вы должны написать 'x [0]' из-за интерфейса «минимизировать». функция просто ожидает, что вы дадите параметры, которые вы хотите свести к минимуму в векторной форме.

+0

Спасибо за ваш ответ. Я уже решил набор уравнений с помощью fsolve. Есть два решения: один qith c3 - что-то вроде 0,46, а другой - с 1.16. К сожалению, fsolve только поставляет один из них (в зависимости от оценки) и не принимает границ. Эта совокупность уравнений представляет собой техническую проблему с c3, являющуюся некоторой функцией стоимости. c3 = 1 означает максимальную нагрузку на двигатель, поэтому c3> 1 невозможно. Если я использую fsolve и получаю решение выше 1, хотя решение с c3 <= 1 существует, я ввернусь. – Fips

+0

Считаете ли вы, что «грубый» подходит?в отличие от fsolve и root, он имеет параметр диапазона. Я пробовал это раньше, но не мог заставить его работать по какой-то причине, но я не очень старался. – Fips

+0

Вы определили функцию 'func (x)', которая является суммой трех правых сторон ваших уравнений. Затем вы решили уравнение 'func (x) == 0'. Это не обязательно решение ваших уравнений * 3 * (вы решили только одно уравнение). Минимизация функции - это нечто иное, чем решение набора уравнений. Поэтому я все еще не уверен, почему вы хотите свести к минимуму все, чтобы решить вашу проблему. Я обновил свой ответ с помощью фактического решения, как решить вашу систему, используя Mathematica или * scipy * 'root'. –

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