2012-05-14

LyX 备忘录 - 1

LyX是个很便捷的学术文档编辑器,以下是我最近使用的一些心得(以后会定期更新):

 

1.输入公式可以从 MathType 直接粘贴 latex 代码过来  (最好采用 AMSLaTeX 格式——在 MathType 的粘贴选项可以调整, 并且采用 inline 形式)
然后只需选中代码,按 Ctrl+M 快捷键即可。

 

2.多行公式采用 align 环境对其等号, 逐行粘贴;
把等号以及等号右边的内容放入第二列,第一列留空;
每行还可以单独编号,另外可以分别插入标签、进行交叉引用,很方便。

 

3.按章节编号仅需在导言内写入
\numberwithin{equation}{section}%设置公式按章节进行编号

生成的 latex 代码可以通过 latex2wp.py 程序转换为 Wordpress.com 识别的 HTML (不过正确率不高),方法是:
打开 Windows 命令窗,输入
python “C:\Python26\latex2wp.py" "***\***.tex"

 

2012-05-09

Mathematica Tips – 2

1.Module[]中注意加分号, 否则在计算时会出现意想不到的错误;而且格式化代码时会乱掉.


2.提取列表中的某一项元素出现的位置
Position[{a, b, a, a, b, c, b}, b]


3.Reap 和 Sow 用法:
In[3]:= Reap[Sow[1, {x, x}]; Sow[2, y]; Sow[4, x], {x, x, y}]
Out[3]= {4, {{{1, 1, 4}}, {{1, 1, 4}}, {{2}}}}

关于Reap和Sow以及Scan的一个巧妙用法:
In[18]:= partition[l_, v_, comp_] :=
Flatten /@
  Reap[Scan[
     Which[comp[#1, v], Sow[#1, less], comp[v, #1], Sow[#1, large],
       True, Sow[#1, equ]] &, l], {large, equ, less}][[2]]

In[19]:= partition[{3, 5, 7, 9, 2, 4, 6, 8, 3, 4}, 4, Less]
Out[19]= {{5,7,9,6,8},{4,4},{3,2,3}}


4.不要轻易加脚标:
Subscript[s, k] = Array[0 &, nK];
Subscript[s, k][[1]] = 1;


5.Map(/@) 和 Apply(@@) 对比:

Map不是替换,而是把函数映射到列表的每一个元素, 即把元素分别传递给函数的变量:
In[295]:= f /@ {1, 2, 3, 4, 5}
Out[295]= {f[1], f[2], f[3], f[4], f[5]}

Apply 自动把列表中的元素传递给多变量函数(也就是它仅仅替换函数头),@@@形式自动作用于第一层
In[52]:= Mod[#1, #2] & @@@ {{10, 4}, {5, 2}}
Out[52]= {2,1}

同样的效果, 二者结合方式(借助纯函数):
In[41]:= Apply[Mod, #] & /@ {{10, 4}, {5, 2}}
Out[41]= {2,1}

6.Evaluate函数很有用:
    In[1]:= ch = ChebyshevT[5, x]
    Out[1]= 16 x^5-20 x^3+5 x

    In[4]:= Function[x, Evaluate[ch]]
    Out[4]= x\[Function]16 x^5-20 x^3+5 x

    In[5]:= %[10]
    Out[5]= 1580050
   
   
7.Compile 函数可以提高数值运算速度! (当然采用内部函数是最快的)
它不但可以处理数学表达式,还可以处理各种简单的 Mathematica 程序. 例如,Compile 可以处理条件和控制流结构.
对比:
1.使用Compile:
In[40]:= newtonIteration :=
  Compile[{x, {n, _Integer}}, Module[{t}, t = x;
    Do[t = (t + x/t)/2, {n}]; t]];
newtonIteration[2.4, 666666] // Timing

Out[41]= {0.094,1.54919}

2.不使用Compile:
In[42]:= newtonIteration2[x_, n_] := Module[{t}, t = x;
   Do[t = (t + x/t)/2, {n}]; t];
newtonIteration2[2.4, 666666] // Timing

Out[43]= {2.137,1.54919}

运行时间相差20倍.


8.编写高效代码最重要的方式之一就是要避免显式部分引用,特别是在内部循环中.

如果将要进行实数的操作,一定要确保使用实数进行初始化.

混合的符号/数值矩阵通常比操作数值矩阵要慢.

一个整数矩阵将使用符号计算技术,其速度较慢, 但可以给出精确解。


9.条件迭代:
ff = # + 1 &;
NestWhileList[ff, 2, # < 5 &]

双层迭代的一个例子:
Mp = Table[1, {1}, {4}]
Module[{i, k},
For[i = 1, i < 5, i++,
   Mpp = {};
   Do[AppendTo[Mpp, Sin[k + i]];
    , {k, 4}];
   AppendTo[Mp, Mpp]];]
Mp

 

10.迭代例子2:

intN = 10;
intK = 200;
(*注意是矩阵*)pki = RandomInteger[{1, 2 intK}, {1, intK}];
mA = RandomInteger[{1, 2 intK}, {intK, intN}];
ak = RandomInteger[{1, 2 intK}, {intK, intN}];
y = RandomInteger[{1, 2 intK}, intN];
(*mP[list_]:=DiagonalMatrix[list];*)
(*Subscript[R, y](i)更新*)
Ryi[i_] := mA\[HermitianConjugate].(DiagonalMatrix[pki[[i]]]).mA;
Ryi[1] = RandomInteger[{1, 2 intN}, {intN, intN}];
(*Subscript[p, k](i)更新*)
pkki[k_, i_] := (Abs[ak[[k]]\[Conjugate].Inverse[Ryi[i - 1]].y])^2/(ak[[k]]\[Conjugate].Inverse[Ryi[i - 1]].ak[[k]])^2;


For[i = 1; endCond = 1, endCond > 10^-4(*i<=11*), i++,
bufMp = {};
Do[AppendTo[bufMp,(*N[ pkki[k,i+1] ]*)pkki[k, i + 1]];
  , {k, intK}];
(*AppendTo使用需要注意层次*)
AppendTo[pki, bufMp];
endCond = Norm[pki[[i + 1]] - pki[[i]]]/Norm[pki[[i]]];
]
vectorPk = pki[[i]]

2012-05-06

斯坦曼的传奇

RALPH

 

今天在《环球科学》上读到关于2011年诺贝尔医学奖获得者拉尔夫·斯坦曼的故事。

合上那本薄薄的小册子后,在安静的图书馆内,我几乎要落下泪来。

斯坦曼是一位研究免疫学的科学家,数十年如一日,他研究一种名为「树突状细胞」的免疫系统关键细胞,这种细胞是一种抵抗病毒、癌细胞侵蚀的强有力武器,这种细胞的发现以及工作机理,在他之前,无人知晓。

他开创了一个关于免疫学的崭新领域,这个新的领域致力于研究具有高度针对性的免疫方法——即人工「训练」树突状细胞,使之对特定致病物质产生抗体,这种方法治疗效率很高,而且完全没有副作用;对于癌症病人来说,定期的化疗、放疗无异于慢性自杀,病患到最后都是在形容枯槁中痛苦死去。而基于树突状细胞的免疫疗法仅仅作用于病灶,而且训练用的抗原也是来自病患自身的癌细胞,针对性非常强——这几乎为未来治愈癌症、艾滋病等绝症提供了最有希望的前景。

可惜的是,这样的理论,来得太晚。

斯坦曼自己,在2007年初不行罹患胰腺癌:一种确诊后仅有5%的患者可以存活超过一年的绝症。

他在获知这一噩耗后做出了一名科学家所独有的理性反应——他希望做自己理论的「小白鼠」。

他立刻召集往日的同事和同行,将自己的情况和盘托出,然后全面地分析自己的病情,开始着手制定治疗计划。

彼时,他的好友都认为他活不过一年。只有他自己很是乐观,因为他相信自己的理论。

事实证明,他是对的。在几个月的常规治疗后,以他体内的树突状细胞和癌细胞为基础配制出的第一批疫苗被生产出来,在以往的情况,这么快研究出来的新药是不会通过FDA的临床试验批准的,可是负责研制疫苗的都是他的好友和学生,他们甚至比斯坦曼自己更希望他能活下去,多方的努力终于使得斯坦曼在第一时间用上了新疫苗。

效果是显著的,他活过了第一个秋天。

斯坦曼依然在不辞辛劳地工作,癌症对他来说似乎没有任何影响,他乐于成为自己理论的实验品,他唯一的忧虑就是:自己的智慧会赶不上癌细胞的狡黠。

于是他与各大制药公司联络,与多所大学的专家探讨,详细分析自己的免疫反应,他甚至不顾生命正在受到威胁,居然要求放缓对自己的治疗,以便更全面地分析样本,为将来的研究积累数据……

有句话是这么形容科学家的:「他把科学事业看得比生命更重要」——斯坦曼本人完美诠释了这句话。

第二个秋天过去了,然后是第三个、第四个。

他平安无恙地度过了四个春秋,对于一位胰腺癌病患来说,这是一个奇迹。

在此期间,他和同事们尝试了一系列基于树突状细胞的治疗方案,四年间,又有五种疫苗被研制出来。

遗憾的是,科学不是魔法。兴许对于很多人来说,科学与魔法无异,但科学始终是不完备的,科学的进步,就在于有许多聪明的头脑和笃定的意志在不断地推进它的完善。只是,有时铁面无私的自然定律会压倒人类的希冀,古往今来,多少令人扼腕叹息的故事一次次地发生……在这种时候,我们不妨说,这就是命运吧。

2011年9月30日,斯坦曼在罹患急性肺炎后不到半月,终于撒手人寰。

三天后,瑞典皇家科学院宣布,拉尔夫·斯坦曼获得2011年诺贝尔生理学或医学奖。

那天晚上,诺贝尔奖评选委员会将获奖通知发送到斯坦曼的邮箱,而当时除了斯坦曼的家人和少数医生外,几乎没人知道他已经去世了——仅仅在数天前,他仍在实验室里埋头工作。

斯坦曼的女儿最先从父亲的黑莓手机上看到这封邮件,然后她的第一反应是赶快去告诉爸爸。就在一周前,斯坦曼还跟她开玩笑,说一定要坚持活到被授予诺贝尔奖的时刻,因为诺奖是不会颁发给死人的。

是啊,命运,总是命运在捉弄人。

诺贝尔奖的惯例,是仅仅奖励在世的人类,现在面对这样的境地,斯德哥尔摩的委员会成员们很为难。不过,最终,由于斯坦曼的死讯来得太突然让人来不及反应,由于他的巨大贡献以及众望所归,皇家科学院决定为他破一次例——生理学或医学奖名单,不变。

故事到这里似乎该划上句号了。但故事可以结束,科学的探索,永远不会结束。

基于斯坦曼和他的同事所开创的崭新免疫疗法,正在被有条不紊地展开研究,新的疫苗将会一批一批地研制出来。新的科研力量已经开始源源注入,人类在战胜疾病的道路上,不会止步。

中国人常说,一个人的事业后继有人,便「在天之灵,也可瞑目」,不过斯坦曼是科学家,这么说他显得很荒唐。他死了就是死了,他的身体会逐渐成为组成这个世界的物质的一部分,不会有什么在天之灵。但是我们知道,会有一些东西留下来,他的思想、他的人格,会长久地驻留在很多人心里。

这些珍贵的精神遗产,会永远熠熠生辉。

 

2012-5-5