profile * x0
в вашем коде дает
"ValueError: операнды не могут быть переданы вместе с фигурами (131,) (200,)".
Просто угадайте, является ли x_t
продуктом onoff_t * xon_t
с onoff_t
= 0 или 1
и 0.3 <= xon_t <= 1
на каждом t
в 0 .. T
?
Т.е.для T = 5
существует 2 ^ 5 возможных onoff
последовательностей, 00000 00001 00010 .. 11111?
Если это так, maximizng sum 0:T w_t * onoff_t * xon_t
с функцией фиксированного веса w_t
тривиален:
гдеw_t <= 0
: onoff_t = 0
, выкл.
, где w_t > 0
: onoff_t = 1
, вкл. И xon_t = 1
, макс.
Так что это не может быть ваш вопрос - уточните.
Если onoff_t
дополнительно вынужден переключаться только дважды, 0 ... 1 ... 0 ..., то число возможных последовательностей достаточно мало, чтобы просто попробовать их все по строкам:
def pulse_generator( T=200, minwidth=5 ):
""" -> arrays of T floats, 0... 1... 0... """
for t0 in xrange( 1, T ):
for t1 in xrange( t0 + minwidth, T ):
pulse = np.zeros( T )
pulse[t0:t1] = 1
yield pulse
for pulse in pulse_generator( T ):
print "pulse:", pulse
optimize myfunction( pulse * xon ), 0.3 <= xon <= 1
Переключение 4 раза, 0 ... 1 ... 0 ... 1 ... 0 ..., аналогично.(Сколько таких импульсов существует для данного T
? См. Википедию Звезды и столбцы - удивительно.)
Добавлено: Я не эксперт, но неt-on aka
управление bang-bang очень чувствительно к малым изменениям, немного раньше или позже?Программа (mer) может тратить много времени на сглаживание, подавляя шум.Как насчет двух фаз: грубая-сетка, а затем точная-сетка -
- разделить время 0: T, скажем, на 10 частей, выполнить все 2 ^ 10 = 1024 последовательностей включения-выключения
1a.присмотритесь к лучшим из них - какой-нибудь шаблон? - переместите их края на полшага, T / 20.
См. также: google "дискретная оптимизация" multigrid ... и Поиск по сетке .