李云海
分享两个画反应路径的脚本
2018-8-24 20:18
阅读:5119

 程序放在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://wap.sciencenet.cn/blog-2909108-1130989.html?mobile=1

收藏

分享到:

上一篇
当前推荐数:0
推荐到博客首页
网友评论0 条评论
确定删除指定的回复吗?
确定删除本博文吗?