使用 Mathematica 制作真值表

使用 Mathematica 内置的 BooleanTable 函数制作逻辑表达式的真值表。

核心是使用 BooleanTable 函数。以下是代码,使用时修改前两行即可。

expression := {(P && Q && R), (P || Q || R), Xor[P, Q, R]};
variables := {P, Q, R};
table = Reverse@Boole@BooleanTable[expression, variables];
Flatten[{
  {Flatten@{variables, expression}},
  Table[
    Flatten[{
      Characters@IntegerString[i - 1, 2, Length@variables], 
      table[[i]]}],
    {i, 1, Length@table}]
}, 1] // TableForm // TraditionalForm

在 Wolfram Mathematica 10.0 将产生以下的输出。

以上代码的输出

送你一只托里拆利小号

介绍一个具有怪异性质的几何图形——托里拆利小号。

首先考虑函数 y = 1/x 的图象。我们取它在第一象限,且 x > 1 的部分。

下面我们将它绕 x 轴旋转一圈。可以想象,将会得到这样的图形:

旋转得到的图形——托里拆利小号

注意这只“小号”其实是无限长的,图中画出的只是一部分。下面我们来求一下它的体积。根据旋转体体积公式和关于广义积分的熟知的结论(你应该可以在任意一本微积分或数学分析教材中找到),

\(V = \int_1^{\infty} \pi y^2 \mathrm{d}x = \pi \int_1^{\infty} \frac{1}{x^2} \mathrm{d}x = \pi\)

恩,体积是有限的。下面我们来求一下它的表面积:

\(A = \int_1^{\infty} 2 \pi y \sqrt{ 1 + ( \frac{\mathrm{d}y}{\mathrm{d}x} )^2 } \mathrm{d}x = 2 \pi \int_1^{\infty} \frac{ \sqrt{ 1 + \frac{1}{x^4} } }{x} \mathrm{d}x > 2 \pi \int_1^{\infty} \frac{1}{x} \mathrm{d}x = {\infty}\)

这是因为最后那个无穷限积分的分母的次数不同……导致敛散性不同。1/x 恰恰是分界点。那么现在,事情变得有意思了:这只小号具有有限的体积,却具有无限的表面积。如果你还没有看出这一性质的古怪之处,我们换一种直观的语言来叙述:你可以用有限的油漆把它内部充满,但是却无法用油漆把它的内表面刷上一遍。

这个古怪的图形是由意大利数学家埃万杰利斯塔·托里拆利 (Evangelista Torricelli) (对,就是用水银柱测量大气压的那个托里拆利)发明的,世称“托里拆利小号”。当时还没有微积分,他是用祖暅原理证明上述结论的。

参考资料:维基百科“托里拆利小号”条目

(完)

如何科学地将木桶原理批判一番

一只木桶盛水的多少,并不取决于桶壁上最高的那块木块,而是取决于桶壁上高度与正弦曲线偏差最大的那块木块。

给偏科党送上鸡汤一碗。本文将科学地、定量地将木桶原理批判一番。首先,我们将证明以下两个几何体具有相同的体积,也具有相同的侧面积。

……圆柱的一半,横着切或者斜着切

 
 
 
 
 
 
 
 
 
 
 
 
 
 
……这还用证吗?(完)

无敌拟合,有限数列的克星

地球人都知道,对于有限数列,找到一个通项公式是简单的。事实上,对于项数为 n 的数列,我们只需不超过 (n-1) 次的多项式。本文用 Wolfram 语言的代码求这个多项式。……恩,还有点拓展的玩法。

地球人都知道,对于有限数列,找到一个通项公式是简单的。事实上,对于项数为 n 的数列,我们只需不超过 (n-1) 次的多项式。

以下是 Wolfram 语言的代码。

num = 2048;
list = First[RealDigits[num, 10]];
len = Length[list];
fit = Fit[list, Table[y^k, {k, 0, len - 1}], y];
Print[list]; Print@TraditionalForm@fit /. y -> x;
Print@Show[Plot[fit /. y -> x, {x, 0, len + 1}], ListPlot[list]]

这段代码在 Wolfram Mathematica 10.0 将产生以下输出。

无敌拟合代码产生的输出

如果你想玩其他数列,你只需要修改代码第一行中的数字。如果你的数列以 0 开头或者出现了超出 0~9 范围的数,将前两行改为如下所示的一行即可。

list = {1, 9, 4, 9, 1, 0, 0, 1};

你同样能得到一条优美的曲线,精确地穿过你给定的每一个点。这自然得益于 Mathematica 不逊于人的数值功能,同时亦是因为我们有以下结论作为保证。文首曾经提及。

对任意项数为 n 的有限数列,可以找到一个不超过 (n-1) 次的多项式,作为它的通项公式。

……我承认表述得很蹩脚。下面我试着证明它。

设数列为 {a1,a2,a3,…,an},待定多项式 f(x)=b0 + b1x + b2x2 + … + bnxn。对于任意 i = 1,2,3,…,n ,应有 f(i)=ai,由此得方程组

$$\begin{cases}b_{0} + b_{1} + b_{2} + \cdots + b_{n}= a_{1} \\ b_{0} + 2b_{1} + 4b_{2} + \cdots + 2^{n}b_{n}= a_{2} \\ \vdots \quad \quad \quad \vdots \\ b_{0} + nb_{1} + n^{2}b_{2} + \cdots + n^{n}b_{n}= a_{n} \end{cases}$$

好了。数一数,我们有 n 个方程,b0,b1,b2,…,bn 一共 (n+1) 个未知数。当 bi 全为零(i = 0,1,2,…,n),自然万事大吉。否则是非齐次线性方程组,系数矩阵的行向量组线性无关,秩为 n,每个向量增加一个分量后仍线性无关,故增广矩阵秩也为 n,根据线性方程组和矩阵的相关理论,得知这个方程组一定有解。所以符合要求的 f 存在。证毕。

好极了!好开心,这是我首次把线性代数课程学的东西用起来………反正这个证明看起来没什么问题……

回顾一下证明过程,我们注意到, f 不一定要是一个 (n-1) 次多项式。只要它是 (n-1) 个线性无关的函数的线性组合,证明就成立。所以有以下的玩法。

Mathematica 提供的 Fit 函数是很强大滴,它可以接受各种各样的函数,用这些函数的线性组合给出最小二乘拟合。下面的例子,数列是 {1,9,9,6,1,0,0,1},第一组是六个三角函数加上指数、对数、线性函数,第二组是从 0 到 7 次的正弦函数,第三组是个 7 次多项式。效果就比较壮观了。

混入三角、指数对数之后的拟合结果更加壮观。

(完)