如何最大化 Mathematica 中接受可变长度列表作为输入的函数?

发布于 2024-08-04 00:44:58 字数 315 浏览 1 评论 0原文

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

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

I have a time-series like function which gives an output based on a
list of real numbers(i.e. you can run the function on a list of
1,2,3,... real numbers). The issue I'm encountering is how to maximize
the function for a given list length(subject to a set of constraints).
I could fix the function to a fixed number of real numbers(i.e. f[x_Real, y_Real]
instead of f[x_List]) and treat x and y as the first
two elements of the list, and call Maximize on the function, but this
is not really elegant. I want to be able to easily change the number
of elements in the list.

What is the best way to optimize a function like I described, which
takes a list as an argument, for a fixed list length?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

勿忘初心 2024-08-11 00:44:58

使用带有 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}}

EDIT:

  1. Like ##, xs 将绑定到 Sequence< /code>,而不是 List,因此 Total[xs] 不起作用。 Plus[xs]Plus[##] 会。
  2. 对于简单的事情,我更喜欢使用纯函数而不是 DownValues,因为它们的构造更简单。其中一些是习惯,因为在旧版本的 Mathematica 中,您可以从纯函数中获得更好的性能。使用纯函数而不是 DownValues 仍然是表明您没有对模式匹配调度或非标准评估做任何花哨的事情的好方法。

Use a pure function with a SlotSequence (usually spelled ##) argument, like so:

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}}

EDIT:

  1. Like ##, xs will be bound to a Sequence, not a List, so Total[xs] won't work. Plus[xs] or Plus[##] would.
  2. I prefer pure functions instead of DownValues for simple things, because they're the simpler construct. Some of this is habit, because in older versions of Mathematica you could get better performance out of pure functions. Using a pure function instead of DownValues is still a good way to indicate that you aren't doing anything fancy with pattern-matching dispatch or non-standard evaluation.
一袭白衣梦中忆 2024-08-11 00:44:58

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

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]

I'm not sure if this is what you're asking, but you can define a function with an unspecified number of inputs with a double underscore:

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

Use three underscores to denote zero or more arguments:

g[x_, y_, z___] := {{x}, {y}, {z}}
g[5, 6]
g[1, 2, 3, 4]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文