如何在Mathematica中找到数组中的最大正值?

时间:2013-04-19 14:07:21

标签: wolfram-mathematica

我有一系列表达式,每个都取决于a

我希望找到最小正值,因为它取决于a,而不必替换a。

例如,如果数组是[a^2, 1-2a, 1],则调用它MinPositive的函数将返回:

(MinPositive[a^2, 1-2a, 1]) /. a-> 0

0

(MinPositive[a^2, 1-2a, 1]) /. a-> 0.7

0.7^2

等等。

有什么想法吗?

我很感激帮助编写MinPositive函数,以便可以使用它,例如,而不是常规的Min函数。

感谢。

3 个答案:

答案 0 :(得分:1)

你有没有这样的想法?返回导致最小值的表达式。

minp[lst_, a_, v_] := (
     pos = Select[lst, ((# /. a -> v) > 0) &];
     Last@Sort[pos , ( (#1 /. a -> v ) > (#2 /. a -> v )) &])


minp[{a^2, 1 - 2 a, 1}, a, .2]  -> a^2
minp[{a^2, 1 - 2 a, 1}, a, .48]  -> 1-2 a
minp[{a^2, 1 - 2 a, 1}, a, 2]   -> 1

答案 1 :(得分:0)

表达式

[a^2, 1-2a, 1]

不是一个结构良好的Mathematica表达式,也许你的意思是

{a^2, 1-2a, 1}

是3个元素列表的有效表达式。尽管列表通常可用于对数组进行建模,但Mathematica并不像这样做数组。

另一方面表达

MinPositive[a^2, 1-2a, 1]

是对带有3个参数的名为MinPositive的函数的有效调用。

一方面,我认为你可能正在寻找一个函数调用,如

MinPositive[{a^2, 1-2a, 1}/.a->0]

其中0的值将在a的调用中替换MinPositive,但不会在该调用之外应用。

从您的问题中不清楚您是否需要帮助来编写MinPositive函数;如果你这样做,请编辑你的问题并说明问题。此外,您的问题标题要求最大正值,而您的问题正文指的是最小值。您可能也希望对此进行排序。

修改

我没有在这台机器上安装Mathematica所以我没有检查过这个,但它应该足够接近你完成:

minPositive[lst_List] := Min[Select[lst,#>0&]]

然后你会像这样打电话

minPositive[{a^2, 1-2a, 1}]

(注意:我避免使用带有首字母大写字母的名称创建函数。)

或者,考虑一下你的评论,也许你想要像

这样的东西
minPositive[lst_List, rl_Rule] := Min[Select[lst/.rl,#>0&]]

你会这样称呼:

minPositive[{a^2, 1-2a, 1},a->2]

编辑2

麻烦,对你来说,用

这样的表达方式
(MinPositive[a^2, 1-2a, 1]) /. a-> 0

是Mathematica中的正常评估循环将导致在应用替换规则之前评估MinPositive函数。当a设置为特定值时,Mathematica如何计算列表中的最小正值?

答案 2 :(得分:0)

在调用函数体之前通过将函数的属性设置为HoldAll(防止对所有参数进行求值),HoldFirst(仅阻止评估第一个参数)或HoldRest(防止除了第一个论点之外的所有评价)。 另外,由于“a”本身不是一个参数,你需要使用Block将它与“a”的(潜在)定义隔离开来

所以

SetAttributes[minPositive, HoldAll]
minPositive[lst_List] := Block[{a},Min[Select[lst /. a -> 0, # > 0 &]]]

即使您明确设置了其他值,也可以说

a=3

大于

minPositive[{a^2, 1 - 2 a, 100}]

按预期返回9

HTH

胡达