1

我有以下代码:

configuration(s)  := makelist(i, i, 0, length(s) - 1)$
active_agents(s)  := s . configuration(s)$
prob_exp[k](l, s) := 1 - exp(- l[k] * active_agents(s))$

当我尝试prob_exp使用一些具体的值调用时s,例如:

prob_exp[k](l, [0.25, 0.25, 0.25, 0.25]);

我收到以下错误消息:

length: argument cannot be a symbol; found s
#0: configuration(s=s)
#1: active_agents(s=s)
#2: lambda([k],lambda([l,s],1-exp((-l[k])*active_agents(s))))(k=k)
-- an error. To debug this try: debugmode(true);

有没有办法强制s作为值传递?

4

3 回答 3

1

以下是您所观察到的解释:Maxima 首先计算 prob_exp[k],它产生一个带有两个参数的 lambda 表达式,然后将其应用于 [l, [0.25, 0.25, 0.25, 0.25]]。评估 prob_exp[k] 会导致错误,因为 s 未绑定到实际列表。

要解决这个问题,您需要 prob_exp[k] 来评估可以以 s 作为符号的东西。这是一种方法。我将 active_agents 定义为简化函数(即,通过简化规则评估的函数)。

configuration(s)  := makelist(i, i, 0, length(s) - 1);
matchdeclare (aa, listp);
tellsimp (active_agents (aa), aa . configuration (aa));
prob_exp[k](l, s) := 1 - exp(- l[k] * active_agents(s));

然后我得到:

prob_exp[k];
 => lambda([l,s],1-%e^-(l[k]*active_agents(s)))
prob_exp[k](l, [0.25, 0.25, 0.25, 0.25]);
 => 1-%e^-(1.5*l[k])

请注意,Maxima 更喜欢精确分数而不是浮点数;我建议使用 [1/4, 1/4, 1/4, 1/4] 而不是 [0.25, 0.25, 0.25, 0.25]。

于 2013-07-20T19:48:36.987 回答
0

更简单的是写:

prob_exp(k, l, s) := 1 - exp(- l[k] * active_agents(s))$

问题是当您调用 p[k] 时会评估功能配置(我不知道为什么)。举一个更简单的例子:

show(x):=block(disp('run),x);
q[k](x,y):=x+k*show(y);
q[k];

产量:

run
lambda([x,y],k*y+x)

也就是说,q[k] 是一个 lambda,但它的内容在这个过程中得到了评估,它打印出“run”。但它不会引发错误。为什么 ?简单地说,你不能用符号边界来评估 makelist ,并且 length(s) 是符号的,因为在这个阶段 s 还没有价值。

当您定义 prob_exp(k, l, s) 而不是 prob_exp[k](l, s) 时,整个表达式是一个 lambda,并且将在所有变量都有值时进行评估。

同样,这不会评估show

lambda([x,y],y+k*show(x));

另外,请注意前面q的定义,当多次调用 q[k] 时,run只会打印一次,因为 q 是一个散列数组。因此,Maxima 在第一次调用时准备函数(并以某种方式评估主体),然后将其存储。

于 2012-10-23T18:50:43.617 回答
0

也许推迟评估会有所帮助?我不是 100% 确定为什么这会起作用,而将例如ev(..., nouns)放入其中prob_exp不起作用,但我认为这至少更接近您的需要。

kill(all);
configuration(s)  := 'makelist(i, i, 0, 'length(s) - 1)$
active_agents(s)  := s . configuration(s)$
prob_exp[k](l, s) := 1 - exp(- l[k] * active_agents(s))$

prob_exp[k](l, [0.25, 0.25, 0.25, 0.25]);
ev(%, nouns);
于 2013-07-18T13:13:31.330 回答