如何在Mathematica中最大化一个函数,它将可变长度列表作为输入?

时间:2009-09-07 20:00:52

标签: wolfram-mathematica

我有一个类似时间序列的函数,它根据a提供输出 实数列表(即你可以在列表上运行该函数) 1,2,3,......实数)。我遇到的问题是如何最大化 给定列表长度的函数(受一组约束限制)。 我可以将函数修复为固定数量的实数(即f[x_Real, y_Real] 而不是f[x_List])并将xy视为第一个 列表的两个元素,并在函数上调用Maximize,但这个 不是很优雅。我希望能够轻松更改号码 列表中的元素。

优化像我描述的功能的最佳方法是什么,哪个 对于固定的列表长度,将列表作为参数?

2 个答案:

答案 0 :(得分:3)

使用带有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仍然是表明您没有使用模式匹配调度或非标准评估做任何事情的好方法。

答案 1 :(得分:1)

我不确定这是不是你问的问题,但你可以使用双下划线定义一个带有未指定数量的输入的函数:

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]