当前位置:首页>python>L-J势场的Python代码实现

L-J势场的Python代码实现

  • 2026-09-28 08:27:21
L-J势场的Python代码实现

前言

最近打算系统的学习一下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 plt  import 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.0    return 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.0      return 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 plt  def U(r, rc):    v = 4 * (1/r**12 - 1/r**6)      v[r>rc] = 0    return v  def F(r, rc):    v = -4 * (-12/r**13 + 6/r**7)          v[r>rc] = 0    return v  rc = 4  r = 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、对于你编程的东西如何分享保存

最新文章

随机文章