我有一系列表达式,每个都取决于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
函数。
感谢。
答案 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
胡达