我的问题(在Mathematica中)是指在特定数组中给出的变量并以下列方式操作它们(例如):
输入:vars={x,y,z}, system=some ODE like x^2+3*x*y+...etc(注意我实际上并没有创建变量 xy 和 z)
目标:
为列表“var”中的变量赋值,目的是将这些值输入到 ODE 系统中。然后,一旦我完成,清除数组 vars 中变量的值,使其处于其原始形式 {x,y,z} (而不是像 {x,1,3} where y=1 and z =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 不是有效变量)。
如果我错过了什么,或者如果我走错了路,我愿意尝试其他事情。
谢谢。