这篇日志有点另类——或有点学术——各理工的大神莫要见笑。
刚刚帮一信息的女大神(简称女神:)解决了一个很专业的问题中的一小部分。作为又土又木的我,也确实得意了一会儿。她跟着一个老师做项目,关于天线端口的最优分布,参考文献是一篇博士论文 。昨天下午她花了好长时间给我这个门外汉讲论文的思想。我听的迷迷糊糊的,下面的叙述不知道对不对。
问题是要在一个小区建立一系列天线端口(假设建N个),每个天线端口有L根天线,每根天线都对应一个随机变量(名称忘了)来衡量这根天线对信号的传递。每个端口对应一个随机变量(名称也忘了)来描述这个端口对信号传递的修正。用户位置也是一个随机变量。模型是函数优化,目标函数是一个复杂的随机变量(大概表示通信的容量)对用户位置的期望,也就是使天线尽可能覆盖更大范围吧。总之,这是一个相当复杂的模型,好像叫什么信道模型,当年提出这个模型的大牛一定有不怕死的勇气。进一步看看这个目标函数,它的表达式包含NL+1个随机变量,还含有2N个决策变量,需要求NL个随机变量的函数(是一个以2为底的对数,真数是NL个随机变量和2N个决策变量的一个表达式)的期望。我昨天下午和晚上想这个模型想了好久,一直迷惑不清,最后才意识到,如果不是信息科班出身,根本很难理解这个模型。而我却一直纠结着模型各个参数的意义,到最后连一行代码都没写出来。
毫无疑问,这是一个工科(信息)的问题,一个实际问题经工科人的建模之后成了一个数学问题。具体是怎么建模的,为什么通信容量是那样一个形式,这些都是信息人需要解决的问题 。我不是信息人,所以我根本没能力涉及信息具体的问题。我的思路是将工科的问题归工科,当工科建立了数学模型后,剩下的就是数学问题了。其实学工科实际上是学怎么建立模型以及怎么利用前人建立的模型解决实际问题。我们在学这些模型的时候也要明白:这个问题并不一定非得这样。例如欧拉的梁理论能解决梁因弯矩引起的变形,却不能解决因剪力引起的变形。
度过了昨天下午的迷迷糊糊,以及夜里的辗转反侧,清晨起来后我意识到要用数学的思路看待这个问题。我想这无非是一个函数优化问题,只不过函数有点复杂而已。目标函数含有很多随机变量的期望,而每个期望都能展开成一层无穷积分。每个随机变量是跟决策变量无关的,但为了实现仿真,这些随机变量的分布也是需要变动的,因此是一些参量。要表示一个连续的随机变量,需要引入这个随机变量的密度函数。所以参量实际上是一系列的概率密度函数,那么这个目标函数可以当成所有随机变量的一个泛函。经过这样的一般性的数学理解,我感觉概念顿时清晰了好多,隐隐约约感觉能够通过编程实现。看来将数学的问题归为数学的确是很有效的理解方式。以前学数学的时候很喜欢教材能有一些针对实际问题的例子,似乎看了例子才感觉自己掌握了数学。现在我认为数学越纯粹越好,学数学根本没必要了解某个数学对象的实际含义。实际的含义等学专业知识的时候再思考吧。
我是通过MATLAB编程实现的。为了一般性,以及跟上述数学思想挂钩,我想编一个函数求任意多个相互独立的随机变量的任意函数的期望,这样实际的目标函数就可以调用这最为一般的函数。首先的问题是我拿什么样的数据类型作为这一般函数的参数?假设有n个随机变量,那么我需要n个概率密度函数,直接以函数名作参数一定显得很冗长,调用的时候也不简洁。我最终选择了cell类型,是一个n维的cell,每一个元素是指向某个概率密度函数的句柄。另外用一个句柄指向随机变量的函数,函数返回值是这n个随机变量的函数的期望。因为各个随机变量相互独立,所以n个随机变量的联合概率密度等于各个随机变量的概率密度之积,这样我可以用一个n次循环,每层循环都利用符号积分计算一个随机变量的密度函数与上次循环得到的函数的乘积的广义积分。最终写成的代码(加上用于测试的代码)只有十几行,却具有很大的一般性(如果随机考试能用这个函数,就不用辛辛苦苦分段、分区域积分了)。MATLAB是一个很强大的编程语言,我感觉它的强大之处在于很容易实现数学思想,而把具体的编程细节留给内置函数来实现。当把编程的问题留给编程本身的时候,编出的代码一定是很简洁高效的。
通过对这个问题的思考,我总结了一些思路:
- 理解模型、思考其数学含义的时候不要想着编程实现;
- 理解不了模型,没关系,用数学上最一般的含义理解它;
- 编程时采用的数据结构要尽可能与对象的数学本质一致,MATLAB下尽量向量化。
数学知识、专业知识(各工科互不相同)、编程知识,是每一个工科人都需要掌握的一套知识。但我们怎么用这些知识,怎么清晰地建立三种不同知识的层次关系,是每一个工科人需要思考的问题。
2013-5-1