0

(将来の) クライアントから受信した関数を、いくつかのパラメーターを使用してループで実行するコードを作成しました。func(名前を付けます)と呼びます。

関数内では、クライアントは通常、同じ変数で式を生成します (GetUncertainty によって - 各変数は使用前にクリアする必要があります)。これを行うには、単純なアイデアはブロックを使用することです。後で、関数の外で di と i を処理するコードが実行されます。そのため、di と i はグローバルでなければなりません (さらに多くの可能性がありますが、柔軟です)。

ところで、効率的ではないことはわかっていますが、効率は問題ではありません。

func[v_, a_, r_] := 
(V = v; A = a; R = r; 
 Block[{V, A, R},i = V A + A 10 + R 100; di = GetUncertainty[i, {V, A, R}];] ;
 Print[di])

問題は、クライアントが変数を手動でリセットしなければならないことです。つまり、関数パラメーターを V_,A_,R_ にすることはできません。それ以外の場合、ブロック内の変数は値に置き換えられます。他の方法でこれを克服することはできませんでした。

同様の問題の別の質問。vars = {V,A,R,DR} がある場合、Block[vars , ..code.. ] は、リストではないというエラーをスローします。一方、Block[ {V,A,R,DR},. .code..] 動作します。これを克服する方法は?

ありがとう。

4

2 に答える 2

1

何をしようとしているのかを解明するのは難しいですが、最善のアプローチは、あるコンテキストで純粋なシンボルとして使用する必要があるシンボルに値を割り当てないことです。その場合、Block[] も必要ありません。

func[v_, a_, r_] := (
    i = V A + A 10 + R 100; 
    di = GetUncertainty[i, {V, A, R}];
    Print[di /. {V->v,A->a,R->r])

独自のシンボル名を大文字で始めることは、組み込みのシンボルと競合するリスクがあるため、眉をひそめます。

専用サイト mathematica.stackexchange.com もあります。

于 2013-08-14T13:40:33.597 に答える
0

私があなたのアプリケーションを理解しているなら、あなたが必要としているのはフォーマルシンボルです。これらは、Protected誤って値が割り当てられないように属性を持つシンボルのセットです。これらは、たとえばEsc$AEscFormal Capital A のように入力できます。次に、george が示したようにReplaceAll(短い形式) を使用して、目的の値を置き換えることができます。/.

コードは次のようになります。

func[v_, a_, r_] :=
  Module[{i, di},
    i = \[FormalCapitalV] \[FormalCapitalA] + \[FormalCapitalA] 10 + \[FormalCapitalR] 100;
    di = GetUncertainty[i, {\[FormalCapitalV], \[FormalCapitalA], \[FormalCapitalR]}];
    di /. {\[FormalCapitalV] -> v, \[FormalCapitalA] -> a, \[FormalCapitalR] -> r}
  ]

ここではひどいように見えますが、ノートブックでは次のようになります。

ここに画像の説明を入力

Moduleなどのユーティリティ シンボルを適切にローカライズする方法を示すために含めましたが、この非常に単純な関数はそれらを使用せずに記述することもできます。idi

ここに画像の説明を入力

vars = {V,A,R,DR}「 then 」に関する 2 番目の質問は、Block[vars , ..code.. ]ここで回答されています:コードでブロック ローカル変数を設定する方法は?


専用の StackExchange サイト:
ここに画像の説明を入力

于 2013-08-14T22:59:34.550 に答える