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] を評価し、2 つの引数を持つラムダ式を生成し、[l, [0.25, 0.25, 0.25, 0.25]] に適用されます。s が実際のリストにバインドされていないため、prob_exp[k] を評価するとエラーが発生します。

この問題を解決するには、prob_exp[k] を評価して s をシンボルとして持つことができるものが必要です。これを行う 1 つの方法を次に示します。ここでは、単純化関数 (つまり、単純化ルールによって評価される関数) として 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 は浮動小数点数より正確な分数を好むことに注意してください。[0.25, 0.25, 0.25, 0.25] の代わりに [1/4, 1/4, 1/4, 1/4] を使用することをお勧めします。

于 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]はラムダですが、その内容はプロセスで評価され、「run」を出力します。ただし、エラーはスローされません。なんで ?単純に、シンボリック境界を使用してmakelistを評価することはできません。また、この段階ではsにはまだ値がないため、lengthはシンボリックです。

prob_exp [k](l、s)の代わりにprob_exp(k、l、s)を定義すると、式全体がラムダになり、すべての変数に値がある場合に評価されます。

同様に、これはshowを評価しません:

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

また、前述のqの定義では、q [k]を数回呼び出すと、qはハッシュ配列であるため、 runは1回だけ出力されることに注意してください。したがって、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 に答える