陈晓猫

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: :: 管理 ::

                                                           ----双心软件·代码飞扬
      2000年毕业于中国地质大学,进入了施工单位中铁四局集团第一工程有限公司,刚进单位做技术员,首先接触到的就是日本人的可编程计算器CASIO FX-4800p,跟着技术主管学习了它的使用,慢慢琢磨研究编写简单的线元法坐标计算程序。为了怕曲线参数出错,我用Fortran77语言编写了程序进行复核,程序和计算器计算的能够吻合。
      2003年的时候,在亳阜高速公路12标修建刘小集互通立交,这个互通区有亳阜高速、界阜蚌高速两条主线,ABCDEFGH8个匝道,共10条线路,是安徽省较大的互通区,有不完全缓和曲线等各种种类。主线桥K99+983特大桥全长约1公里,有39个墩台,有预制空心板、箱梁、现浇段多种结构,墩台平行布置、径向布置均有,桥面宽度有宽度渐变段,有超高,结构复杂,主线匝道竖曲线有超高,计算容易出错,必须要有个功能较强的坐标高程计算程序来适应这种复杂情况。采用原有的分段计算平曲线方法,缓1,圆,缓2单独分段,特别是不完全缓和曲线处理,传统的从ZH或HZ点计算回旋线那种教科书式的方法捉襟见肘,卡西欧4800p计算器容量只有4500字节,当时还没有4850p这种计算器(内存28500字节),虽然采用去掉坐标XY中相同位数的高位字节节约了部分空间,但编得下坐标就编不下高程,而且要考虑超高,坐标高程放在两个计算器里面很不方便。这种情况迫使我想办法解决,我查阅了大量相关资料,在聂让主编的《全站仪与高等级公路测量》道路立交匝道的测设相关章节中,终于找到了利用微积分和泰勒展开式,结合切线支距法和解析几何中的坐标旋转,从缓和曲线上任意一点计算缓和曲线任意一点坐标的方法,从ZH或HZ点计算坐标的方法只是这种方法的一个特例,采用这种方法,我把缓1+圆+缓2作为一个整体单独分段,把HY点作为起算点,这样,采用线元法计算,整条缓和曲线不用再重复输入ZH或HZ点的起点里程J、起点坐标方位角CDF,圆曲线半径R,回旋参数A了,每个变量比如里程J=99983.250加上冒号,需要占用12字节,共有14段缓1+圆+缓2这种类型,12*6*2*14=2016字节,减少的字节接近4580p计算器容量的一半,由于HY点的相对固定性,其方位角既可以用程序计算,也可以简单地手算,因而无论完全不完全,对称非对称缓和曲线都可以计算,这样修改之后,为高程计算腾出了许多空间,能够编写部分大部分标高及超高计算。为了节省空间,用完了A~Z的26个字母,每个变量代表一个参数,尽量不重复,这样运行起来子程序单独运行的时候输入的数据不会更改。同时我加上了泰勒展开式中的XY的9、13、11、15等高次方项,保证了匝道计算的精确性,很快淘汰了以前的那种从ZH或HZ点计算缓和曲线的方法。
       2005年的时候,和一个很要好的同事在一起,心梦(qq704728827),他是个电脑程序高手,熟悉Windows消息机制、熟悉API,当然都是Windows原生开发工具VBA、VB、VC之类,他编写了游戏的一个外挂和一个简单的远程监视控制软件,有点类似于木马的运行机制。他把我的这种程序算法利用VBA嵌入到EXCEL中,实现了坐标高程的计算,计算结果保存在excel中。而我对于VBA这种“傍大款”式的开发环境一向不屑一顾,在学校里fortran77是第一门计算机语言,VB是我自学的第二门计算机语言,VB是解释性的语言,很难生成绿色单文件可执行程序,需要msvbvm60.dll等运行库支持,如果引用了控件,还需要控件文件支持,所以对VB不是很感冒,对于VC的博大精深是我们这些非计算机专业人员难以涉足的,开发一些简单的小程序,vs.net平台、c#那庞大夸张的运行库更不是我们理想的选择。我力劝他用VB写程序,可他只喜欢鼓捣他的VBA和VC,网上的坐标高程计算类程序都是收费的,而且功能用起来很不顺手,输入参数界面不直观,对于excel和cad不同的版本兼容性也不好,要么就是在Excel中倒腾来倒腾去的,我一气之下决定自己动手编写。把他写好的VBA子程序直接拷贝到VB中,完善各种输入控件。2005年4月1日,愚人节,在这个有点怪诞的节日,高速公路坐标高程计算程序1.0诞生了!由于铁路线路大部分为大半径,计算简单,该程序主要偏重于公路、试车场坐标高程计算,因此名字叫做高速公路坐标高程计算程序。我的网名叫做心心相印,他的网名叫做心梦,我就说我们合称双心软件好了,而且有一个很有个性的签名档。现在想起当初一起编写代码的那段好时光,身边有个知心朋友,真的非常惬意而且让人怀念。角度处理采用度.分秒的格式,分必须两位数字,秒不足位补零。写这个程序的初衷,就是为卡西欧可编程计算器做个复核,避免出错,刚开始直接输出到txt文件,修改后可导入到全站仪,还可以输出到cad的脚本文件中,cad→工具→运行脚本后就可以生成平曲线图,从平纵曲线的圆滑程度判断参数是否正确,采用cad脚本模式输出非常灵活,脚本修改后可以实现多种要求,后来增加了导出到excel的功能。2005年4月12日,完善主要功能后,1.2版本我把它发布到了天空软件站,这个日期在程序里面一直就没有修改,也没有引起别人的关注。业余爱好而已,没指望靠它挣钱,所以作为一个免费软件发布,源代码及程序全部公开了。
       后来程序在不断完善,陆陆续续地增加一些新的功能,这些功能是我之前没有想到的。这中间遇到了程序上的一些问题,不得不提的一个人就是VB老哥/delphi老哥,学习计算机语言的都看过清华大学谭浩强教授的教材,他是谭浩强的学生,VB和Delphi编程功底非常深厚,我得到了他的一些帮助。2007年,增加了交点法计算的功能,因为卡西欧计算器多半都是用线元法计算,受到这个思想的束缚,我先实现的是线元法的算法,后来增加了交点法计算,也就是特征点计算,这个功能是后来增加的,所以放在后面也没有调整。增加了计算任意交角的中边桩高程计算。2010年增加了批量计算桥梁涵洞通道坐标高程功能,增加了cad在z=0模式下里程标注的功能,增加了设置excel边框、字体、页面设置等功能,这些功能的加入,虽然让打印效果更美观,但由于VBA代码的低效性,输出时间延长了若干秒,没办法,这就是俗称“傍大款”的VBA。
       一个比较重要的更新在2010年9月,我公司在重庆试车场的一个同事问我能否在程序中加入布劳斯曲线计算功能,并且在CASIO计算器中实现,我从他那里拿到了设计参数并着手开始研究布劳斯曲线。参考李运胜博士《布劳斯曲线在高速环道几何设计中的应用》及《高速环道几何线形的运动学评价》两篇论文,高速环道是汽车试验场中专供汽车进行连续高速行驶试验的闭合循环跑道,其常用的几何设计方法有布劳斯曲线设计法和麦克康纳尔曲线设计法。在以上两种高速环道几何设计方法中,我国道路设计工作者对麦克康纳尔曲线设计方法已经有所了解,但对布劳斯曲线的研究却少之又少。目前中国已经建成投产的试车场有海南汽车试验场、定远总后汽车试验场、襄樊汽车试验场、通县交通部公路交通试验场、农安一汽汽车试验场等,其高速环道几何设计都无一例外地采用了麦克康纳尔曲线,但李运胜博士的研究成果表明:在同等设计条件下如果几何线形改用布劳斯曲线,则其高速环道的运动特性可以得到全面的提高。因此,在今后中国高速环道几何设计中,他推荐优先考虑采用布劳斯曲线作为高速环道的几何线形,以获得比麦克康纳尔曲线更佳的运动学特性和行驶舒适性。
      这里说下试车场的一些背景。我公司承建了中国第一个汽车试验场——解放军定远汽车试验场。2003年大众试车场正式建成试车后,一公司在国内试车场领域声名鹊起,上海F1赛车场业主闻名主动邀请公司参与施工。中铁四局一公司逐步成为国内试车场施工队伍中的“金字招牌”。国内一大批知名的汽车厂家纷纷慕名前来洽谈合作事宜。2008年,公司迎来了试车场建设的又一次高潮,大众二期、比亚迪、一汽农安、洛阳一拖、长城等五个试车场同时施工。2010年,承建了重庆试车场和宣城广德试车场。在试车场领域有着举足轻重的位置,2011年1月,在安徽黄山承办中国首次汽车试验场建设发展研讨会。虽然承建了这么多试车场,但由于试车场领域的技术封锁,坐标都是用外国人提供的cad中量取的坐标,或者用软件计算,他们的软件费用昂贵。
      利用泰勒展开式和微积分,我终于首次完成了布劳斯曲线的坐标方程推导,并在程序中增加了布劳斯曲线的分段计算。主程序只需要按照原来的办法分段就行了,在ZH、HY、YH、HZ点断开,第一布劳斯曲线起算点是ZH点,第二布劳斯曲线起算点是HZ点,起算方位角是前进方向上的起算点方位角。中间圆曲线起算点可以是圆上的任意一点。泰勒展开式涉及到5次方项,利用杨辉三角系数展开,求积分,合并之后X坐标有弧长L的1、7-17高次方项,Y坐标有弧长L的4、5、10-13、16-21高次方项,这些高次方项不能省略,否则计算进度达不到1毫米,卡西欧计算器计算时间较长,电脑计算轻而易举。高等数学里面相关的微积分知识还好没有忘记多少,积分学的基本定理就是大名鼎鼎的牛顿莱布尼兹(Newton-Leibniz)公式,这是一个非常重要的公式,它给出了定积分与不定积分之间的联系。定积分近似计算具体实现方法就是采用矩形法、梯形法、抛物线法(辛普森Simpson法)、龙贝格Romberg法、牛顿-柯特斯Newton-Cotes求积公式、高斯Gauss求积公式。复化梯形公式和抛物线求积公式,精度较高,计算较简,使用非常广泛。Romberg求积方法,算法简单,当节点加密提高积分近似程度时,前面的计算结果可以为后面的计算使用,因此,对减少计算量很有好处,并有比较简单的误差估计方法。Gauss型求积,它的几点是不规则的,所以当节点增加时,前面是计算函数值不能被后面利用,计算过程比较麻烦,但精度高,特别是对计算无穷区间上的积分和旁义积分,则是其他方法所不能比的。比较之后我选用了复合辛普森法进行试算,分段数目14段才能满足1毫米的要求,如果要0.1毫米的精度,则分段数目20段才能满足要求。卡西欧可编程计算器利用积分函数,也可以完成定积分近似计算。CASIO 4500、4800、4850的积分计算使用Simpson(辛普森)法,而5800使用Gauss(高斯)法。定积分∫[a,b]f(x)dx在fx-4800P编程计算器中的表达式为∫(f(x),a,b,n),在fx-5800P编程计算器中的表达式为∫(f(x),a,b,tol),其中的f(x)为被积函数,x为积分变量,a为积分下限,b为积分上限,n为分割数,tol为误差允许公差范围。四款计算器中,4500计算器在积分计算中要占用G/H/I/J/K/L六个字母变量,4800/4850计算器则占用K/L/M/N四个字母变量,而5800计算器不占用字母变量。
准备实现的一个功能是加入高速环道麦克康纳尔曲线坐标的计算。算法程序已经明确,缺少的就是切线支距法方位角的推导和具体数据的验证。
      许多程序员可能看过《老程序员十年生涯黯然总结》,作者是一名计算机硕士,这是一篇非常励志的程序员人生总结,他的坚持和毅力最终让他获得了成功。他总结vb程序员的三个境界:
(1)所有代码都只放在窗体文件中的,属于菜鸟级,他们只会从面板上拖控件,设置属性,然后再给事件编码。
(2)工程中有bas模块的,属于中间级,他们已意识到有大量的代码是重复出现的,应该将其抽取出来作为公用模块。
(3)工程中有cls模块的,属于高手,他们已掌握了面向对象的思想,并能应用这种思想来解决实际问题。
      我现在只会在窗体上拖拖控件实现一些简单的功能,作为一个业余程序员,拖拖控件已经够用了。当初学习Fortran77语言的时候,书本上介绍说Fortran语言长于计算,但实际使用过程中发现,Fortran77语言单精度型数据往往不能满足要求,对于双精度型数据运算及转换处理稍不注意就会产生误差,例如定义双精度型变量pi=3.1415926,如果不在后面加上d10之类的数字,他会自动加上一连串莫名其妙的数字,这应该算是Fortran的一个bug,Fortran77编译器运行于DOS下,16位的DOS操作系统与32位Windows操作系统差别不小,不知道后来的Fortran90修改没有。而VB的变体变量默认16位,后面会自动补零,所以VB也是长于计算的。VB虽然很难写出绿色程序,但是只要一个程序算法合理,程序外观界面友好,程序代码健壮可靠,我想绿色不绿色一样会有人喜欢的。“书山有路勤为径,学海无涯苦作舟”,对于程序设计还有很多的东西要学习,对于程序算法希望与大家交流。

posted on 2016-12-24 19:03  陈晓猫  阅读(1235)  评论(4编辑  收藏  举报