前言
最近打算系统的学习一下MD,再次打开了樊老师的书,并看着单老师的视频,想着自己也用代码实现一下这个L-J势函数吧
参考资料:

《分子动力学模拟-樊哲勇》

《计算材料学:从算法原理到代码实现》
参考视频:
【计算材料学-从算法原理到代码实现】视频教程 | 6.2.1_L-J势的Python代码实现 https://www.bilibili.com/video/BV1qP411p7qK/?share_source=copy_web&vd_source=04215abb9b54bfd46dad12de6403ffbd
课程全部代码:
https://www.materialssimulation.com/courses/book
https://www.bohrium.com/notebooks/9619862904
在微信上搜到了一篇教程,这个应该是对上述教程的搬运。
Lennard-Jones势的Python实现 Lennard-Jones 势的 Python 实现
基于上述的学习资料我开始我的学习
下面代码是对樊book的完善
import matplotlib.pyplot as pltimport numpy as npdef lj_potential(r: np.ndarray, cutoff: float) -> np.ndarray:"""计算 Lennard-Jones 势能参数:r: 距离数组cutoff: 截断半径返回:势能数组"""# 避免除零错误r = np.maximum(r, 1e-8)potential = 4 * (1 / r**12 - 1 / r**6)potential[r > cutoff] = 0.0return potentialdef lj_force(r: np.ndarray, cutoff: float) -> np.ndarray:"""计算 Lennard-Jones 作用力 F = -dU/dr"""r = np.maximum(r, 1e-8)force = -4 * (-12 / r**13 + 6 / r**7)force[r > cutoff] = 0.0return force# ===================== 可配置参数 =====================CUTOFF_RADIUS = 4.0R_MIN, R_MAX = 1.0, 4.0NUM_POINTS = 500# ======================================================# 生成距离数组r_array = np.linspace(R_MIN, R_MAX, NUM_POINTS)# 计算势能与力u_vals = lj_potential(r_array, CUTOFF_RADIUS)f_vals = lj_force(r_array, CUTOFF_RADIUS)# 创建画布与轴fig, ax_energy = plt.subplots(figsize=(6, 4))# --------------------- 绘制势能(左轴)---------------------color_energy = "tab:blue"ax_energy.plot(r_array, u_vals, color=color_energy, label="Potential")ax_energy.axhline(0, ls=":", c="k", alpha=0.5, zorder=-1)ax_energy.set_xlabel(r"Distance ($\sigma$)")ax_energy.set_ylabel(r"Energy ($\epsilon$)", color=color_energy)ax_energy.tick_params(axis="y", labelcolor=color_energy)ax_energy.set_ylim(-1.2, 1.2)ax_energy.grid(True, alpha=0.3)# --------------------- 绘制力(右轴)---------------------ax_force = ax_energy.twinx()color_force = "tab:orange"ax_force.plot(r_array, f_vals, "--", color=color_force, label="Force")ax_force.set_ylabel(r"Force ($\epsilon/\sigma$)", color=color_force)ax_force.tick_params(axis="y", labelcolor=color_force)ax_force.set_ylim(-25, 25)# 自动调整布局plt.tight_layout()# 保存图片plt.savefig("fig-lj.pdf", dpi=300, bbox_inches="tight")plt.close()

这就是物理里最经典的 Lennard-Jones 势,用来描述分子之间的相互作用。
补充点最基础的物理知识:


https://www.materialssimulation.com/courses/book

梯度 = 势能上升的方向
负梯度 = 势能下降的方向
所以:力 = - 势能的梯度

【【初中物理】一口气搞定动能和势能!】
https://www.bilibili.com/video/BV1Cz421a7Sg/?share_source=copy_web&vd_source=04215abb9b54bfd46dad12de6403ffbd
import numpy as npimport matplotlib.pyplot as pltdef U(r, rc):v = 4 * (1/r**12 - 1/r**6)v[r>rc] = 0return vdef F(r, rc):v = -4 * (-12/r**13 + 6/r**7)v[r>rc] = 0return vrc = 4r = np.linspace(1,4,500)fig, ax1 = plt.subplots()ax1.plot(r, U(r,rc))ax2 = ax1.twinx()ax2.plot(r, F(r,rc), '--')plt.savefig("fig.pdf")
jupyter notebook保存为pdf格式新方法--无敌简单快捷


jupyter nbconvert --to html .\6.2.1L-J.ipynb 打开html文件,然后ctrl+P另存为PDF

总结
你将学会
1、如何用python+jupyter进行编程
2、对于你编程的东西如何分享保存