0

我有一个表达式数组,每个都取决于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函数。

谢谢。

4

3 回答 3

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
于 2013-04-19T20:04:32.337 回答
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]

其中的值0a在调用内部替换,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 如何找出列表中的最小正值?

于 2013-04-19T14:16:40.047 回答
0

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

所以

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

即使您明确地将 a 设置为其他值,例如

a=3

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

按预期返回 9

高温高压

耶胡达

于 2013-04-20T15:35:26.980 回答