⾟普森法求定积分c语⾔_从零开始的科研之路:数值积分
感谢师兄提供的题图。
(想学习代码的,直接看代码即可,⽂字⼤部分都是故事回忆。)
(重申,对数值积分感兴趣的,建议去阅读相关⽂献或教材,本⽂并不重点涉及讨论这些算法。)
Z师兄是个动漫迷,⽼⼆次元,刚进实验室的新⼈⼀般都会被他拿这个当测量⼯具,测⼀测你是不是同好。我刚进去的时候,没看过⼏部动漫,看过的都是热⾎漫,也没聊到⼀块去。后来混熟了发现,这个⼈看的动漫都是卖⾁的(⼤胸妹⼦),卖⾁这个词还是他教我的。很难想象,这个⼈从⼩到⼤都是看国学的。
刚开始科研那会⼉,要算点场论的东西,从很简单的平均场开始,需要⽤到⼀些积分。当时我们组做的事⽐较新的⽅向,所以物理理论⽅⾯⼀般以新为主,不追求精确和深度,平均场就够⽤了。
虽然我本科学过数值⽅法这门课,讲过数值积分的⽅法,但是我都忘得差不多,想起来只是记得矩形积分。基本思想就是,积分就是算曲线下的⾯积,将⾯积细分,每⼀块⽤矩形近似,减⼩分的区间(增加分的次数),就可以逼近真正的⾯积。
实现如下:我们以
上述编程⽅法是函数式的范式,函数本⾝可以作为参数调⽤。说起来,当时,Z师兄贼得意⾃⼰的fortran代码(虽然在我看来是⼜臭⼜长,⾥⾯还有shell作为胶⽔语⾔,外加gnuplot作图),但是他喜欢把⾃⼰的代码说成,输⼊⼀个哈密顿量(即物理系统),就能输出你要的所有东西(当然是平均场的结果)。他的原话是,这样有新的活来了,出结果就很快。我很赞同,这种⽤封装的思想,但他的代码并不是函数式的,各部分耦合程度很⾼。来新的⼯作了,他需要改很多个只有他⾃⼰能记住的⽂件。他还做过这么⼀个事,专门写了个函数⽤来产⽣代码,⽤的⽅法是加个引号作为字符串输出到⽂
件。他特别喜欢⽤shell在⽂件⾥进进出出,长长的代码宛如裹脚布,也是我喜欢⿊他的地⽅。
当时想着搞定了,有点志得意满,顺便问了问Z师兄怎么做的。他很惊讶,告诉我要⽤⾟普森积分,然后展⽰他的代码。然后我就两个⽅⾯跟他互喷了⼀番:第⼀,有必要⽤⾟普森积分吗?收敛的很好,⾟普森也精确不到哪⾥去;第⼆,他写的⾟普森积分,有必要那么⿇烦吗?他把实现⼀个积分的代码,放在多个⽂件⾥,说为了重复使⽤,要⽤了再引进来。
Z师兄虽然代码很丑,不过可能因为是fortran语⾔特性不⽀持函数调⽤函数(或者他不知道,fortran的东西我忘得差不多了),但是有⼀点,他在科研中遇到的问题⼤部分都靠⾃⼰摸索出了⼀套能解决的策略(虽然很丑,⽽且思想顽固),值得师弟们学习。
以下是⾟普森积分的公式(百度百科)和代码:
我调节了两种积分的区间长度,保持⼀致,可以⽅便公平⽐较。
当然了,当时,我碰到的实际问题没有这么简单。当时,要处理的是个⼆维空间,需要全空间积分,在极坐标下,也有⼀个参数要积分到⽆穷。所以,积分到⽆穷怎么办?我当时问Z师兄。
编程先学c语言还是python他说,”在⼤于某个值,就截断了,能量⼤于那个值,就没分布了“。
我说,”那你怎么知道是收敛的呢,万⼀不收敛“。
他说,”那谁谁谁(国外同⽅向课题组),我问了,也这么做,肯定收敛啊,这个系统怎么可能不收敛。“
因为当时,我们组做的⽅向是超低温领域,确实肯定收敛(虽然我不会证明)。但是,当时我想这也太不严谨了。
这⾥有两种观念,我觉得值得讨论⼀下:
1. (Z观点)在数值计算时没必要做到⾜够精确,能说明问题就⾏。
2. (我的观点,当年很倔强)需要⾜够精确,除了算法本⾝近似,其他地⽅需要尽⼒精确。
当然,我现在觉得,在能说明问题下做到⾜够精确,做不到也不强求(别把⾃⼰卡死在那⼉)。因为我们当时的⼯作重点也不在精确的结果上,基本能说明有这个相区就⾏。
当时,我在C语⾔的科学计算库⾥到了怎么处理区间⽆穷的积分⽅法,然后解决这个问题的。以下是python的代码,可以直接调⽤scipy 中的integrate库:
这个,我也是⾕歌scipy integrate知道,然后现学现卖。
为什么,我不在⼀开始告诉你有这些库呢?
这⾥涉及我的⼀些实际经历和思考感悟:
我觉得遇到问题的时候应该先去思考能不能解决,⽽不是马上去⽹上查答案。直接搜索答案虽然⽅便,但是却失去了⼀次思维训练的机会,如果你感觉你的思维越来越没⾼中的时候活跃,⼤部分原因就是你好久没给他训练的机会了。另⼀⽅⾯,现在⽹上信息太多了,有的时候到答案和看懂答案要花更多的时间。我遇到问题的步骤⼀般是,⾃⼰思考,问旁边的师兄弟,最后⽹上查,查完分享给师兄弟(Z师兄的步骤是,⾃⼰先查,然后再跟师弟们吹嘘,所以我查东西⼀直没他厉害)。我们办公
室之前⼈不多,每个⼈⼤桌⼦,倍⼉爽,交流⽅便。现在改成单位⼩隔间,越来越⽆趣了,据说为了扩招(科研扩招意味着更多⼈的淘汰,真是悲哀)。最后,这种锻炼⽅式在你遇到查不到的问题时(这在科研⾥是常事),发挥⾃⼰解决问题的能⼒,⽽且⾃⼰解决带来的成就感更强(我觉得成就感缺失是很多⼈不能坚持做下去的原因,做不好的时候很挫败,做好的时候却没有实际的⿎励,只会越来越怀疑⾃⼰)。
你问我,更推荐哪种做法(数值积分)?我更推荐第⼀种,因为能快速做出结果。遇到课题后,能⽴马做⼀些定性定量(不要求精确)是很重要的,很多细节优化,都可以放到之后改善,甚⾄有点结果了你能边写⽂章,边优化结果。这主要是因为我遇到的⼯作⼀般是问你有没有这个重要的物理性质。
保证每周⼀更吧,质量可能参差不齐,这次就没有作图,囧。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。