|
程序放在Gitee上:https://gitee.com/yhli/misc/tree/master/nebtools
curve版本画出来是这种效果:
line版画出来是这种效果:
代码不复杂,通过这几行指定每个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)
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-23 11:16
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社