方程式线程:为什么默认行为?

时间:2011-04-18 09:54:01

标签: wolfram-mathematica equations equation-solving

我最近重新发现了Roman Maeder的一个小包,它告诉Mathematica在x == y等表达式上自动对算术和类似函数进行线程化。 Link to Maeder's package.

首先,为了演示,这是Maeder给出的一个例子:

In[1]:= Needs["EqualThread`"]

现在继续使用线程行为来解决x'手动'的以下等式:

In[7]:= a == b Log[2 x]
In[8]:= %/b
Out[8]:= a/b == Log[2 x]

现在指数:

In[9]:= Exp[%]
Out[9]= E^(a/b) == 2 x

除以2:

In[10]:= %/2
Out[10]= (E^(a/b))/2 == x

问:从设计的角度来看,有人可以解释为什么Mathematica默认设置为这样吗?自动线程化似乎是Mathematica初学者所期望的行为类型 - 对我来说,至少---也许有人可以提供一两个会导致整个系统出现问题的例子。 (并随意指出任何mathematica无知......)

2 个答案:

答案 0 :(得分:11)

在考虑算术运算时似乎很自然。但情况并非总是如此。

写作时

Boole[a==b]  

我不想要

Boole[a] == Boole[b]  

这就是Maeder的包装。

修改

在下面回答你的评论:

  

我注意到在第5.2节中添加了Boole [],而Maeder的包是为第3版创作的。我想我的问题的核心仍然围绕着“设计”问题。我的意思是,如何解决你指出的问题?对我来说,最明确的方法是宣布你正在使用的变量,不是吗? - 让我感到困惑的是你通常只能通过假设(全局或作为简化等选项)来实现这一点。其他人认为拥有一整套数字属性会更自然吗? (在这方面,常量属性是一个挑逗)

我的回答绝不是对Maeder的包的批评,这很好,但是声明它不应该是在Mma中对待 Equal [] 的主流方式。

Equal []是一个函数,起初并不是特别容易掌握:

    如果lhs和rhs相同,则
  • 返回True
  • 如果通过数字或其他原始数据(如字符串)之间的比较确定lhs和rhs不相等,则
  • 返回False。
  • 当lhs或rhs包含诸如Indeterminate和Overflow之类的对象时,
  • 仍然未被评估。
  • 用于表示符号方程,使用Solve等函数进行操作。

Maeder的包的目的,我理解与你的一致,就是给表达式 lhs == rhs 人类在进行数学运算时使用的相同含义和操作规则。

在数学中,等式是等价关系,在集合中强加偏序,而等式是表达式与这种特定关系相关的断言。

将这些差异与其他Mma“功能”进行比较。 Sin [x] 在Mma中,并且在通常的数学中是相同的(好吧,几乎),并且对于大多数Mma野兽也是如此。然而,有一些Mma构造不能保持与数学概念完全同构:Equal,SameQ,Equivalent等。它们是从数学世界到编程世界的桥梁。它们不是严格的数学概念,而是修改了编程概念来保存它们。

对不起,如果我在哲学方面有所了解。

HTH!

答案 1 :(得分:8)

我想这部分是因为行为不能延伸到不平等。而且因为在评估等值时,行为应该是有意义的:

会很好:

In[85]:= Thread[Power[a == b, 2], Equal]

Out[85]= a^2 == b^2

In[86]:= Thread[Power[a == b, c == d], Equal]

Out[86]= a^c == b^d

但:

In[87]:= Thread[Power[a == b, c == d] /. {c -> 2, d -> 2}, Equal]

Out[87]= a^True == b^True