抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

搭建一个个人维基用来整理知识的想法早已有之,但具体该使用什么方案却迟迟没能定下来。在最初的想法里,我希望满足下面的几项需求:

  • 内容与表现分离
  • 自动化构建
  • 可以使用自己定制的模板
  • 词条的分类灵活,以适应知识体系的逐渐完善
  • 方便建立知识点(词条)间的联系
  • 需要用笔记时能快速提取
  • LaTeX\LaTeX 公式输入
  • 代码块语法高亮

我们知道,赋值等过程中使用 MatrixForm 往往会导致后续的计算失效。比如:

我们知道,Wolfram|Alpha 有一个名为 Step-by-Step Solutions 的功能,可以显示一些数学问题求解的过程。又比如,著名的 Rubi 可以在求解积分的同时显示积分的求解步骤。实际上,这些系统背后大抵都是基于模式匹配和规则变换而实现的,因而原则上来说自己也可以实现一个。当然,就实践而言这些系统都过于复杂了,例如 Rubi 包含了超过六千条规则,其背后的原理远非三言两语可以阐明的。不过,相比于积分,微分的运算规则要简明得多,而且对规则的应用总是简单机械的,并不像积分那样可能会运用到各种技巧。因此,本文将利用 Mathematica 的模式匹配和规则实现一个带步骤符号求导器。

只要输出介质为pdf,就不要使用 eps 和 PSTricks 插图

最近在做 ComputationalOptics包 的时候为了把 LightField 实现为一个比较典型的Wolfram语言风格的对象,使用了很多undocumented方法,这里主要是做一下记录。

需要注意的是,这里的“对象”不是指“面向对象”里所说的对象(虽然也有点关系),而是类似于 Entity 或者 TemporalData 这类的对象。

这篇文章主要是记录一下在回答贴吧上这个问题时所发现的关于Mathematica求导的一些坑。

原问题虽然没有明说,但我推测问题背景应该是波特图之类的问题,具体问题如下:

在使用Mathematica的笔记本的过程中,我们常常希望将它的代码和文档功能结合起来,例如自动将符号计算的公式、图形以文档的书写习惯展示出来,同时隐藏生成代码,使文档显示自然协调。

GeneralUtilities` 是Mathematica从版本10开始新加入的一个上下文。其中提供了大量的实用函数,包括代码生成、调试、静态分析、迭代器对象等各个领域,一定程度上弥补了Mathematica基础设施不足的状况。

背景和问题的引入

众所周知,Wolfram语言作为一个极为“高级”的编程语言,并没有提供指针这类较为底层的内存管理手段。而符号本身几乎总是充当了类似引用的作用,比如

1
2
3
4
set[sym_Symbol]:=sym=1
b=a;
set[b];
a

可以看到符号a的值通过set[b]赋为了1。在这里b形式上充当了类似其它语言中的引用的作用。但这种方式并不通用,只要a已经具有值了,这种平凡的方式就不能起作用了。有的读者可能会想到:=或者Hold封装,不过单靠这些也不能简单地对已具有本值的符号进行修改。因此,本文试图提出一种具有类似其它语言中指针语义的封装,实现对符号的间接操作。

问题的引入

ValueQ是Matheamtica中的一个非常有趣的函数,它判断一个表达式是否会进行求值,而且这种判断有时可以做到无副作用,哪怕求值本身是具有副作用的。比如

1
2
3
4
x=0;
y:=++x
v=ValueQ[y];
{v,x}

会得到{True,0}的结果。这里的ValueQ[y]显然并没有真正对y求值就作出了判断。不过很遗憾的是这其中哪怕只有略微的改动也会使其作用发生变化,例如

1
2
3
4
x=0;
y:=++x
v=ValueQ[y+0];
{v,x}

则会得到{True,1}