我最近重新发现了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无知...)
关于封装设计的性能和可扩展性,最好是:
Mathematica的表现力经常让我感到困惑,就像这样的愚蠢(?)问题.
我没有找到一个确切的解决方案搜索过...有谁知道如何覆盖Mathematica的默认Monospaced字体,所以所有StandardForm输入/输出,包括在帮助浏览器中,在'Consolas'中呈现?
期权检查员没有多大帮助(可能是因为我不知道我在寻找什么?).还有一个'字体替换'列表---我觉得这看起来很混乱,因为它似乎是循环引用(例如,包括:Courier - > New Courier和New Courier - > Courier)
这是一个比较两种字体125%的屏幕截图.

对于已经分配了与名称"a"关联的DownValues的情况,是否有可接受的方法来阻止将OwnValues分配为相同的名称?(我最初在玩某人试图实现数据字典的时候遇到过这个问题.)
这就是我要避免的意思:
Remove[a];
a[1] := somethingDelayed
a[2] = somethingImmediate;
DownValues[a]
a[1]
a[2]
Run Code Online (Sandbox Code Playgroud)
返回...
{HoldPattern[a[1]] :> somethingDelayed,
HoldPattern[a[2]] :> somethingImmediate}
somethingDelayed
somethingImmediate
Run Code Online (Sandbox Code Playgroud)
现在,如果我们要评估:
a = somethingThatScrewsUpHeads;
(* OwnValues[a] above stored in OwnValues *)
a[1]
a[2]
Run Code Online (Sandbox Code Playgroud)
我们得到......
somethingThatScrewsUpHeads[1]
somethingThatScrewsUpHeads[2]
Run Code Online (Sandbox Code Playgroud)
是否有一种简单/灵活的方法来防止DownValues中任何名称的OwnValues?(Lemme猜测......这是可能的,但会有性能受损吗?)
使用消息Set提醒我们,可以轻松地跨两个列表进行多个分配,而不必分开任何内容.例如:
Remove[x1, x2, y1, y2, z1, z2];
{x1, x2} = {a, b}
Run Code Online (Sandbox Code Playgroud)
执行赋值并返回:
{a, b}
Run Code Online (Sandbox Code Playgroud)
Thread,通常用于生成规则列表,也可以显式调用以实现相同的结果:
Thread[{y1, y2} = {a, b}]
Thread[{z1, z2} -> {a, b}]
Run Code Online (Sandbox Code Playgroud)
得到:
{a, b}
{z1 -> a, z2 -> b}
Run Code Online (Sandbox Code Playgroud)
但是,使用此方法生成局部常量会产生错误.考虑这个简单的示例函数:
Remove[f];
f[x_] :=
With[{{x1, x2} = {a, b}},
x + x1 + x2
]
f[z]
Run Code Online (Sandbox Code Playgroud)
这里出现错误信息:
With::lvset: "Local variable specification {{x1,x2}={a,b}} contains
{x1,x2}={a,b}, which is an assignment to {x1,x2}; only assignments
to symbols are allowed."
Run Code Online (Sandbox Code Playgroud)
错误消息documentation(ref/message/With/lvw)在"更多信息"部分中说," 当With中的第一个元素不是符号赋值列表时,将生成此消息." 鉴于这种解释,我理解为什么我的任务失败的机制.尽管如此,我很困惑并且想知道这是否是WRI的必要限制,还是应该报告的次要设计监督. …
我第一次尝试使用Mathematica并使用TunkRank作为我的首选算法.这是我想出的:
Following = {{2, 3, 4}, {0, 4}, {1, 3}, {1, 4}, {0, 2}}
Followers = {{1, 4}, {2, 3}, {0, 4}, {0, 2}, {0, 1, 3}}
p = 0.05
Influence[x_] := Influence[x] =
Sum[1 + (p * Influence[Followers[[x, i]]])/(1 +
Length[Following[[x]]]), {i, 0, Length[Followers[[x]]]}]
Run Code Online (Sandbox Code Playgroud)
如果您在Mathematica中运行它,您将看到它不仅仅在跟随节点上运行.相反,递归是无限的.我究竟做错了什么?
最近一篇关于Wolfram博客的文章提供了以下函数,以更传统的方式格式化衍生品.
pdConv[f_] :=
TraditionalForm[
f /. Derivative[inds__][g_][vars__] :>
Apply[Defer[D[g[vars], ##]] &,
Transpose[{{vars}, {inds}}] /. {{var_, 0} :>
Sequence[], {var_, 1} :> {var}}]
]
Run Code Online (Sandbox Code Playgroud)
一个示例用途,Dt[d[x, a]] // pdConv给出:

如果不打破一般功能pdConv,有人可以改变它来维持给定的变量顺序,产生如下所示的输出吗?(当然这纯粹是出于个人原因,使得人类可以更容易地进行推导)

我怀疑这将是非常重要的 - 除非有人知道一个Global可以暂时覆盖的魔法选项Block.
对于它的价值,这些SO问题可能是相关的:
function ×2
equations ×1
fonts ×1
frontend ×1
localization ×1
math ×1
package ×1
ranking ×1
recursion ×1
typesetting ×1