2

最初に言っておきますが、私は Mathematica の初心者であり、この質問はおそらく簡単に答えられますが、インターネットを探し回っても、この特定の問題に対する助けを見つけることができませんでした。ここでは、コードで実行する必要があることを基本的にまとめました。条件ステートメント/.で replace コマンドを使用すると、問題が発生します。IF基本的に、条件によってグローバルに定義された別の関数を含む非常に長い関数がありIFます。これらの数行のコードは、私が実行しているエラーを示しています...

In[1]:= y[x_, z_] = 2*x + 3*z;

In[2]:= zz[x_, z_] := If[y[x, z] < 0, 4*y[x, z], y[x, z]]

In[3]:= zz[-1, -2]

Out[3]= -32

しかし、私は必要です...

In[4]:= zz[x_, z_] /. x -> -1 /. z -> -2

Out[4]= If[3 Pattern[-2, _] + 2 Pattern[-1, _] < 0, 
 4 y[Pattern[-1, _], Pattern[-2, _]], 
 y[Pattern[-1, _], Pattern[-2, _]]]

これは、期待される数値項を生成しません。この質問がどれほどばかげているように聞こえるかもしれませんが、ご協力いただきありがとうございます。x注:およびに値を直接割り当てるのではなく、replace コマンドを使用する必要がありますz

補遺:

例を単純化しすぎました。次の例を見てください。

In[91]:= a[b_, c_] = -3*b + 2*c + d + e + f;

In[92]:= g[b_, c_] := If[a[b, c] < 0, -3*a[b, c], a[b, c]];

In[10]:= g[2, 4] /. d -> 1 /. e -> 2 /. f -> 3

Out[10]= 2 + d + e + f

しかし、私は結果を見ることを期待していますOut[10]= 8

うまくいけば、別の簡単な修正。

4

2 に答える 2

3

関数を定義するときは、 を使用しますx_。これは、指定されたパターンを検索し、xそれに定義を適用するよう Mathematica に指示します。だから、「式を取り、それを次のように変換しますf[x_]=x^2」と言います。 x Power[x,2]

関数を呼び出すときは、もはやパターンを使用するのではなく、代わりに mathematica が最終的に に代入する変数または値を使用しますx。が定義されf[a]ていないa^2a、定義を使用してaそれに応じて結果を提供します。

ハワードがコメントで述べたように、アンダースコアを削除するだけで、必要な式が得られます。

In[1]:= zz[x, z] /. x -> -1 /. z -> -2

Out[1]= -32

編集

あなたのコメントに答えるために、

If条件が評価された後にのみ、2 番目と 3 番目の引数を評価します。したがって、 を見るとg[2,4]

If[2 + d + e + f < 0, -3 a[2, 4], a[2, 4]]

「then」および「else」ステートメントは評価されないままですがa[2,4]、それ自体では2 + d + e + f.

したがって、置換を行うと、mathematica はd,e,f式のどこからでも置換を開始し(条件のみ)、条件を評価して「then」または「else」ステップに到達すると、他に置換するものはありません。 .

使用する必要があるのは、適用できなくなるまでルールを繰り返し適用するReplaceAllorです。//.方法は次のとおりです

In[2]:= rules = {d -> 1, e -> 2, f -> 3};
        g[2, 4] //. rules
Out[2]= 8
于 2011-05-24T19:55:37.537 に答える
1

「補遺」コードのこのバリエーションをお勧めします。

a[b_, c_] = -3*b + 2*c + d + e + f;

g[b_, c_] := If[# < 0, -3*#, #] & @ a[b, c]

g[2, 4] /. {d -> 1, e -> 2, f -> 3}

(* Out = 8 *)

変更点は次のとおりです。

  1. Ifステートメントを。とは別の純粋関数に移動しa[b, c]ます。この方法a[b, c]は一度だけ評価されますが、これは一般的に良い習慣です。

  2. 置換を単一の/.操作とルールのリストに移動します。繰り返しますが、実際にシリアル交換を意図していない限り、良い習慣です。

この場合、次のようにg[2, 4]評価されるため、最初の変更で問題が解決します。

If[2 + d + e + f < 0, -3 (2 + d + e + f), 2 + d + e + f]

、、、およびを明示的に使用しdます。したがって、これらは()に表示され、置換は正しく機能します。efReplaceAll/.

あなたの目標を達成するためのより良い方法があることはもっともらしいですが、私はあなたのコードの残りを推測することを差し控えます。

于 2011-05-25T08:14:19.870 に答える