本世纪初,美国物理学会(AmericanInstituteofPhysics)和IEEE计算机社团(IEEEComputerSociety)的一本联合刊物《科学与工程中的计算》发表了由田纳西大学的JackDongarra和橡树岭国家实验室的FrancisSullivan联名撰写的“世纪十大算法”一文,该文“试图整理出在20世纪对科学和工程领域的发展产生最大影响力的十大算法”。作者苦于“任何选择都将是充满争议的,因为实在是没有最好的算法”,他们只好用编年顺序依次列出了这十项算法领域人类智慧的巅峰之作——给出了一份没有排名的算法排行榜
1、蒙特卡罗算法。1946:JohnvonNeumann,StanUlam,andNickMetropolis
2、单纯形方法。1947:GeorgeDantzig.
3、Krylov子空间迭代算法。1950:MagnusHestenes,EduardStiefel,andCorneliusLanczos。
4、矩阵分解算法。1951:AlstonHouseholder。
5、Fotran最优化编译器。1957:JohnBackus。Fotran在科学计算中具有里程碑性质
6、QR算法。1959–61:J.G.F.Francis
7、快速排序算法。1962:TonyHoare
8、FFT算法。1965:JamesCooley
9、整数关系确定算法(IntegerRelationDetectingAlgorithms)。1977:HelamanFergusonandRodneyForcade
10、快速多极算法(FastMultipoleAlgorithms)。1987:LeslieGreengardandVladimirRokhlin
抛开这种评选是否合理,讲这十个算法的主要原因是其中7个算法(红色)是笔者在实际工程中用过的,有些还做过深入研究,都是工业软件研发的底层技术。
1.蒙特卡罗算法:一种利用随机数的算法,在连续性计算困难的地方,可以近似代替,另外在很多需要预测领域也能派上用场。主要问题是要平衡精度和计算量,曾经多重积分为了提高一点点的精度,计算量要提高一个数量级。
2.单纯形方法:是线性规划优化算法中最基本的算法。很多其他优化算法比如遗传算法,模拟退火,神经网络思路都比单纯形方法更复杂,入选理由可能跟快排一样,思路开创性,对后来算法的影响比较大。
3.Krylov子空间迭代算法:这个在公众号里多次介绍,在实际开发中也经常使用。求解大规模线性方程组必用!(大规模一般DOF至少在百万上,几千万很平常)
4.矩阵分解算法:求解大规模线性方程组过程中必用的数值方法!
5.QR算法:也是求解大规模线性方程组过程中常用的数值方法
6.FFT算法:快速傅里叶变换,不多解释。在电磁场频域时域变换用到
7.快速多极算法:矩量法,边界元法等满秩矩阵求解大规模线性方程组必用算法。商业软件FEKO的多层快速多级在此基础算法上发展而来。
可以看到有四种算法都和大规模线性方程组求解有关。
1JackDongarra,FrancisSullivan,GuestEditorsIntroductionTheTop10Algorithms,ComputinginScienceandEngineering,Volume2,Number1,January/February2000,pages22-23.
2BarryCipra,TheBestofthe20thCentury:EditorsNameTop10Algorithms,SIAMNews,Volume33,Number4,May2000,page1.
3TheTop10ComputationalMethodsofthe20thCentury,IACMExpressions,Number11,September2001,pages5-9.