1

我的问题(在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 不是有效变量)。

如果我错过了什么,或者如果我走错了路,我愿意尝试其他事情。

谢谢。

4

1 回答 1

1

我不能说我很好地遵循了您的思路,因此这些片段可能会帮助您回答自己的问题,而不是连贯且完整的答案。但是要回答您的最后一个“问题”,我认为您可能会走错路。

顺便说一句,请注意评估表达式

vars = {x,y,z}

实际上确实定义了这三个变量,尽管它没有为它们定义任何重写规则(例如值)。

给定一个多项式poly,您可以使用函数提取其中的变量,Variables[poly]例如

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

应该返回

{x,y}

请注意,我写的是“应该”而不是“确实”,因为我在这台机器上没有 Mathematica,所以我的语法可能有点不靠谱。另请注意,您的示例 ODE 与此无关,但令我震惊的是,您可能可以编写一个包装器来将 ODE 操作为Variables可以从中提取变量的形式。Mathematica 提供了许多其他函数,用于分离表达式并重新组装它们,遵循Variables. 它通常也允许使用在表达式上定义的函数Lists与其他头部,所以它总是值得尝试一下。

有几种广泛适用的方法可以避免在 Mathematica 中设置变量值。例如,你可以写

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

这将评估为

22

x但不为和设置值y。这是一个非常简单的示例,使用(组)替换规则将值临时分配给变量

避免为变量设置值的另一种方法是使用ModulesBlocks两者都定义自己的上下文来定义函数。该文档将告诉您有关这两者的所有信息以及它们之间的区别。

我不禁想到你所有的聪明技巧都在使用Symbol,ToExpression并且ToString有点离题。花一些时间熟悉 Mathematica 的内置功能,然后再进一步走这条路线,您可能会发现您不需要这样做。

最后,用任何语言写出诸如

vars=vars,svars=svars

会导致疯狂。它可能在语法上是正确的,你甚至可以在你第一次编写这样的代码时解密语义,但在一周的时间里,你会因为写它而诅咒年轻的自己。

于 2012-09-24T15:11:58.023 回答