私の問題(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 は有効な変数ではありません)。
何かが欠けている場合、またはおそらく間違った道を進んでいる場合は、他のことを試すことにオープンです。
ありがとう。