群's profileJunziyang 的个人空间PhotosBlogListsMore Tools Help

Blog


    【原创】BVP4c和BVP5c改进版

            “MATLAB的主要缺点就是计算效率不高!”真的吗?或许是,但更多的可能是你没有找对方法。

            MATLAB是我现在使用最多的数值计算语言。偶尔也用用Fortran,但还是以MATLAB为主,只有在MATLAB计算效率实在难以达到要求的情况下,才会去用Fortran来将瓶颈部分的代码做成MEX供MATLAB调用。通过Fortran MEX计算效率比原来的MATLAB代码通常可以提高10×以上。但只有用过Fortran,才更能体会MATLAB的优点。简单的语法、强大的调试功能、优秀的数据可视化能力、易于算法的实现……。虽然Fortran可以将代码的执行效率提高10×,但编写、调试、维护往往也需要10×的时间。因此,只有需多次执行且在MATLAB中实在无法优化的情况下,我才会考虑通过Fortran MEX来提升效率。

            关于MATLAB代码优化的方法,MATLAB的Help中专门有一章”Techniques for Improving Performance”来进行介绍。网上也有许多文章来专门讨论,比如:Writing Fast MATLAB Code 就是非常不错的一篇。大家可以参考。

            MATLAB的帮助中讲,当用Profiler剖析后发现,程序的大部分时间都开销在MATLAB自带的函数上面的时候,就说明你的代码优化的差不多了。看来Mathwoks对MATLAB中的函数是非常自信的。但最近在做一个课题的时候确发现程序的效率瓶颈恰恰出现在MATLAB的自带函数上,而且慢地让人难以接受。后来经过优化,速度竟有上百倍的提升。看来也不能过分相信MATLAB的自带函数,有些自带函数也是可以进一步优化的,而且潜力巨大。

            我要解决的问题是一个规模较大的常微分方程组的两点边值问题(BVP),使用的是MATLAB中的bvp4c/bvp5c。剖析发现这两个函数中大量使用的稀疏矩阵是影响计算效率的主要原因。后来几经搜索,找到了一篇非常不错的文章 “Creating Sparse Finite-Element Matrices in MATLAB” ,然后抱着试试看的心理,按这篇文章中的方法对bvp4c/bvp5c动了一个小手术,没想到的是,优化后计算速度竟提高了100百以上!!!具有讽刺意味的是,这篇文章正是从Mathwoks的官方网站一个MATLAB设计师的Blog中找到的。

            看一下优化的效果吧。下图是对一个由156个方程构成的BVP系统的计算结果比较,bvp4c和bvp5c是MATLAB的自带函数,bvp4c2和bvp5c2是优化后的函数。若方程数越多,优化后的性能提升越大,对方程数较少情况,优化前后的计算速度无明显差别计算平台:操作系统-Windows XP sp3、CPU-Pentium D 915、内存-1GB、MATLAB R2009a

    Compare

    一次系统的仿真上面的程序需要执行数百次,优化前的速度显然是难以接受的。

    虽说咱不差时间,能省为啥不省呢!大笑优化后的函数可以从下面的链接下载。

    说明:

    1. 目前bvp4c2仅对‘无未知参数’&&‘不用 FJacobian‘情况进行了优化。
    2. 使用方法:解压到MATLABROOT\toolbox\matlab\funfun\; 在你的程序中将bvp4c/bvp5c改为bvp4c2/bvp5c2即可。 

    下载链接:

    Comments

    Please wait...
    Sorry, the comment you entered is too long. Please shorten it.
    You didn't enter anything. Please try again.
    Sorry, we can't add your comment right now. Please try again later.
    To add a comment, you need permission from your parent. Ask for permission
    Your parent has turned off comments.
    Sorry, we can't delete your comment right now. Please try again later.
    You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
    Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
    Complete the security check below to finish leaving your comment.
    The characters you type in the security check must match the characters in the picture or audio.

    To add a comment, sign in with your Windows Live ID (if you use Hotmail, Messenger, or Xbox LIVE, you have a Windows Live ID). Sign in


    Don't have a Windows Live ID? Sign up

    Trackbacks

    The trackback URL for this entry is:
    http://junziyang.spaces.live.com/blog/cns!909609E321D6E37A!498.trak
    Weblogs that reference this entry
    • None