今天我做了两件事,其一是了解了样条插值的概念,其二是观察了使用有限差分方法求解的调和场。做这两件事都用到了gnuplot。
Gnuplot是一个可用于作图的免费软件。使用它可以将数值计算的结果以图像的方式呈现,以获得直观的感受。
观察插值函数
试想原本有一个连续函数,由于测量的原因现在只知道其中的个别点的位置。
但是我想知道中间某个点处的函数值,我会这么做:用一条光滑的曲线把这些点连接起来,然后根据图像来找到对应的函数值。这就是科学实验中常用的图解法的原理。
继续阅读 →本定理来自一道算法竞赛题:
给定任意多条边,每条边都是不超过1,000,000,000的正整数。请给出一个算法,判断其中是否存在3条边可以构成三角形。
应用该定理可以有效地解决此问题。
定理
给定n个边长,如果其中最大的边长与最小的边长的比值小于第n个斐波那契数,那么其中必存在3个边长可以构成三角形。
应用
由题中条件可知,最大的边长和最短的边长的比值不超过\(1,000,000,000 < F_{45}\)。所以,只要边的个数达到45,根据上述定理,就必然存在3条边可以构成三角形。如果边的个数少于45个,也很好办,穷举解决即可(\({45 \choose 3} = 14190\),穷举量很小)。
继续阅读 →Lua本身已经是一个十分轻量级的脚本语言。在我的64位Windows上编译出来的lua53.dll
仅248K。(参照物:python34.dll
为3963K。)
Lua Technical Note 1介绍了通过删减功能来进一步减小Lua的二进制体积的方法。这篇文章针对的是Lua 3.2,16年前的版本,尽管如此,它仍然给了我很大的启发。
首先看Lua 5.3中哪些模块占用的二进制体积最多:
size %all %core file
23571 7% 12% lauxlib.o
20909 6% 11% lparser.o
20256 6% 11% lapi.o
18403 5% 10% lvm.o
14413 4% 8% llex.o
13526 4% 7% lcode.o
12584 4% 7% lgc.o
10214 3% 5% ldebug.o
8967 3% 5% lobject.o
8776 2% 5% ldo.o
7002 2% 4% ltable.o
5087 1% 3% lundump.o
4887 1% 3% lstate.o
3970 1% 2% ltm.o
3832 1% 2% ldump.o
2818 1% 1% lstring.o
2525 1% 1% lfunc.o
2170 1% 1% linit.o
1810 1% 1% lopcodes.o
1498 0% 1% lmem.o
1406 0% 1% lzio.o
860 0% 0% lctype.o
189484 54% 100% (core)
继续阅读 →Lua在有些地方没有采用其他语言(尤其是C)的约定俗成,所以经常给程序编写者带来惊喜(surprise, “gotcha”)。根据我的经验,整理如下:
- 不等号是
~=
,而不是!=
。
- 这是我写Lua程序时最常犯的一个笔误。只能说,几乎所有的程序语言,不等号用的都是
!=
(C家族),还有一部分用<>
(Pascal, Basic, SQL)。用~=
真的只有Lua一家。
继续阅读 →在显示器上画出的各种图形中,直线是最简单的一种。这里说的直线,有确定的起点和终点;数学家也许更愿意称其为线段。
画直线是如此的简单,以至于人们也许已经忽略了它也是逐个像素点绘制出来的,而把它当作一种原子的操作。我也是如此认为,直到昨天一位同学谈他的计算机图形学课程时,说到了这个问题。
于是我尝试用自己的知识来解决这个问题。显示器上的直线和数学上的线段最明显的差别是,前者是由有限个点构成的,而后者不是。所以,显示器上的直线只是一种近似,而我要使得这种近似的效果尽量好。
为了简化问题,假设显示器显示的是一幅单色的位图。我想到的做法是这样的:
- 画起点。
- 画完一个点后,在其周围的点中,找到距离给定直线最近的点,然后画这个点。
- 重复第2步,直到画了终点为止。
这个做法看上去应该没有问题,只有一些细节部分需要考虑。
继续阅读 →我今天发现MinGW内置的打印函数__mingw_printf
在处理%a
格式的时候会产生不正确的输出。下面这段程序体现了这个问题。
#include <stdio.h>
#include <stdarg.h>
int main()
{
printf("%a %a\n", 1.0, 1.1);
__mingw_printf("%a %a\n", 1.0, 1.1);
return 0;
}
输出是
0x1.000000p+0 0x1.19999ap+0
0x0p-63 0x8.cccccccccccdp-3
因为浮点数1.0
显然不能表示为0x0p-63
,所以__mingw_printf
是错的。
这个错误我提交在 http://sourceforge.net/p/mingw-w64/bugs/459/ ,过几天我看看有没有人回应。
继续阅读 →在连连看游戏中,两个图案可以消去的条件是:
- 两者图案相同。
- 两种直接存在一条通路,它是一条只经过没有图案的地方、且转折点不超过2个的折线。满足此条件的两个图案被称为是可相连的。
要判断条件1非常容易,所以主要考虑怎样判断条件2。举一个具体的例子如下,图中空格表示没有图案的地方,字母和#
表示图案,-+|
表示路径。
### ##A#
# ### |#
+-----+#
A#######
在这个例子中,A和A是可相连的。图中所给出的路径含有两个转折点。
对于此类问题,能否给出一个普遍的判断方法?在实际问题中(例如在连连看游戏里),如果判定两个图案是可相连的,还要指出一条具体的路径。
继续阅读 →今天是大学物理课期末考试的日子。大约是昨天,物理老师在他和学生的邮箱里发了一封邮件,内容主要是回应网络上出现的针对他的,以及针对物理教学的一些错误言论。有些内容看起来真是可笑而可悲。
他讲的课,钻研和探究的成分要多一些。有的时候也会偏离主题,谈到他的人生经历和感悟上面去——同学们称之为“扯淡”。由于过多的钻研和“扯淡”,我们班的课程比其他班慢了许多。有的同学不满意,在网上开帖子骂他。
理想的情况是老师和学生应当保持一种平等的关系——在网上攻击老师,显然不是这种关系的体现。但是现状是,考试是第一位的,对于班里众多的优秀学生而言尤其如此。在他们看来,好的老师应该做的,就是尽他所能让学生考出高的分数。选择自己的教学模式本应是教师的基本权利,现在却因为必须迎合学生的需求,变成了mission impossible。这难道不算是大学教育乃至整个教育体制的一种悲哀?
继续阅读 →我需要一个可靠的地方存放我的文字。曾经试过很多办法,无论是纸质的、电子的或是基于网络的形式,都感觉不太靠谱:
- 纸质的记事本,某一天弄丢了,就找不回来了。
- 在本机记录的文本,不方便保存历史记录,在更换电脑的时候有可能忘记迁移数据。
- 基于网络的内容管理系统,服务的稳定性是一个很大的问题,当我需要从一个平台迁移到另一个平台的时候,导入/导出也是一个艰巨的工作。
现在我用Git来管理我这些文字,并且上传到GitHub服务器中。利用GitHub.io提供的Web服务进行展示。我认为有如下的好处。
继续阅读 →