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

tel*_*f14 14 wolfram-mathematica equations equation-solving

我最近重新发现了Roman Maeder的一个小包,它告诉Mathematica自动在算术和类似函数上进行线程,例如x == y.链接到Maeder的包裹.

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

In[1]:= Needs["EqualThread`"]
Run Code Online (Sandbox Code Playgroud)

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

In[7]:= a == b Log[2 x]
In[8]:= %/b
Out[8]:= a/b == Log[2 x]
Run Code Online (Sandbox Code Playgroud)

取指数:

In[9]:= Exp[%]
Out[9]= E^(a/b) == 2 x
Run Code Online (Sandbox Code Playgroud)

除以2:

In[10]:= %/2
Out[10]= (E^(a/b))/2 == x
Run Code Online (Sandbox Code Playgroud)

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

Dr.*_*ius 11

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

当我写作

Boole[a==b]  
Run Code Online (Sandbox Code Playgroud)

我不想要

Boole[a] == Boole[b]  
Run Code Online (Sandbox Code Playgroud)

这就是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!


Sas*_*sha 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
Run Code Online (Sandbox Code Playgroud)

但:

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

Out[87]= a^True == b^True
Run Code Online (Sandbox Code Playgroud)