长度:参数不能是符号

时间:2012-10-09 06:31:18

标签: maxima

我有以下代码:

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作为值传递?

3 个答案:

答案 0 :(得分: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]。

答案 1 :(得分: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在第一次调用时准备函数(并以某种方式评估正文),然后存储它。

答案 2 :(得分: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);