yhli0906的个人博客分享 http://blog.sciencenet.cn/u/yhli0906

博文

分享两个画反应路径的脚本

已有 4583 次阅读 2018-8-24 20:18 |系统分类:科研笔记

 程序放在Gitee上:https://gitee.com/yhli/misc/tree/master/nebtools


curve版本画出来是这种效果:

mep_curve.png

line版画出来是这种效果:

mep_line.png

代码不复杂,通过这几行指定每个image的能量和线型:

x = [0, 1, 2, 3, 4]
add_mep(x, [0, 3.04, 2.50, 4.34, 2.67], ["k", "b", "r", "c" ,"m"],
       color="k", linestyle="-", label="Path-A")
add_mep(x, [0, 2.70, 2.95, 1.35, 2.00], ["k", "b", "r", "c" ,"m"],
       color="b", linestyle="-", label="Path-B")


add_mep这个函数接受3个args和很多个kwargs。三个args分别是每个image对应的位置(通常设置为等差级数),每个image的能量,和每个image能级的颜色。剩下的kwargs则指定连接每个image的三次曲线或直线的颜色、线型、图例等。


构造连接每个image的曲线的算法比较有意思,当初想了一会儿才想出来。直接用三次样条插值或者拟合都不行,最终想到将反应路径分段,每两个image之间产生一条曲线。这条曲线在每个image的x坐标处导数等于零,便能保证曲线光滑。两个数据点功能产生四个等式,三次多项式正好有四个待定系数,最终转化成一个线性方程组求根的问题:

A = np.array([[x0**3,   x0**2, x0, 1],
        [x1**3,   x1**2, x1, 1],
        [3*x0**2,  2*x0,  1, 0],
        [3*x1**2,  2*x1,  1, 0]])
b = np.array([y0, y1, 0, 0])
coeff = np.linalg.solve(A, b)
xfi = np.linspace(x0, x1, 51)
yfi = np.polyval(coeff, xfi)





https://blog.sciencenet.cn/blog-2909108-1130989.html


下一篇:QE使用经验总结:画Fatband
收藏 IP: 223.3.121.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-20 05:55

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部