4

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

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

4

2 回答 2

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将绑定到 a Sequence,而不是 a List,所以Total[xs]不会工作。Plus[xs]或者Plus[##]会。
  2. 我更喜欢纯函数而不是DownValues简单的东西,因为它们是更简单的构造。其中一些是习惯,因为在旧版本的 Mathematica 中,您可以从纯函数中获得更好的性能。使用纯函数代替DownValues仍然是表明您没有在模式匹配调度或非标准评估方面做任何花哨的好方法。
于 2009-10-02T14:38:22.957 回答
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]
于 2009-09-08T00:36:20.370 回答