实验P-V数据拟合模块
概述
实验P-V数据拟合模块用于将实验测量的压力-体积数据转换为机器学习势训练所需的晶体结构数据。该模块通过拟合实验数据与DFT计算的晶格常数,生成压力与晶格缩放因子的对应关系,为基于实验数据生成训练集提供支持。
主要功能
实验数据读取: 支持多种编码格式的实验数据文件
数据转换: 将实验P-V数据转换为晶格常数与压力的关系
多项式拟合: 使用多项式拟合压力与晶格常数的关系
结果可视化: 生成拟合结果的图形展示
数据导出: 输出拟合数据供后续结构生成使用
核心函数
read_config 函数
函数签名: read_config(config_file)
功能说明: 读取YAML配置文件,支持多种编码格式以防止编码问题。
参数:
- config_file (str): 配置文件路径
返回值:
- dict: 解析后的配置字典
异常:
- ValueError: 当所有编码格式都失败时抛出
read_exp_data 函数
函数签名: read_exp_data(exp_file, dft_a0, pressure_range=None)
功能说明: 读取实验数据文件并计算对应的晶格常数。
参数:
- exp_file (str): 实验数据文件路径
- dft_a0 (float): DFT计算的零压晶格常数
- pressure_range (tuple, 可选): 压力范围筛选,格式为 (min, max)
返回值:
- tuple: (pressures, a_values) - 压力数组和晶格常数数组
计算公式: .. math:
a = a_0 \times \left( \frac{V}{V_0} \right)^{1/3}
save_dft_a_p_data 函数
函数签名: save_dft_a_p_data(output_dir, pressures, a_values, dft_a0)
功能说明: 保存DFT晶格常数与压力的对应关系数据。
参数:
- output_dir (str): 输出目录
- pressures (array): 压力数据数组
- a_values (array): 晶格常数数据数组
- dft_a0 (float): DFT零压晶格常数
返回值:
- str: 输出文件路径
输出格式: 包含三列数据:压力(GPa)、晶格常数(Å)、缩放因子
fit_pressure_relation 函数
函数签名: fit_pressure_relation(pressures, a_values, poly_degree=4)
功能说明: 使用多项式拟合压力与晶格常数的关系。
参数:
- pressures (array): 压力数据
- a_values (array): 晶格常数数据
- poly_degree (int, 可选): 多项式次数,默认4
返回值:
- tuple: (coefficients, poly_func) - 拟合系数和多项式函数
拟合模型: .. math:
P(a) = B_0 + B_1 a + B_2 a^2 + B_3 a^3 + B_4 a^4
save_fitting_results 函数
函数签名: save_fitting_results(output_dir, coefficients, poly_func, a_values, pressures, dft_a0, pressure_range, num_points=1000)
功能说明: 保存拟合结果和拟合曲线数据。
参数:
- output_dir (str): 输出目录
- coefficients (array): 拟合系数
- poly_func (function): 多项式函数
- a_values (array): 原始晶格常数数据
- pressures (array): 原始压力数据
- dft_a0 (float): DFT零压晶格常数
- pressure_range (tuple): 使用的压力范围
- num_points (int, 可选): 拟合曲线采样点数,默认1000
返回值:
- tuple: (a_fit, p_fit) - 拟合曲线的晶格常数和压力数据
输出文件:
1. fitting_coefficients.txt: 拟合系数和统计信息
2. fit_a_P.data: 拟合曲线数据
plot_fitting_results 函数
函数签名: plot_fitting_results(output_dir, a_values, pressures, a_fit, p_fit, dft_a0, pressure_range)
功能说明: 绘制并保存拟合结果的可视化图像。
参数:
- output_dir (str): 输出目录
- a_values (array): 原始晶格常数数据
- pressures (array): 原始压力数据
- a_fit (array): 拟合曲线晶格常数数据
- p_fit (array): 拟合曲线压力数据
- dft_a0 (float): DFT零压晶格常数
- pressure_range (tuple): 压力范围
输出文件:
- pressure_fitting.png: 双面板拟合结果图
图像内容: - 左图:晶格常数 vs 压力 - 右图:缩放因子 vs 压力
main 函数
函数签名: main(config_file)
功能说明: 模块主函数,执行完整的实验P-V数据拟合流程。
参数:
- config_file (str): 配置文件路径
执行流程: 1. 读取配置文件 2. 读取实验数据 3. 数据转换和计算 4. 多项式拟合 5. 保存结果 6. 生成可视化图像
配置文件结构
实验P-V拟合配置位于配置文件中的 experimental_pv_fitting 部分:
experimental_pv_fitting:
# 必需参数
DFT_a0: 3.615 # DFT计算的零压晶格常数(Å)
EXP_data_file: "experimental_data.txt" # 实验数据文件路径
# 可选参数
output_directory: "./exp_pv_fitting" # 输出目录
polynomial_degree: 4 # 多项式拟合次数
num_fit_points: 1000 # 拟合曲线采样点数
pressure_range: [0, 100] # 压力范围筛选(GPa)
实验数据格式
实验数据文件应为纯文本格式,每行包含压力值和V/V₀比值:
# 压力(GPa) V/V₀
0.0 1.0000
10.0 0.9876
20.0 0.9754
30.0 0.9635
40.0 0.9520
输出文件说明
模块运行后生成以下文件:
DFT_a_P.data: 转换后的实验数据 - 格式:压力(GPa) | 晶格常数(Å) | 缩放因子
fit_a_P.data: 拟合曲线数据 - 格式:晶格常数(Å) | 缩放因子 | 压力(GPa)
fitting_coefficients.txt: 拟合系数和统计信息 - 包含:拟合系数、R²值、DFT_a0、数据统计等
pressure_fitting.png: 可视化图像 - 左图:晶格常数 vs 压力 - 右图:缩放因子 vs 压力
使用方式
命令行调用
# 通过phymlp-kit调用
phymlp-kit exp_pv_structures --input_file config.yaml
# 或直接运行Python脚本
python exp_pv_structures.py input.yaml
Python脚本调用
import exp_pv_structures
# 直接运行
exp_pv_structures.main("my_config.yaml")
# 分步处理
config = exp_pv_structures.read_config("my_config.yaml")
pressures, a_values = exp_pv_structures.read_exp_data(
"exp_data.txt",
dft_a0=3.615
)
coefficients, poly_func = exp_pv_structures.fit_pressure_relation(
pressures,
a_values
)
依赖关系
Python包: - numpy: 数值计算和拟合 - matplotlib: 数据可视化 - PyYAML: 配置文件解析
数据依赖: - 实验P-V数据文件 - DFT计算的零压晶格常数
常见问题
Q1: 实验数据文件读取失败
可能原因: 1. 文件编码不兼容 2. 文件格式不符合要求 3. 数据超出压力范围
解决方案: 1. 确保文件使用UTF-8或ASCII编码 2. 检查数据格式是否符合要求 3. 调整配置文件中的压力范围
Q2: 拟合效果不理想(R²值过低)
可能原因: 1. 实验数据质量差 2. 多项式次数不合适 3. 数据范围过大
解决方案:
1. 检查实验数据质量
2. 调整 polynomial_degree 参数
3. 缩小压力范围
Q3: 晶格常数计算错误
可能原因: 1. DFT_a0 参数错误 2. V/V₀ 数据格式错误
解决方案: 1. 检查DFT计算的晶格常数是否正确 2. 确认实验数据中的V/V₀比值是否正确
应用场景
该模块主要用于:
实验数据验证: 验证DFT计算与实验数据的一致性
训练集扩展: 基于实验数据生成额外的训练结构
状态方程校准: 校准机器学习势的状态方程参数
多尺度建模: 连接原子尺度计算与宏观实验数据
相关模块
/phymlp/auto_generate_set/deform_structures - 形变结构生成
/phymlp/auto_generate_set/birch_murnaghan_fitting - 状态方程拟合
/phymlp/auto_generate_set/generate_extxyz_dataset - 训练集生成