Как мне максимизировать функцию в Mathematica, которая принимает список переменной длины в качестве входных данных?

У меня есть функция, похожая на временной ряд, которая дает результат на основе списка реальных чисел (т.е. вы можете запустить функцию в списке 1,2,3,... реальных чисел). Проблема, с которой я сталкиваюсь, заключается в том, как максимизировать функцию для заданной длины списка (с учетом набора ограничений). Я мог бы исправить функцию до фиксированного числа действительных чисел (т.е. f[x_Real, y_Real] вместо f[x_List]) и рассматривать x и y как первые два элемента списка и вызывать Maximize в функции, но это не очень элегантно. Я хочу иметь возможность легко изменить количество элементов в списке.

Каков наилучший способ оптимизировать описанную мной функцию, которая принимает список в качестве аргумента, для фиксированной длины списка?


person Mike    schedule 07.09.2009    source источник


Ответы (2)


Используйте чистую функцию с аргументом SlotSequence (обычно пишется ##), например так:

In[1]:= f = With[{r = Total[{##}^2]}, Sin[r]/r]&;
In[2]:= NMaximize[f[x,y,z], {x,y,z}]
Out[2]= {1., {x -> -0.0000402914, y -> 0.0000278573, z -> -0.0000765568}}

ИЗМЕНИТЬ:

  1. Как и ##, xs будет привязано к Sequence, а не к List, поэтому Total[xs] не работает. Plus[xs] или Plus[##] будет.
  2. Я предпочитаю чистые функции вместо DownValues для простых вещей, потому что они представляют собой более простую конструкцию. Отчасти это привычка, потому что в старых версиях Mathematica можно было добиться большей производительности за счет чистых функций. Использование чистой функции вместо DownValues по-прежнему является хорошим способом показать, что вы не делаете ничего особенного с отправкой сопоставления с образцом или нестандартной оценкой.
person Pillsy    schedule 02.10.2009
comment
Почему не f[xs___] := With[{r=Total[xs]}, Sin[r]/r]? - person J D; 23.04.2010

Я не уверен, что это то, о чем вы спрашиваете, но вы можете определить функцию с неопределенным количеством входов с двойным подчеркиванием:

f[in__] := Mean[{in}]
f[5, 6]
f[1, 2, 3, 4]

Используйте три символа подчеркивания для обозначения нуля или более аргументов:

g[x_, y_, z___] := {{x}, {y}, {z}}
g[5, 6]
g[1, 2, 3, 4]
person Will Robertson    schedule 08.09.2009