1

私の問題(Mathematica)は、特定の配列で指定された変数を参照し、次の方法でそれらを操作します(例として):

入力: vars={x,y,z}, system=some ODE like x^2+3*x*y+...etc (変数 xy と z を実際に作成していないことに注意してください)

目的:

ODE のシステムにこれらの値を入力する目的で、リスト "var" 内の変数に値を割り当てること。次に、完了したら、配列 vars 内の変数の値をクリアして、元の形式 {x,y,z} にします (y=1 および z の {x,1,3} のようなものではありません)。 =3)。vars の位置要素を参照してこれを行いたいと思います (x、y、z が実際の変数であることを知らないようにしています)。

理由: ユーザーが定義した任意の数の変数と ODE を持つことができるプログラムを作成しようとしています。変数の数とそれらに使用される実際の文字は不明であるため、配列自体を操作する必要があります。

試み:

固定数の変数は簡単です。任意のケースでは、モジュールとブロックを試しましたが、成功しませんでした。次のコードを検討してください。

Clear[x,y,z,vars,svars]

vars={x,y,z}

svars=Map[ToString,vars]

Module[{vars=vars,svars=svars},

Symbol[svars[[1]]]//Evaluate=1

]

これを実行した後、vars={1,y,z} ではなく {x,y,z} になります。私はリストやアトムなどを使って関数型プログラミングを行ってきました。したがって、vars ではなく x を変更したため、後で vars を変更することは理にかなっています。ただし、変数のリストで「x」をローカルのままにすることはできません。もちろん、「x」自体を入れることもできますが、それはこの特定のケースに特有のものです。次のようなものを入れたいと思います:

Clear[x,y,z,vars,svars]

vars={x,y,z}

svars=Map[ToString,vars]

Module[{vars=vars,svars=svars, vars[[1]]},

Symbol[svars[[1]]]//Evaluate=1

]

もちろん、 vars[[1]] はシンボルでもシンボルへの割り当てでもないため、これは機能しません。

その他の可能性: 関数を見つけました

assignToName[name_String, value_] := ToExpression[name, InputForm, Function[var, var = value, HoldAll]]

有望に見えました。基本的に、name_String は変数の名前で、value はその新しい値です。私はやろうとしました:

vars={x,y,z} svars=Map[ToString,vars] vars[[1]]=//Evaluate=1 assignToName[svars[[1]],svars[[1]]]

しかし、次のようなものD[x^2, vars[[1]]] は機能しません (x は有効な変数ではありません)。

何かが欠けている場合、またはおそらく間違った道を進んでいる場合は、他のことを試すことにオープンです。

ありがとう。

4

1 に答える 1

1

私はあなたの一連の考えにうまく従ったとは言えません。したがって、これらは、首尾一貫した完全な回答よりも、あなた自身の質問に答えるのに役立つかもしれない断片です。しかし、最後の「質問」に答えるために、間違った道を進んでいる可能性があると思います。

ちなみに、式を評価することに注意してください

vars = {x,y,z}

実際にはこれら 3 つの変数を定義しますが、それらの書き換え規則 (値など) は定義していません。

多項式が与えられると、次のようなpoly関数でその中の変数を抽出できますVariables[poly]

Variables[x^2+3*x*y]

戻るべき

{x,y}

私はこのマシンに Mathematica を持っていないので、構文が少し不安定かもしれないので、do ではなく 'should' と書いていることに注意してください。Variablesまた、ODEの例はそのようなものではありませんが、変数を抽出できる形式にODEを操作するラッパーをおそらく作成できることに注意してください。Mathematica には、式をバラバラにして再組み立てするための関数が他にもたくさんありますVariables。多くの場合、式で定義された関数Listsを他のヘッドでも使用できるため、常に少し実験する価値があります。

Mathematica で変数の値を設定しないようにするために広く適用できる方法がいくつかあります.たとえば、次のように書くことができます

x^2+3*x*y/.{x->2,y->3}

に評価されます

22

xとの値は設定しませんy。これは、変数への値の一時的な割り当てに (セットの) 置換規則を使用する非常に単純な例です。

変数に値を設定することを避けるもう 1 つの方法は、独自のコンテキストを定義する、Modulesまたはその両方を使用して関数を定義することです。Blocksドキュメントは、これら 2 つのすべてとそれらの違いについて説明します。

SymbolToExpressionを使用したあなたの巧妙なトリックはすべてToString、少し的外れだと思わずにはいられません。Mathematica に組み込まれている機能に慣れるまで時間をかけてから、その道を進んでください。その必要がないことに気付くかもしれません。

最後に、次のような式を任意の言語で記述します。

vars=vars,svars=svars

狂気に陥ります。構文的には正しいかもしれませんし、そのようなコードを最初に書いたときにはセマンティクスを解読することさえできるかもしれませんが、1 週間後には、それを書いたことで若い頃の自分を呪うでしょう。

于 2012-09-24T15:11:58.023 に答える