atomscf.utils 源代码

from __future__ import annotations

import numpy as np

__all__ = [
    "trapz",
    "normalize_radial_u",
]


[文档] def trapz(y: np.ndarray, r: np.ndarray, w: np.ndarray | None = None) -> float: r"""使用梯形权重对函数进行一维数值积分。 若提供 :data:`w`,则直接返回 :math:`\sum_i w_i y_i`;否则退化为 :func:`numpy.trapz(y, r)` 的行为(均匀或非均匀步长)。 Parameters ---------- y : numpy.ndarray 被积函数离散值 :math:`y(r_i)`。 r : numpy.ndarray 网格坐标 :math:`r_i`。 w : numpy.ndarray, optional 梯形权重 :math:`w_i`;若为 ``None`` 则内部用 ``numpy.trapz`` 计算。 Returns ------- float 积分近似值。 """ if w is not None: if w.shape != y.shape: raise ValueError("w 与 y 的形状必须一致") return float(np.sum(w * y)) return float(np.trapz(y, r))
[文档] def normalize_radial_u(u: np.ndarray, r: np.ndarray, w: np.ndarray) -> tuple[np.ndarray, float]: r"""将径向函数 :math:`u(r)` 归一化到 :math:`\int u^2\,dr=1`。 Parameters ---------- u : numpy.ndarray 径向函数离散值 :math:`u(r_i)`。 r : numpy.ndarray 网格坐标 :math:`r_i`。 w : numpy.ndarray 梯形权重 :math:`w_i`。 Returns ------- u_norm : numpy.ndarray 归一化后的函数值数组。 norm : float 原始函数的范数 :math:`\sqrt{\int u^2\,dr}`。 Notes ----- - 该归一化对应径向方程中 :math:`u(r)` 的标准内积,不包含体积分因子 :math:`4\pi r^2`。 """ if not (u.shape == r.shape == w.shape): raise ValueError("u, r, w 的形状必须一致") norm2 = trapz(u * u, r, w) norm = float(np.sqrt(max(norm2, 1e-300))) return u / norm, norm