首页 函数目录

    哈达玛矩阵

    H = hadamard(n) 返回阶次为n的哈达玛矩阵.

    n — 矩阵的阶次,非负整数标量
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp


    def hadamard_matrix(input_str):
        """
        构造Hadamard矩阵,对标MATLAB的hadamard函数

        参数:
        input_str (str): 输入字符串,应为正整数n(需满足n是2的幂)

        返回:
            Sympy矩阵或错误信息
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            def _recursive_hadamard(n):
                """递归构造2的幂次阶Hadamard矩阵"""
                if n == 1:
                    return sp.Matrix([[1]])
                H_prev = _recursive_hadamard(n // 2)
                # 矩阵拼接:行拼接和列拼接
                top = H_prev.row_join(H_prev)
                bottom = H_prev.row_join(-H_prev)
                return top.col_join(bottom)

            # 验证输入合法性
            if expr.is_Integer and expr > 0:
                n = int(expr)
                # 检查是否为2的幂
                if (n & (n - 1)) == 0 or n == 1:
                    result = _recursive_hadamard(n)
                else:
                    error = True
            else:
                error = True

            if error:
                return f"输入错误: {input_str}\n提示: n必须是2的幂的正整数"
            return result

        except Exception as e:
            return f"错误: {e}"


    # 示例代码
    if __name__ == "__main__":
        # 示例1:有效输入 n=4
        input1 = '4'
        mat1 = hadamard_matrix(input1)
        print("示例1结果(n=4):\n", mat1)
        # Matrix([[1, 1, 1, 1],
        #         [1, -1, 1, -1],
        #         [1, 1, -1, -1],
        #         [1, -1, -1, 1]])

        # 示例2:边界输入 n=1
        input2 = '1'
        mat2 = hadamard_matrix(input2)
        print("示例2结果(n=1):\n", mat2)
        # Matrix([[1]])
    
    
    半波正弦波信号

    HalfRectSineWave(A)

    A - 数组,或符号表达式
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np
    import ast

    def half_rect_sine_wave(input_str, Fs=20e3, f=1e3, num_cycles=6):
        """
        生成半波整流正弦波。

        参数:
            input_str (str): 输入表达式或时间列表字符串。
                - 若为列表字符串 (如 "[0, 1e-3, 2e-3]"), 表示自定义时间点(秒)。
                - 若为SymPy表达式 (如 "t", "t*0.5"), 表示时间变换公式。
            Fs (float): 采样率 (Hz),默认20kHz。
            f (float): 信号频率 (Hz),默认1kHz。
            num_cycles (int): 生成信号的周期数(仅当输入为表达式时有效),默认6个周期。

        返回:
            tuple: (时间数组, 半波整流后的信号数组) 或错误信息字符串。
        """
        try:
            # 解析输入字符串
            try:
                # 尝试解析为Python列表
                expr = ast.literal_eval(input_str)
                if not isinstance(expr, list):
                    # 不是列表则尝试SymPy解析
                    expr = sp.sympify(input_str)
            except (ValueError, SyntaxError, TypeError):
                # 解析失败则作为SymPy表达式处理
                expr = sp.sympify(input_str)

            # 处理列表输入(自定义时间点)
            if isinstance(expr, list):
                time_values = np.array(expr, dtype=float)
                # 生成正弦波:y = 100*sin(2πf*t)
                y = 100 * np.sin(2 * np.pi * f * time_values)
                y_rectified = np.maximum(y, 0)
                return time_values, y_rectified

            # 处理SymPy表达式
            elif isinstance(expr, sp.Expr):
                # 计算总样本数
                samples_per_cycle = int(Fs / f)
                total_samples = num_cycles * samples_per_cycle
                # 生成时间数组(秒)
                time_base = np.arange(total_samples) / Fs

                # 将表达式转换为函数
                variables = expr.free_symbols
                if variables:
                    func = sp.lambdify(variables, expr, modules='numpy')
                    # 代入时间计算处理后的时间值
                    t_processed = func(time_base)
                else:
                    # 无变量则视为常数表达式
                    t_processed = np.full_like(time_base, float(expr))

                # 生成正弦波并整流
                y = 100 * np.sin(2 * np.pi * f * t_processed)
                y_rectified = np.maximum(y, 0)
                return time_base, y_rectified

            else:
                raise ValueError("输入类型不支持,请输入列表或SymPy表达式。")

        except Exception as e:
            return f"错误: {e}"

    # 示例代码
    if __name__ == "__main__":
        import matplotlib.pyplot as plt

        # 示例1:默认参数生成6个周期的波形
        t1, y1 = half_rect_sine_wave("t")
        plt.figure()
        plt.plot(t1, y1)
        plt.title("默认参数半波整流正弦波")
        plt.xlabel("时间 (秒)")
        plt.ylabel("幅度")

        # 示例2:自定义时间点
        custom_time = [0, 0.0005, 0.001, 0.0015]  # 0, 0.5ms, 1ms, 1.5ms
        t2, y2 = half_rect_sine_wave(str(custom_time))
        plt.figure()
        plt.stem(t2, y2, use_line_collection=True)
        plt.title("自定义时间点半波整流")
        plt.xlabel("时间 (秒)")
        plt.ylabel("幅度")

        # 示例3:带相位偏移的波形
        t3, y3 = half_rect_sine_wave("t + 0.00025", num_cycles=3)  # 0.25ms相位偏移
        plt.figure()
        plt.plot(t3, y3)
        plt.title("带相位偏移的半波整流")
        plt.xlabel("时间 (秒)")
        plt.ylabel("幅度")

        plt.show()
    
    
    汉明窗

    w = hamming(L,sym=1) 返回一个长度为L个点的修正的汉明窗 默认sym=1

    当sym=1, 生成一个对称窗口,用于滤波器设计.

    当sym=0, 生成一个周期性窗口,用于光谱分析.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np
    import scipy.signal as signal


    def hamming_window(input_str):
        """
        生成Hamming窗,对标MATLAB的hamming函数。

        参数:
        input_str (str): 输入字符串,支持以下格式:
                        - 单个数字(如"64")生成对称窗('symmetric')。
                        - 元组(如"(64, 0)"),第二个元素为0生成周期窗('periodic'),非零生成对称窗。

        返回:
            list or str: Hamming窗列表,或错误信息。
        """
        try:
            expr = sp.sympify(input_str)
            result = None

            # 处理元组输入(例如 "(m, flag)")
            if isinstance(expr, tuple) and len(expr) == 2:
                m, flag = expr
                if m.is_number and flag.is_number:
                    m_int = int(m)
                    # flag=0 对应周期窗(sym=False),否则对称窗(sym=True)
                    sym = bool(int(flag) != 0)
                    window = signal.windows.hamming(m_int, sym)
                    result = list(window)
                else:
                    return f"输入错误: 参数必须为数字 {input_str}"

            # 处理单个数字输入(例如 "m")
            elif expr.is_number:
                m_int = int(expr)
                window = signal.windows.hamming(m_int, sym=True)  # 默认对称窗
                result = list(window)

            else:
                return f"输入格式错误: {input_str}"

            return result

        except Exception as e:
            return f"错误: {e}"


    # 示例代码
    if __name__ == "__main__":
        # 生成对称窗(64点,MATLAB默认)
        print("对称窗(64点):", hamming_window("64")[:5])
        # [0.08000000000000007, 0.08228584333191541, 0.08912065558966992, 0.10043650933837528, 0.11612094253961253]

        # 生成周期窗(64点,第二个参数为0)
        print("周期窗(64点):", hamming_window("64, 0")[:5])
        # [0.08000000000000007, 0.08221502573078954, 0.0888387710145141, 0.099807445563184, 0.11501541504480817]
    
    
    汉宁窗

    w = hann(L,sym=1) 返回一个长度为L个点的修正的汉明窗 默认sym=1

    当sym=1, 生成一个对称窗口,用于滤波器设计.

    当sym=0, 生成一个周期性窗口,用于光谱分析.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import scipy.signal as signal


    def hann_window(input_str):
        """
        生成Hann窗(汉宁窗),对标MATLAB的hann函数。

        参数:
        input_str (str): 输入字符串,支持以下格式:
                        - 单个数字(如"64")生成对称窗('symmetric')。
                        - 元组(如"(64, 0)"),第二个元素为0生成周期窗('periodic'),非0生成对称窗。

        返回:
            list or str: Hann窗列表,或错误信息。
        """
        try:
            expr = sp.sympify(input_str)
            result = None

            # 处理元组输入(例如 "(m, flag)")
            if isinstance(expr, tuple) and len(expr) == 2:
                m, flag = expr
                if m.is_number and flag.is_number:
                    m_int = int(m)
                    # flag=0 对应周期窗(sym=False),否则对称窗(sym=True)
                    sym = bool(int(flag) != 0)
                    window = signal.windows.hann(m_int, sym)
                    result = list(window)
                else:
                    return f"输入错误: 参数必须为数字 {input_str}"

            # 处理单个数字输入(例如 "m")
            elif expr.is_number:
                m_int = int(expr)
                window = signal.windows.hann(m_int, sym=True)  # 默认对称窗
                result = list(window)

            else:
                return f"输入格式错误: {input_str}"

            return result

        except Exception as e:
            return f"错误: {e}"


    # 示例代码
    if __name__ == "__main__":
        # 生成对称窗(64点,MATLAB默认)
        print("对称窗(64点):", hann_window("64")[:5])
        # [0.0, 0.002484612317299295, 0.009913756075728086, 0.022213597106929606, 0.03926189406479613]

        # 生成周期窗(64点,第二个参数为0)
        print("周期窗(64点):", hann_window("(64, 0)")[:5])
        # [0.0, 0.002407636663901591, 0.009607359798384785, 0.021529832133895588, 0.03806023374435663]
    
    
    其特征值位于复平面中的垂直线上的矩阵

    H = hanowa(n,alpha) 返回 2×2 分块矩阵, 其中包含四个 n/2×n/2 分块,形式如下.

    [alpha*eye(n/2), -diag(1:n/2)
    diag(1:n/2),    alpha*eye(n/2)]

    参量 n 必须为偶数整数. alpha 的默认值为 -1. A 具有复数特征值,形式为 alpha ± k*i (1 <= k <= n/2).

    n, alpha — 输入,标量
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp


    def hanowa_matrix(input_str):
        """
        构造Hanowa矩阵,对标MATLAB的hanowa函数

        参数:
        input_str (str): 输入字符串,格式为:
            - 单个偶数n: 生成n×n矩阵,默认d=-1
            - 元组(n, d): n为偶数,d为标量参数

        返回:
            Sympy矩阵或错误信息

        Hanowa矩阵结构:
            [[d*I,   -D],
             [ D,   d*I]]
            其中D = diag(1,2,...,m), m = n/2, I为m×m单位矩阵
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            def build_hanowa(n, d=-1):
                """核心构造函数"""
                # 验证n是否为偶数
                if n % 2 != 0 or n <= 0:
                    raise ValueError("n必须是正偶数")

                m = n // 2
                I = sp.eye(m)  # 单位矩阵
                D = sp.diag(*range(1, m + 1))  # 对角矩阵1~m

                # 分块矩阵构造
                top_row = sp.Matrix.hstack(d * I, -D)
                bottom_row = sp.Matrix.hstack(D, d * I)
                return sp.Matrix.vstack(top_row, bottom_row)

            # 输入解析逻辑
            if isinstance(expr, tuple) and len(expr) == 2:
                # 处理(n, d)元组输入
                if expr[0].is_Integer and expr[1].is_number:
                    n = int(expr[0])
                    d = float(expr[1]) if expr[1].is_Float else int(expr[1])
                    result = build_hanowa(n, d)
                else:
                    error = True
            elif expr.is_Integer:
                # 处理单个整数输入
                n = int(expr)
                result = build_hanowa(n)
            else:
                error = True

            if error:
                return f"输入错误: {input_str}\n格式应为'(n, d)'或'n',其中n为正偶数"
            return result

        except ValueError as ve:
            return f"参数错误: {ve}"
        except Exception as e:
            return f"运行时错误: {e}"


    # 示例代码
    if __name__ == "__main__":
        # 示例1:有效输入 (4, -1)
        input1 = '(4, -1)'
        mat1 = hanowa_matrix(input1)
        print("示例1结果(n=4, d=-1):\n", mat1)
        # Matrix([[-1, 0, -1, 0],
        #         [0, -1, 0, -2],
        #         [1, 0, -1, 0],
        #         [0, 2, 0, -1]])

        # 示例2:默认d值测试
        input2 = '6'
        mat2 = hanowa_matrix(input2)
        print("示例2结果(n=6, d=-1):\n", mat2[:, :2])  # 显示前两列
        # Matrix([[-1, 0],
        #         [0, -1],
        #         [0, 0],
        #         [1, 0],
        #         [0, 2],
        #         [0, 0]])

        # 示例3:自定义d值
        input3 = '(2, 5)'
        mat3 = hanowa_matrix(input3)
        print("示例3结果(n=2, d=5):\n", mat3)
        # Matrix([[5, -1],
        #         [1, 5]])
    
    
    汉克尔矩阵

    H = hankel(c) 返回正方形汉克尔矩阵,其中c定义矩阵的第一列,主反对角线以下的元素为零.

    H = hankel(c,r) 返回汉克尔矩阵,第一列为c,最后一行为r.如果c的最后一个元素不同于r的第一个元素,则hankel会发出警告,并对反对角线使用c的最后一个元素

    c — 汉克尔矩阵的第一列,标量,向量

    r — 汉克尔矩阵的最后一行,标量,向量
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp


    def hankel_matrix(input_str):
        """
        构造Hankel矩阵,对标MATLAB的hankel函数。

        参数:
        input_str (str): 输入字符串,格式为:
            - 两个列表的元组:'([c1, c2, ...], [r1, r2, ...])',生成由列向量c和行向量r定义的Hankel矩阵。
            - 单个列表:'[a1, a2, ..., an]',生成n×n的Hankel矩阵,右上三角填充0。

        返回:
            Sympy矩阵或错误信息。
        """
        try:
            expr = sp.sympify(input_str)
            H = None
            error = False

            # 处理两个参数的情况:列向量c和行向量r
            if isinstance(expr, tuple) and len(expr) == 2 and \
                    isinstance(expr[0], list) and isinstance(expr[1], list):
                c, r = expr[0], expr[1]
                rows, cols = len(c), len(r)
                H = sp.Matrix.zeros(rows, cols)

                for i in range(rows):
                    for j in range(cols):
                        if i + j < rows:
                            H[i, j] = c[i + j]  # 填充c的元素
                        else:
                            idx = i + j - rows  # 计算r的索引
                            H[i, j] = r[idx] if idx < len(r) else 0  # 超出部分填充0

            # 处理单个参数的情况,生成方阵
            elif isinstance(expr, list):
                c = expr
                n = len(c)
                H = sp.Matrix.zeros(n, n)

                for i in range(n):
                    for j in range(n):
                        H[i, j] = c[i + j] if i + j < n else 0  # 右上三角填充0

            else:
                error = True

            return H if not error else f"输入错误: {input_str}"
        except Exception as e:
            return f"错误: {e}"


    # 示例代码
    if __name__ == "__main__":
        # 示例1:两个参数生成Hankel矩阵
        input1 = '([1, 2, 3], [3, 4, 5])'
        result1 = hankel_matrix(input1)
        print("示例1结果(两参数):\n", result1)
        # Matrix([[1, 2, 3],
        #         [2, 3, 3],
        #         [3, 3, 4]])

        # 示例2:单个参数生成方阵
        input2 = '[1, 2, 3]'
        result2 = hankel_matrix(input2)
        print("示例2结果(单参数):\n", result2)
        # Matrix([[1, 2, 3],
        #         [2, 3, 0],
        #         [3, 0, 0]])

        # 示例3:r长度不足时填充0
        input3 = '([1, 2, 3], [4, 5])'
        result3 = hankel_matrix(input3)
        print("示例3结果(r长度不足):\n", result3)
        # Matrix([[1, 2],
        #         [2, 3],
        #         [3, 4]])
    
    
    第一类汉克尔函数

    HankelHone(n,z)在复数z平面上有一个从@inf到0的分支切割不连续点.

    n -- 输入, 数值,符号变量,向量,矩阵

    z -- 输入, 数值,符号变量,向量,矩阵
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import scipy.special as sci


    def hankel1_bessel_representation(input_str):
        """
        计算第一类汉克尔函数H1_v(x),对标Wolfram的HankelH1[v,x]。

        参数:
            input_str (str): 输入字符串,格式为 "(v, x)",其中:
                            - v 可以是标量或矩阵
                            - x 可以是标量或矩阵
                            - 若v和x均为矩阵,则形状必须相同

        返回:
            SymPy矩阵/数值 或 str: 计算结果或错误信息
        """
        try:
            expr = sp.sympify(input_str)

            # 检查输入是否为长度为2的SymPy元组(例如 "(v, x)")
            if not (isinstance(expr, tuple) and len(expr) == 2):
                return f"输入错误: 需要两个参数组成的元组,例如 '(v, x)'"

            if all(e.is_number for e in expr):
                v = float(expr[0])
                x = complex(expr[1])
                result = sci.hankel1(v, x)
            elif any(e.free_symbols for e in expr):
                result = sp.hankel1(*expr)
            else:
                error = True

            return result

        except Exception as e:
            return f"错误: {e}"


    # 示例代码
    if __name__ == "__main__":
        # 示例1: 标量计算
        print("H1_2(5) =", hankel1_bessel_representation("2, 5+2j"))
        # (0.02047643629410032+0.050063353169436886j)

        # 示例2: v为标量,x为矩阵
        x_matrix = "1"
        print("\nH1_1(x_matrix):")
        print(hankel1_bessel_representation(f"(1, {x_matrix})"))
        # (0.44005058574493355-0.7812128213002889j)

        v_matrix = "2"
        print("\nH1_v_matrix(x_matrix):")
        print(hankel1_bessel_representation(f"({v_matrix}, {x_matrix})"))
        # (0.11490348493190057-1.6506826068162548j)
    
    
    第二类汉克尔函数

    HankelHtwo(n,z)在复数z平面上有一个从@inf到0的分支切割不连续点.

    n -- 输入, 数值,符号变量,向量,矩阵

    z -- 输入, 数值,符号变量,向量,矩阵
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import scipy.special as sci


    def hankel2_bessel_representation(input_str):
        """
        计算第一类汉克尔函数H1_v(x),对标Wolfram的HankelH1[v,x]。

        参数:
            input_str (str): 输入字符串,格式为 "(v, x)",其中:
                            - v 可以是标量或矩阵
                            - x 可以是标量或矩阵
                            - 若v和x均为矩阵,则形状必须相同

        返回:
            SymPy矩阵/数值 或 str: 计算结果或错误信息
        """
        try:
            expr = sp.sympify(input_str)

            # 检查输入是否为长度为2的SymPy元组(例如 "(v, x)")
            if not (isinstance(expr, tuple) and len(expr) == 2):
                return f"输入错误: 需要两个参数组成的元组,例如 '(v, x)'"

            if all(e.is_number for e in expr):
                v = float(expr[0])
                x = complex(expr[1])
                result = sci.hankel2(v, x)
            elif any(e.free_symbols for e in expr):
                result = sp.hankel2(*expr)
            else:
                error = True

            return result

        except Exception as e:
            return f"错误: {e}"


    # 示例代码
    if __name__ == "__main__":
        # 示例1: 标量计算
        print("H1_2(5) =", hankel2_bessel_representation("2, 5+2j"))
        # (-0.0858294011199319-2.289177410281067j)

        # 示例2: v为标量,x为矩阵
        x_matrix = "1"
        print("\nH1_1(x_matrix):")
        print(hankel2_bessel_representation(f"(1, {x_matrix})"))
        # (0.44005058574493355+0.7812128213002889j)

        v_matrix = "2"
        print("\nH1_v_matrix(x_matrix):")
        print(hankel2_bessel_representation(f"({v_matrix}, {x_matrix})"))
        # (0.11490348493190057+1.6506826068162548j)
    
    
    调和数

    Harmonic(x)返回x的调和函数。对于x的整数值,Harmonic(x)生成调和数。

    x —— 输入,数字|向量|矩阵|多维数组|符号变量|符号表达式
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp


    def harmonic_number(input_str):
        """
        计算调和数H(n) = 1 + 1/2 + ... + 1/n,对标MATLAB的harmonic函数。

        参数:
            input_str (str): 输入字符串,可以是:
                            - 正整数(如"5")
                            - 符号表达式(如"n")
                            - 矩阵(如"[[1, 2], [3, 4]]")

        返回:
            SymPy数值/矩阵/符号表达式 或 str: 计算结果或错误信息
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            if expr.is_number or expr.free_symbols:
                # 标量或符号变量
                # 只有sympy harmonic支持复数, 负数参数,numpy和scipy均不支持。
                result = sp.harmonic(expr).evalf()
            else:
                error = True

            return result if not error else f"输入错误: {input_str}"

        except Exception as e:
            return f"错误: {e}"


    # 示例代码
    if __name__ == "__main__":
        # 示例1: 标量输入
        print("H(5) =", harmonic_number("5+2j"))
        # 2.34499020414819 + 0.347995611554697*I

        # 示例2: 符号输入
        n = sp.symbols('n')
        print("\n符号计算 H(n):", harmonic_number("n"))
        # harmonic(n)

        # 示例3: 非整数输入
        print("\n非整数测试:", harmonic_number("2.5"))
        # 1.68037230554678

        # 示例4: 负数输入
        print("\n负数测试:", harmonic_number("-3"))
        # zoo
    
    
    豪斯多夫距离是一种数学构造,用于度量度量空间子集的两组点的“接近度”。

    这种度量可用于为两个轨迹、数据云或任何点集之间的相似性分配标量分数。

    此函数将返回两组点之间的豪斯多夫距离。
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import ast
    import shapely.geometry as sh


    def hausdorff_distance_shapely(input_str):
        """
        使用坐标点计算两个几何对象之间的豪斯多夫距离。

        参数:
        input_str (str): 一个字符串,代表包含两个几何对象的列表。每个对象是一个坐标点列表(元组或列表)。
                         第一个对象可以是点(1个点)、线(2个点)或多边形(3个及以上点)。第二个对象的定义类似。

        返回:
        float: 两个几何对象之间的豪斯多夫距离。

        示例:
        >>> hausdorff_distance_shapely('[[(0,0)], [(1,1)]]')
        1.4142135623730951
        >>> hausdorff_distance_shapely('[[(0,0), (1,0)], [(2,0), (3,0), (4,0)]]')
        3.0
        """
        # 将输入字符串解析为Python列表结构
        try:
            expr = ast.literal_eval(input_str)
        except (SyntaxError, ValueError) as e:
            raise ValueError("输入格式无效。输入必须是列表的字符串表示形式。") from e

        # 检查输入是否恰好包含两个几何对象
        if not isinstance(expr, (list, tuple)) or len(expr) != 2:
            raise ValueError("输入必须恰好包含两个几何对象。")

        a_points, b_points = expr[0], expr[1]

        # 从点列表创建Shapely对象的函数
        def create_shapely_object(points):
            if not isinstance(points, list) or len(points) < 1:
                raise ValueError("无效的几何对象点。必须是一个非空的坐标列表。")
            # 将所有点转换为元组(以防它们是列表)
            points = [tuple(point) for point in points]
            if len(points) == 1:
                return sh.Point(points[0])
            elif len(points) == 2:
                return sh.LineString(points)
            else:
                return sh.Polygon(points)

        # 为两个几何对象创建Shapely对象
        try:
            obj_a = create_shapely_object(a_points)
            obj_b = create_shapely_object(b_points)
        except Exception as e:
            raise ValueError(f"创建几何对象时出错: {e}") from e

        # 计算并返回豪斯多夫距离
        return obj_a.hausdorff_distance(obj_b)


    # 示范代码
    if __name__ == "__main__":
        # 定义两个几何对象的坐标,这里是一个点和一条线
        input_str = "[[(0, 0)], [(1, 1), (2, 2)]]"
        # 调用函数计算豪斯多夫距离
        result = hausdorff_distance_shapely(input_str)
        print(f"两个几何对象之间的豪斯多夫距离为: {result}")
        # 2.8284271247461903
    
    
    海维赛阶跃函数

    heaviside(x)在x<0时返回值0,在x>0时返回1,在x=0时返回1/2.

    x —— 输入,符号数,符号变量,符号表达式,符号函数,符号向量,符号矩阵
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np


    def heaviside_step_func(input_str):
        """
        对标MATLAB的heaviside函数实现

        参数:
            input_str (str): 输入表达式,支持以下格式:
                - 标量数值(如 '0', '-5.3')
                - 符号表达式(如 'x', 't^2')
                - 矩阵(如 '[[1, 0], [-2, 3]]')

        返回:
            SymPy表达式/矩阵 或错误信息

        特性:
            - x < 0 时返回0
            - x = 0 时返回0.5
            - x > 0 时返回1
            - 支持符号计算
            - 支持矩阵元素级运算
        """
        try:
            expr = sp.sympify(input_str)
            result = None

            def heaviside_scalar(x, half='half'):
                """
                对标MATLAB的 heaviside 函数(处理单个数值标量)

                参数:
                x (float): 输入标量值
                half (str): 'half'(默认)对应MATLAB的 heaviside(x, 'half')
                            'zero' 对应MATLAB的 heaviside(x)

                返回:
                float: Heaviside函数值
                """
                if x > 0:
                    return 1.0
                elif x < 0:
                    return 0.0
                else:  # x == 0
                    return 0.5 if half == 'half' else 0.0

            # 处理标量和符号输入
            if expr.is_number:
                return heaviside_scalar(float(expr))
            elif expr.free_symbols:
                return sp.Heaviside(expr).evalf()

            return f"无法处理的输入类型: {input_str}"

        except Exception as e:
            print(e)


    # 示例测试
    if __name__ == "__main__":
        # 示例1:标量数值测试
        print("示例1(标量正数):", heaviside_step_func("5"))
        # 1.0

        print("示例1(标量零):", heaviside_step_func("0"))
        # 0.5

        print("示例1(标量负数):", heaviside_step_func("-3.2"))
        # 0

        # 示例2:符号运算测试
        x = sp.symbols('x')
        print("\n示例2(符号正数):", heaviside_step_func("x"))
        # Heaviside(x)

        print("示例2(符号零):", heaviside_step_func("Heaviside(0)"))
        # 1.0
    
    
    埃尔米特多项式

    hermiteH(n,x)表示x点处的n次Hermite多项式。

    n —— 多项式的次数, 非负整数|符号变量|符号表达式|符号函数|向量|矩阵

    x —— 输入,数字|向量|矩阵|数组|符号数|符号变量|符号数组|符号函数|符号表达式
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from scipy.special import eval_hermite


    def hermite_polynomial(input_str):
        """
        计算埃尔米特多项式,对标MATLAB的hermiteH函数。

        参数:
            input_str (str): 输入字符串,应为元组形式,如"(n, x)",其中n和x可以是标量或矩阵。

        返回:
            SymPy表达式、矩阵、NaN或错误信息字符串。

        示例:
            >>> hermite_polynomial("(2, x)")
            4*x**2 - 2

            >>> hermite_polynomial("([[0, 1], [2, 3]], y)")
            Matrix([
                [         1,       2*y],
                [4*y**2 - 2, 8*y**3 - 12*y]])

            >>> hermite_polynomial("(-1, x)")
            nan

            >>> hermite_polynomial("(n, x)")
            hermite(n, x)
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            if isinstance(expr, tuple) and len(expr) == 2:

                if all(e.is_number for e in expr):
                    n = int(expr[0])
                    x = float(expr[0])
                    result = eval_hermite(n, x)
                elif any(e.free_symbols for e in expr):
                    n, x = expr
                    if n.is_integer and n >= 0:
                        result = sp.hermite(*expr)
                    else:
                        error = True
                else:
                    error = True
            else:
                error = True

            return result if not error else f"输入错误: {input_str}。"

        except Exception as e:
            return f"错误: {e}"


    # 示例测试
    if __name__ == "__main__":
        # 示例1: 标量计算
        print(hermite_polynomial("(2, 2)"))
        # 14.000000000000004

        # 示例2: 符号计算
        print(hermite_polynomial("(3, x)"))
        # 8*x**3 - 12*x
    
    
    矩阵的黑森贝格形式

    H = hess(A) 查找H,即矩阵A的黑森贝格形式.

    [P,H] = hess(A) 生成黑森贝格矩阵 H 和酉矩阵 P,这样 A = P*H*P' 并且 P'*P = eye(size(A))。

    黑森贝格矩阵包含第一个下对角线下面的零值.如果矩阵对称或者是埃尔米特矩阵,则形状为三对角.

    该矩阵具有和原点相同的特征值,但显示它们所需计算更少.

    A -- 输入,方阵
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from scipy.linalg import hessenberg
    import numpy as np


    def hessenberg_matrix(input_str):
        """
        将输入的矩阵字符串转换为Hessenberg形式,返回Hessenberg矩阵H和变换矩阵Q,对标MATLAB的hess函数。

        参数:
            input_str (str): 表示矩阵的字符串,例如 "[[1, 2], [3, 4]]"。

        返回:
            tuple: 包含Hessenberg矩阵H和变换矩阵Q的元组(均为SymPy矩阵),
                  或错误信息字符串。
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 检查输入是否为元组(不支持)
            if isinstance(expr, tuple):
                error = True
            elif isinstance(expr, list):
                A = sp.Matrix(expr)
                if A.is_square:
                    # 转换为numpy数组进行计算
                    N_A = np.array(A, dtype=float)
                    H_np, Q_np = hessenberg(N_A, calc_q=True)
                    # 转换回SymPy矩阵
                    H = sp.Matrix(H_np)
                    Q = sp.Matrix(Q_np)
                    result = (Q, H)
                else:
                    error = True
            else:
                error = True

            return result if not error else f"输入错误: 无法将'{input_str}'转换为矩阵。"
        except Exception as e:
            return f"错误: {str(e)}"


    # 示例代码
    if __name__ == "__main__":
        # 示例1:正确的方阵输入
        print("示例1:")
        input_1 = "[[1, 2, 3], [4, 5, 6], [7, 8, 9]]"
        result_1 = hessenberg_matrix(input_1)
        if isinstance(result_1, tuple):
            Q, H = result_1
            print("Hessenberg矩阵H:")
            print(H)
            # Matrix([[1.00000000000000, -3.59700730308704, -0.248069469178417],
            #         [-8.06225774829855, 14.0461538461538, 2.83076923076923],
            #         [0, 0.830769230769230, -0.0461538461538478]])

            print("\n变换矩阵Q:")
            print(Q)
            # Matrix([[1.00000000000000, 0, 0],
            #         [0, -0.496138938356834, -0.868243142124459],
            #         [0, -0.868243142124459, 0.496138938356834]])
        else:
            print(result_1)
    
    
    黑塞对角矩阵

    hessdiag(f,v,points) 返回Hessian矩阵的对角元素(第二部分向量).

    如果不指定 v, 则 hessian(f) 查找标量函数 f 相对于由 f 中找到的所有符号变量构成的向量的 Hessian 矩阵。此向量中变量的顺序由 symvar 定义.

    f — 标量函数,符号表达式,符号函数

    v — 查找 Hessian 对角矩阵的向量,符号向量

    points — 数值向量
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp


    def get_result_value(symbols_set, points=None, result=None):
        if points is not None and result is not None:
            if len(points) != len(symbols_set):
                raise ValueError(f"点数({len(points)})与符号数({len(symbols_set)})不匹配")
            subs_dict = dict(zip(symbols_set, points))
            try:
                return result.subs(subs_dict).evalf()
            except Exception as e:
                return result.subs(subs_dict)
        return result


    def hessenberg_diag_matrix(input_str):
        """
            计算给定表达式的黑塞矩阵对角线元素的近似值。

            参数:
            input_str (str): 输入的数学表达式字符串,可以包含变量和数值列表。

            返回:
            sp.Matrix or str: 黑塞矩阵对角线元素的近似值矩阵,如果输入错误则返回错误信息。
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 有限差分步长
            h = 0.001

            def remove_last_from_tuple(tup):
                """
                    移除元组的最后一个元素。

                    参数:
                    tup (tuple): 待处理的元组

                    返回:
                    tuple: 移除最后一个元素后的元组
                """
                return tup[:-1] if len(tup) > 1 else tup

            # 计算黑塞矩阵对角线元素近似值
            def hessian_diag_approx(func, vars, h):
                """
                    计算黑塞矩阵对角线元素的近似值。

                    参数:
                    func: 待求导的函数
                    vars: 自变量列表
                    h: 有限差分步长

                    返回:
                    list: 黑塞矩阵对角线元素的近似值列表
                    """
                diag_elements = []
                for var in vars:
                    f_plus = func.subs(var, var + h)
                    f_minus = func.subs(var, var - h)
                    df2 = (f_plus - 2 * func + f_minus) / (h ** 2)
                    diag_elements.append(df2)
                return diag_elements

            # 这里判断是否需要数值求导,判断最后一项是否是数值列表比如[1,2]代入最后的公式result
            points = None
            if isinstance(expr, tuple) and isinstance(expr[-1], (list, tuple)) and all(item.is_number for item in expr[-1]):
                points = expr[-1]
                expr = remove_last_from_tuple(expr)

            # 初始化函数和自变量
            f = None
            vars = None
            if isinstance(expr, tuple) and expr[0].free_symbols and isinstance(expr[1], (list, tuple)):
                f = expr[0]
                vars = expr[1]
            elif expr.free_symbols:
                f = expr
                vars = list(expr.free_symbols)
            else:
                error = True

            if error:
                return f"输入错误:{input_str}"
            else:
                result = hessian_diag_approx(f, vars, h)
                result = sp.Matrix(result)
                result = get_result_value(vars, points, result)
                return result

        except Exception as e:
            return f"错误:{e}"


    def main():
        # 示范代码
        # 示例 1: 仅表达式,无数值点
        input_str1 = "x**2 + y**2"
        result1 = hessenberg_diag_matrix(input_str1)
        print(f"输入: {input_str1}, 结果: {result1}")
        # Matrix([[-2000000.0*x**2 + 1000000.0*(x - 0.001)**2 + 1000000.0*(x + 0.001)**2],
        #         [-2000000.0*y**2 + 1000000.0*(y - 0.001)**2 + 1000000.0*(y + 0.001)**2]])

        # 示例 2: 表达式和数值点
        input_str2 = "(x**2 + y**2, [x, y], [1, 2])"
        result2 = hessenberg_diag_matrix(input_str2)
        print(f"输入: {input_str2}, 结果: {result2}")
        # Matrix([[1.99999999953434],
        #         [2.00000000000000]])


    if __name__ == "__main__":
        main()
    
    
    黑塞矩阵

    hessian(f,v,points) 查找符号标量函数 f 相对于笛卡尔坐标中的向量 v 的 Hessian 矩阵.

    如果不指定 v, 则 hessian(f) 查找标量函数 f 相对于由 f 中找到的所有符号变量构成的向量的 Hessian 矩阵。此向量中变量的顺序由 symvar 定义.

    f — 标量函数,符号表达式,符号函数

    v — 查找 Hessian 矩阵的向量,符号向量

    points — 数值向量
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp


    def get_result_value(symbols_set, points=None, result=None):
        """
        将符号表达式代入具体数值点求值。

        参数:
            symbols_set: 符号集合(顺序敏感的列表)
            points: 数值点列表,与符号一一对应
            result: 待代入的表达式

        返回:
            代入后的数值结果或符号表达式

        异常:
            ValueError: 当点数与符号数量不匹配时抛出
        """
        if points is not None and result is not None:
            if len(points) != len(symbols_set):
                raise ValueError(f"提供的点数({len(points)})与符号数量({len(symbols_set)})不匹配。")
            subs_dict = {symbol: value for symbol, value in zip(symbols_set, points)}
            try:
                # 尝试数值求值(适用于全数值表达式)
                result = result.subs(subs_dict).evalf()
            except Exception as e:
                # 非数值情况直接进行符号替换
                result = result.subs(subs_dict)
        return result


    def hessian_matrix(input_str):
        """
        对标MATLAB的hessian函数,计算符号标量函数的Hessian矩阵

        参数:
            input_str: 字符串形式的输入,可以是以下形式:
                - 单个表达式(如 "x**2 + y**3")
                - 元组表达式,包含函数和变量列表(如 "(f, [x, y])")
                - 元组表达式,包含函数、变量列表和数值点(如 "(f, [x, y], [1, 2])")

        返回:
            SymPy矩阵对象或错误信息字符串

        示例:
            >>> hessian_matrix("x**2 + y**3")
            Matrix([[2, 0], [0, 6*y]])

            >>> hessian_matrix("(x**2 + y**3, [x, y], [1, 2])")
            Matrix([[2, 0], [0, 12]])
        """
        try:
            # 将输入字符串转换为SymPy表达式(可能是元组、矩阵或普通表达式)
            expr = sp.sympify(input_str)
            error = False
            result = None

            def remove_last_from_tuple(tup):
                """辅助函数:当输入元组包含数值点时,移除最后一个元素"""
                return tup[:-1] if len(tup) > 1 else tup

            # 检查输入是否为带数值点的元组结构(例如 (f, [x,y], [1,2]))
            if isinstance(expr, tuple) and len(expr) >= 2 and isinstance(expr[-1], list):
                # 提取数值点并验证是否为纯数字
                if all(item.is_number for item in expr[-1]):
                    points = expr[-1]
                    expr = remove_last_from_tuple(expr)  # 移除数值点部分
                else:
                    points = None
            else:
                points = None

            # 解析符号变量列表(优先使用用户显式提供的变量列表)
            if isinstance(expr, tuple) and len(expr) == 2 and isinstance(expr[1], list):
                # 输入格式为 (函数, [变量列表])
                f = expr[0]
                symbols = expr[1]
                result = sp.hessian(f, symbols)
            elif hasattr(expr, 'free_symbols'):
                # 输入为单个表达式,自动提取自由符号(注意顺序可能不固定!)
                symbols = list(expr.free_symbols)
                symbols.sort(key=lambda x: x.name)  # 按字母顺序排序以保证一致性
                result = sp.hessian(expr, symbols)
            else:
                raise ValueError("无法识别的输入结构")

            # 如果存在数值点,进行符号替换
            if points is not None:
                result = get_result_value(symbols, points, result)

            # 确保返回的是矩阵类型
            return sp.Matrix(result) if result is not None else None

        except Exception as e:
            return f"错误:{e}"


    if __name__ == "__main__":
        # ----------------- 示例演示 -------------------
        # 示例1:基本用法(自动提取变量)
        print("示例1:", hessian_matrix("x*y+2*z*x"), end='\n\n')
        # Matrix([[0, 1, 2],
        #         [1, 0, 0],
        #         [2, 0, 0]])

        # 示例2:指定变量顺序(推荐方式)
        x, y = sp.symbols('x y')
        print("示例2:", hessian_matrix(f"( {x ** 2 + y ** 3}, [{x}, {y}] )"), end='\n\n')
        # Matrix([[2, 0],
        #         [0, 6*y]])

        # 示例3:带数值代入
        print("示例3:", hessian_matrix(f"( {x ** 2 + y ** 3}, [{x}, {y}], [1, 2] )"), end='\n\n')
        # Matrix([[2.00000000000000, 0],
        #         [0, 12.0000000000000]])

        # 示例4:多变量函数
        z = sp.symbols('z')
        print("示例4:", hessian_matrix(f"x*y + {z}**2"), end='\n\n')
        # Matrix([[0, 1, 0],
        #         [1, 0, 0],
        #         [0, 0, 2]])
    
    
    希尔伯特矩阵

    H = hilb(n) 返回阶数为n的希尔伯特矩阵.希尔伯特矩阵是病态矩阵的典型示例.希尔伯特矩阵的元素由 H(i,j) = 1/(i + j – 1) 指定.

    n — 矩阵的阶次, 非负整数标量,
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np


    def hilb_type_matrix(input_str):
        try:
            # 使用 sympy 的 sympify 函数将输入的字符串转换为 sympy 表达式
            expr = sp.sympify(input_str)
            # 初始化错误标志为 False,表示没有错误
            error = False
            # 初始化结果变量为 None
            result = None

            def hilbert_matrix(n):
                """
                创建一个 n x n 的希尔伯特矩阵。
                希尔伯特矩阵的元素 H[i, j] 定义为 1 / (i + j + 1),其中 i 和 j 是矩阵的行和列索引(从 0 开始)。

                参数:
                n (int): 矩阵的阶数

                返回:
                np.ndarray: 一个 n x n 的希尔伯特矩阵
                """
                # 创建一个 n x n 的零矩阵
                H = np.zeros((n, n))
                # 遍历矩阵的每一行
                for i in range(n):
                    # 遍历矩阵的每一列
                    for j in range(n):
                        # 计算希尔伯特矩阵的元素值
                        H[i, j] = 1 / (i + j + 1)
                return H

            # 检查解析后的表达式是否为元组
            if isinstance(expr, tuple):
                # 如果是元组,将错误标志设置为 True
                error = True
            # 检查解析后的表达式是否为整数
            elif expr.is_integer:
                # 如果是整数,调用 hilbert_matrix 函数生成希尔伯特矩阵
                result = hilbert_matrix(int(expr))
            else:
                # 如果既不是元组也不是整数,将错误标志设置为 True
                error = True

            # 如果没有错误,将结果转换为 sympy 矩阵并返回
            return sp.Matrix(result) if not error else f"输入错误: {input_str}"
        except Exception as e:
            # 如果在处理过程中出现异常,返回错误信息
            return f"错误:{e}"


    print(hilb_type_matrix("4"))
    # Matrix([[1.00000000000000, 0.500000000000000, 0.333333333333333, 0.250000000000000],
    #         [0.500000000000000, 0.333333333333333, 0.250000000000000, 0.200000000000000],
    #         [0.333333333333333, 0.250000000000000, 0.200000000000000, 0.166666666666667],
    #         [0.250000000000000, 0.200000000000000, 0.166666666666667, 0.142857142857143]])
    
    
    直方图箱计数

    [N, edges] = histcounts(X)将X值划分为bin, 并返回bin计数和bin边. histcounts函数使用自动分箱算法,, 该算法返回选择的均匀分箱, 以覆盖X中的元素范围, 并揭示分布的潜在形状.

    [N, edges] = histcounts(X, nbins)使用标量nbins指定的多个容器.

    [N, edges] = histcounts(X. edges)将X排序到具有向量edges指定的bin边的bin中.

    X —— 要在各个存储箱之间分配的数据, 向量, 矩阵

    nbins —— 箱数, 正整数, 指定为正整数的容器数. 如果不指定nbins, 则histcounts会根据X中的值自动计算要使用的箱数.

    edges —— Bin边, 矢量, 指定为向量. 第一个向量元素指定第一个bin的前缘, 最后一个元素指定最后一个bin的后缘. 后缘仅包含在最后一个bin中.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import numpy as np
    import sympy as sp


    def histogram_counts(input_str):
        """
        对标MATLAB的histcounts函数,计算直方图的bin计数和边界。

        参数:
        input_str (str): 输入字符串,应为可解析为数值数据及bins参数的Python字面量。

        返回:
        tuple or str: 成功时返回(计数列表, 边界列表),失败时返回错误信息。
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            data = None
            bins_arg = None

            if isinstance(expr, tuple) and len(expr) == 2:
                if isinstance(expr[0], list):
                    data = np.array(expr[0], dtype=float).ravel()
                    bins_arg = expr[1]
                else:
                    error = True
            elif isinstance(expr, list):
                data = np.array(expr, dtype=float).ravel()
            else:
                error = True

            # 处理bins参数
            if bins_arg is not None:
                if isinstance(bins_arg, (list, tuple, np.ndarray)):
                    bins = np.array(bins_arg, dtype=float)
                elif bins_arg.is_number:
                    bins = int(bins_arg)
                else:
                    return f"bins参数类型错误: {type(bins_arg)}"
                N, edges = np.histogram(data, bins=bins)
            else:
                N, edges = np.histogram(data)

            return list(N), list(edges) if not error else f"输入错误: {input_str}"

        except SyntaxError:
            return f"语法错误: 无法解析输入 {input_str}"
        except ValueError as ve:
            return f"数值错误: {str(ve)}"
        except Exception as e:
            return f"错误: {str(e)}"


    # 基本使用
    print(histogram_counts("[1, 2, 3, 4]"))
    # ([1, 0, 0, 1, 0, 0, 1, 0, 0, 1], [1.0, 1.3, 1.6, 1.9, 2.2, 2.5, 2.8, 3.1, 3.4, 3.6999999999999997, 4.0])

    # 指定bin数量
    print(histogram_counts("([1,2,3,4,5], 2)"))
    # ([2, 3], [1.0, 3.0, 5.0])

    # 指定bin边界
    print(histogram_counts("([1,2,3,4], [0, 2.5, 5])"))
    # ([2, 2], [0.0, 2.5, 5.0])
    
    
    二元直方图bin计数

    [N,Xedges,Yedges] = histcounts2(X,Y)将X和Y中的值划分为多个二维bin, 并返回bin计数以及每个维度的bin边界. histcounts2函数使用自动分bin算法, 然后返回均匀bin, 这些bin可涵盖X和Y中值的范围并显示分布的基本形状.

    [N,Xedges,Yedges] = histcounts2(X,Y,nbins) 指定要在每个维度中使用的 bin 数量.

    [N,Xedges,Yedges] = histcounts2(X,Y,Xedges,Yedges) 按照 Xedges 和 Yedges 指定的 bin 边界, 将 X 和 Y 划分为多个 bin.

    X,Y — 要分布到各 bin 的数据(以单独参量指定),向量, 矩阵

    nbins — 每个维度中的 bin 数量, 正整数标量, 由正整数组成的二元素向量

    Xedges — x 维度中的 bin 边界, 向量

    Yedges — y 维度中的 bin 边界, 向量

    N — bin 计数, 数组

    Xedges — x 维度中的 bin 边界, 向量

    Yedges — y 维度中的 bin 边界, 向量
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np


    def histogram_counts_second(input_str):
        """
        对标MATLAB histcounts2的二元直方图计数函数

        参数:
        input_str (str): SymPy可解析的字符串,格式为:
            (1) (X, Y)
            (2) (X, Y, bins)
            (3) (X, Y, Xedges, Yedges)

        返回:
            (Matrix(N), Xedges, Yedges) 或 错误信息字符串
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 检查是否为包含两个矩阵的元组
            if isinstance(expr, tuple) and isinstance(expr[0], list) and isinstance(expr[1], list):
                # 转换输入数据为numpy数组
                x = expr[0]
                y = expr[1]
                X = np.ravel(np.array(x, dtype=float))
                Y = np.ravel(np.array(y, dtype=float))

                # 参数解析逻辑
                if len(expr) >= 4:  # 处理(X, Y, Xedges, Yedges)情况
                    if isinstance(expr[2], list) and isinstance(expr[3], list):
                        x_edges = expr[2]
                        y_edges = expr[3]
                        bins = [
                            np.ravel(np.array(x_edges, dtype=float)),
                            np.ravel(np.array(y_edges, dtype=float))
                        ]
                        N, Xe, Ye = np.histogram2d(X, Y, bins=bins)
                        result = (sp.Matrix(N), list(Xe), list(Ye))
                    else:
                        error = True
                elif len(expr) == 3:  # 处理bins参数
                    bins_arg = expr[2]
                    # 处理整数型bins
                    if isinstance(bins_arg, sp.Number) and bins_arg.is_integer:
                        N, Xe, Ye = np.histogram2d(X, Y, bins=int(bins_arg))
                    # 处理列表/矩阵型bins
                    elif isinstance(bins_arg, list):
                        bins_mat = bins_arg
                        bins = np.array(bins_mat)
                        N, Xe, Ye = np.histogram2d(X, Y, bins=bins)
                    else:
                        error = True
                    result = (sp.Matrix(N), list(Xe), list(Ye)) if not error else None
                else:  # 默认情况
                    N, Xe, Ye = np.histogram2d(X, Y)
                    result = (sp.Matrix(N), list(Xe), list(Ye))
            else:
                error = True

            return result if not error else f"输入格式错误: {input_str}"

        except Exception as e:
            return f"错误: {str(e)}"


    # 案例1:基本使用
    print(histogram_counts_second("([1,2,3], [4,5,6])"))
    # (Matrix([
    # [1.0, 0, 0, 0, 0,   0, 0, 0, 0,   0],
    # [  0, 0, 0, 0, 0,   0, 0, 0, 0,   0],
    # [  0, 0, 0, 0, 0,   0, 0, 0, 0,   0],
    # [  0, 0, 0, 0, 0,   0, 0, 0, 0,   0],
    # [  0, 0, 0, 0, 0,   0, 0, 0, 0,   0],
    # [  0, 0, 0, 0, 0, 1.0, 0, 0, 0,   0],
    # [  0, 0, 0, 0, 0,   0, 0, 0, 0,   0],
    # [  0, 0, 0, 0, 0,   0, 0, 0, 0,   0],
    # [  0, 0, 0, 0, 0,   0, 0, 0, 0,   0],
    # [  0, 0, 0, 0, 0,   0, 0, 0, 0, 1.0]]),
    #
    # [1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4000000000000004, 2.6, 2.8, 3.0],
    # [4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2, 5.4, 5.6, 5.8, 6.0])

    # 案例2:指定整数bins
    print(histogram_counts_second("[1,1,2,3,2,2,1,1,2,3],[5,6,3,8,9,1,2,7,5,1],8"))
    # (Matrix([
    # [  0, 1.0,   0, 0, 1.0, 1.0, 1.0,   0],
    # [  0,   0,   0, 0,   0,   0,   0,   0],
    # [  0,   0,   0, 0,   0,   0,   0,   0],
    # [  0,   0,   0, 0,   0,   0,   0,   0],
    # [1.0,   0, 1.0, 0, 1.0,   0,   0, 1.0],
    # [  0,   0,   0, 0,   0,   0,   0,   0],
    # [  0,   0,   0, 0,   0,   0,   0,   0],
    # [1.0,   0,   0, 0,   0,   0,   0, 1.0]]),
    #
    # [1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0],
    # [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0])


    # 案例3:指定二维bins
    print(histogram_counts_second("([1,2,3], [4,5,6], [2,3])"))
    # (Matrix([[1.0,   0,   0],
    #          [  0, 1.0, 1.0]]),
    #
    # [1.0, 2.0, 3.0], [4.0, 4.666666666666667, 5.333333333333333, 6.0])


    # 案例4:直接指定边界
    print(histogram_counts_second("([1,2,3], [4,5,6], [0,2,4], [3,5,7])"))
    # (Matrix([[1.0,   0],
    #          [ 0, 2.0]]),
    #
    # [0.0, 2.0, 4.0],
    # [3.0, 5.0, 7.0])
    
    
    直方图

    直方图是一种条形图, 它将数据分组为bin. 创建Histogram对象后, 可以通过更改直方图的属性值修改它的各个方面. 这对快速修改bin属性或更改显示特别有用

    HistogramPlot(X) 基于X创建直方图. histogram函数使用自动分bin算法, 然后返回均匀宽度的bin, 这些bin可涵盖 X 中的元素范围并显示分布的基本形状. histogram将bin显示为矩形条, 这样每个矩形的高度就表示bin中的元素数量.

    HistogramPlot(X,nbins)指定bin的数量.

    HistogramPlot(X,edges) 将X划分为在向量中指定bin边界的bin.

    X — 要分布到各 bin 的数据, 向量, 矩阵

    nbins — bin 数量, 正整数

    edges — bin 边界, 向量

    电商用户消费金额分析: 分析双11期间用户的单笔订单金额分布

    HistogramPlot([89,120,150,199,210,299,320,399,450,499,520,599,620,799,850,999,1200,1500],[0,200,400,600,800,1000,2000])

    工厂零件尺寸质检: 检测流水线生产的螺栓直径(标准值10.0±0.2mm)

    HistogramPlot([9.7,9.8,9.85,9.9,9.95,10.0,10.0,10.05,10.1,10.1,10.15,10.2,10.2,10.25,10.3,10.4],8)

    APP用户活跃时长分析: 统计每日用户使用时长(分钟)

    HistogramPlot([2,5,8,10,12,15,15,18,20,25,30,35,40,45,50,60,75,90,120],[0,1,5,15,30,60,180])

    医院患者年龄分布: 某科室疾病患者的年龄分布

    HistogramPlot([32,35,38,40,42,45,48,50,52,55,58,60,62,65,68,70,72,75,80,85],[30,40,50,60,70,90])

    网络请求响应时间监控: API接口的响应时间(毫秒)

    HistogramPlot([12,15,18,20,22,25,28,30,35,40,45,50,60,75,100,150,200,500],[10,20,50,100,200,1000])

    
    二元直方图

    二元直方图是一种数值数据条形图, 它将数据分组到二维bin中. 创建Histogram2Plot对象后, 可以通过更改直方图的属性值修改它的各个方面. 这对快速修改bin属性或更改显示特别有用

    histogram2Plot(X,Y) 创建 X 和 Y 的二元直方图. histogram2 函数使用自动分 bin 算法, 然后返回均匀面积的 bin, 这些 bin 可涵盖 X 和 Y 中的元素范围并显示分布的基本形状. histogram2 将 bin 显示为二维矩形条形,这样每个条形的高度就表示 bin 中的元素数量.

    histogram2Plot(X,Y,nbins) 指定要在每个维度中使用的 bin 数量.

    X,Y — 要分布到各 bin 的数据, 向量, 矩阵

    nbins — bin 数量, 正整数

    身高体重关系(健康数据分析):

    深色区域显示最常见的身高体重组合(如170cm/65kg),右上角稀疏区可能是异常值

    Histogram2Plot([165,170,178,162,185],  # 身高(cm)
                   [55,68,72,60,80],       # 体重(kg)
                   12)

    广告点击分析(数字营销):

    观看时长8-15秒且点击率1-2%的区域密度最高,短时长(<5s)点击率波动大

    Histogram2Plot([12,8,25,3,17],  # 广告观看时长(秒)
                   [0.2,1.5,0.8,3.2,1.6],  # 点击率(%)
                   10)

    气象模式分析(气候科学):

    高温(>30℃)与低降雨(<2mm)强相关,25℃中温区降雨分布最广

    Histogram2Plot([28,32,25,30],   # 日间温度(℃)
                   [0,5.2,12.8,3.4],   # 降雨量(mm)
                   15)

    股票收益率分析(金融量化):

    高波动率(>0.2)时收益率分布更分散,低波动率时收益率集中在±5%

    Histogram2Plot([0.15,0.22,0.08],   # 波动率
                   [-0.03,0.12,0.05],  # 日收益率
                   20)

    城市通勤研究(交通规划):

    10km/25min区域密度最高,20km以上出现明显的交通效率下降

    Histogram2Plot([8,15,5,20],   # 通勤距离(km)
                   [30,45,20,60], # 通勤时间(分钟)
                   12)
    
    霍纳法则(秦九韶算法)

    把表达式转成嵌套形式,提高计算效率.

    horner(p)返回多项式p的霍纳形式,

    horner(p,var)使用var中的变量.

    p是符号表达式,符号函数,符号表达式数组,符号函数数组.

    var是变量,符号变量,符号变量数组.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from sympy.matrices import MatrixBase, MutableDenseMatrix
    from sympy.polys.polyfuncs import horner


    def horner_nested_polynomial(input_str):
        """
        将输入的多项式或矩阵中的每个元素转换为霍纳嵌套形式。

        参数:
            input_str: 字符串,表示SymPy可解析的表达式。可以是多项式、矩阵或元组(矩阵或表达式,变量)。

        返回:
            SymPy表达式或矩阵,表示霍纳形式的多项式。若输入错误则返回错误信息。

        示例:
            >>> x, y = sp.symbols('x y')
            >>> horner_nested_polynomial("x**3 + 2*x**2 + 3*x +4")
            x*(x*(x + 2) + 3) + 4
            >>> horner_nested_polynomial("[[x**3, x**2 + 2*x], [x+1, 5]]")
            Matrix([
            [        x**3, x*(x + 2)],
            [      x + 1,         5]])
            >>> horner_nested_polynomial("(x**2 + x*y + y**2, y)")
            y*(x + y) + x**2
            >>> horner_nested_polynomial("([[x**3 + y*x, x + y]], y)")
            Matrix([[x*y + x**3, x + y]])
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            def eval_horner(expression, wrt_var=None):
                """内部函数:应用霍纳法则到单个表达式"""
                if wrt_var is not None:
                    poly = sp.poly(expression, wrt_var)
                else:
                    poly = sp.poly(expression)
                return horner(poly, wrt=wrt_var)

            # 处理元组输入(表达式/矩阵,变量)
            if isinstance(expr, tuple) and len(expr) == 2:
                if all(e.free_symbols for e in expr):
                    result = eval_horner(*expr)
                else:
                    error = True
            elif expr.free_symbols:
                # 处理普通表达式
                result = eval_horner(expr)
            else:
                error = True

            return result if not error else f"输入错误: {input_str}"

        except Exception as e:
            return f"错误:{e}"


    # 示例测试
    if __name__ == "__main__":
        print(horner_nested_polynomial("9*x**4+8*x**3+7*x**2+6*x+5"))
        # x*(x*(x*(9*x + 8) + 7) + 6) + 5
    
    
    希尔伯特变换

    H = htrans(f) 返回符号函数 f 的希尔伯特变换. 默认情况下, 独立变量为 t, 变换变量为 x.

    f — 输入, 符号表达式, 符号函数
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np
    import scipy.signal as signal


    def hilbert_transform_func(input_str):
        """
        对标MATLAB的htrans函数,计算输入表达式的数值希尔伯特变换。

        参数:
            input_str (str): 以't'为变量的数学表达式,例如'sin(t)'、'exp(t)*cos(t)'等。

        返回:
            tuple: (t_values, H_values) 包含时间序列和对应的希尔伯特变换数值结果。
            或 str: 错误信息。
        """
        try:
            # 步骤1: 将输入字符串转换为SymPy表达式
            expr = sp.sympify(input_str)
            t = sp.symbols('t')

            # 步骤2: 检查表达式是否含有符号't',若无则报错
            if not expr.has(t):
                return f"错误: 表达式必须包含变量't',但输入为'{expr}'"

            # 步骤3: 替换所有其他符号为1(例如,处理如'a*sin(t)'中的'a')
            free_symbols = expr.free_symbols - {t}
            subs_dict = {symbol: 1 for symbol in free_symbols}
            expr_substituted = expr.subs(subs_dict)

            # 步骤4: 将SymPy表达式转换为NumPy函数
            expr_numpy = sp.lambdify(t, expr_substituted, modules='numpy')

            # 步骤5: 生成时间序列(0到2π,1000个点)
            t_vals = np.linspace(0, 2 * np.pi, 1000)

            # 步骤6: 计算原始信号y(t)
            y = expr_numpy(t_vals)

            # 步骤7: 使用SciPy计算希尔伯特变换(注意:返回的是解析信号,虚部为Hilbert变换)
            analytic_signal = signal.hilbert(y)
            H = np.imag(analytic_signal)

            return (t_vals, H)

        except sp.SympifyError:
            return f"错误: 无法解析输入表达式 '{input_str}'"
        except Exception as e:
            return f"错误: {str(e)}"


    # 示例使用
    if __name__ == "__main__":
        # 示例1: 计算sin(t)的希尔伯特变换(理论值为-cos(t))
        input_expr = "sin(t)"
        result = hilbert_transform_func(input_expr)

        if isinstance(result, tuple):
            import matplotlib.pyplot as plt

            t_vals, H = result
            plt.figure(figsize=(10, 6))
            plt.plot(t_vals, H, '--', label='Computed Hilbert')
            plt.xlabel('t')
            plt.legend()
            plt.title('Hilbert Transform Demo')
            plt.show()
        else:
            print(result)
    
    
    赫尔维茨黎曼函数

    Z=Hurwitz-zeta(s,a)为数字或符号输入s和a计算Hurwitz zeta函数.只有当s不为1且a既不是0也不是负整数时,才定义Hurwitz zeta函数.

    Z=hurwitzZeta(n,s,a)返回参照变量s的n阶hurwitz-zeta(s,a)的导数.

    s是数字,数组,符号数,符号变量,符号函数,符号表达式,符号数组.

    a是数字,数组,符号数,符号变量,符号函数,符号表达式,符号数组.

    n是导数的阶数,非负整数.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from mpmath import zeta as mp_zeta


    def hurwitz_zeta_function(input_expr):
        """
        对标MATLAB的hurwitzZeta函数,计算Hurwitz zeta函数或其导数。

        Hurwitz zeta函数定义: ζ(s, a) = ∑_{k=0}^∞ 1/(k + a)^s
        导数定义: ζ^{(n)}(s, a) = d^n/ds^n ζ(s, a)

        参数:
            input_expr (str/tuple): 输入表达式,可以是以下形式:
                - "(s, a)" 字符串,计算ζ(s, a)
                - "(s, a, n)" 字符串,计算n阶导数ζ^{(n)}(s, a)
                - 包含s和a的元组或矩阵
            n (int, optional): 导数阶数,如果输入元组中已包含则优先使用元组中的n

        返回:
            SymPy表达式/矩阵或错误信息。

        示例:
            >>> hurwitz_zeta_function("(2, 0.5)")
            -1.46035450880959
            >>> hurwitz_zeta_function("(s, a, 1)", s=2, a=0.5)
            -2.40411380631918
        """
        try:
            expr = sp.sympify(input_expr)
            error = False
            result = None

            def hurwitz_zeta_sym(s_val, a_val, n_val=None):
                zeta_expr = sp.zeta(s_val, a_val)
                if n_val is not None and s_val.free_symbols:
                    vars = s_val.free_symbols
                    result = zeta_expr.rewrite(sp.lerchphi).diff(*vars, n_val)
                else:
                    result = zeta_expr.rewrite(sp.lerchphi)

                return result

            def hurwitz_zeta_math(s_val, a_val, n_val=None):
                if n_val:
                    n = float(n_val)
                    result = mp_zeta(s_val, a_val, n)
                else:
                    result = mp_zeta(s_val, a_val)

                return result

            if isinstance(expr, tuple):
                if len(expr) == 2:
                    derivative_order = None
                elif len(expr) == 3 and expr[2].is_integer and expr[2] > 0:
                    derivative_order = expr[2]
                else:
                    error = True

                if all(e.is_number for e in expr[:2]):
                    params = tuple(complex(e) for e in expr[:2])
                    result = hurwitz_zeta_math(*params, derivative_order)
                elif any(e.free_symbols for e in expr[:2]):
                    result = hurwitz_zeta_sym(*expr)

            else:
                error = True

            return result if not error else f"输入错误: {input_expr}"
        except Exception as e:
            return f"错误:{e}"


    # 示例使用
    if __name__ == "__main__":
        # 示例1: 标量计算
        print("ζ(2, 0.5) =", hurwitz_zeta_function("(2,0.5)"))
        # 4.93480220054468

        # 示例2: 导数计算
        s = sp.Symbol('s')
        expr = hurwitz_zeta_function("s, 0.5, 1")
        print("ζ'(s, 0.5) =", expr)
        # Derivative(lerchphi(1, s, 0.5), s)
    
    
    超几何函数的累积分布函数

    hygecdf(x,M,K,N)使用相应的总体大小M,总体中具有所需特征的项目数量K和提取的样本数量N, 计算x中每个值的超几何cdf. x,M,K和N的向量或矩阵输入必须具有相同的大小. 标量输入被扩展为与其他输入具有相同维数的常数矩阵.

    x -- 标量, 符号变量, 向量, 矩阵

    M, K, N --  数值标量, 向量, 矩阵.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from sympy.stats import Hypergeometric, cdf
    from scipy.stats import hypergeom


    def hypergeometric_cumulative_distribution(input_str):
        try:
            # 将输入的字符串转换为SymPy表达式
            expr = sp.sympify(input_str)
            # 初始化错误标志为False
            error = False
            # 初始化结果为None
            result = None

            # 检查表达式是否为长度为4的元组
            if isinstance(expr, tuple) and len(expr) == 4:

                if all(e.is_integer for e in expr):
                    params = tuple(int(e) for e in expr)
                    """
                    计算超几何分布的累积分布函数值

                    参数:
                    x_val (int): 累积概率的上限值
                    m_val (int): 总体大小
                    k_val (int): 总体中成功的次数
                    n_val (int): 样本大小

                    返回:
                    float: 累积分布函数值,即P(X ≤ x_val)
                    """
                    # 直接调用scipy.stats.hypergeom.cdf函数计算累积分布函数值
                    result = hypergeom.cdf(*params)

                elif any(e.free_symbols for e in expr):
                    """
                    计算超几何分布的累积分布函数值。

                    参数:
                        x_val: 随机变量的值
                        m_val: 总体中的成功元素个数
                        k_val: 总体的元素个数
                        n_val: 抽样的元素个数

                    返回:
                        超几何分布的累积分布函数值或符号表达式
                    """
                    # 创建一个超几何分布随机变量X
                    X = Hypergeometric(*expr)
                    # 返回累积分布函数的符号表达式
                    result = cdf(X)

                else:
                    error = True
            else:
                # 如果输入不是长度为4的元组,设置错误标志为True
                error = True

            # 如果没有错误,返回计算结果;否则返回错误信息
            return result if not error else f"输入错误: {input_str}"
        except Exception as e:
            # 如果在计算过程中出现异常,返回错误信息
            return f"错误: {e}"


    # 标量输入示例
    print(hypergeometric_cumulative_distribution("(2, 50, 10, 5)"))
    # 0.9517396968037909

    # 符号输入示例
    print(hypergeometric_cumulative_distribution("(x, a, b, c)"))
    # Lambda(_k, Sum(Piecewise((binomial(b, _ki)*binomial(a - b, -_ki + c)/binomial(a, c), (_ki >= 0) & (_ki <= c)), (0, True)), (_ki, 0, _k)))
    
    
    超几何函数的逆累积分布函数

    Y = hygeinv(P,M,K,N)返回最小的整数X,使得在X处计算的超几何cdf等于或超过P.您可以将P视为在N个图纸中观察到X个有缺陷的项目而不替换K有缺陷的M个项目组的概率.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from scipy.stats import hypergeom


    # 定义计算单个元素的逆CDF函数
    def compute_inv_cdf(p_val, M_val, K_val, n_val):
        # 参数验证
        if not (0 <= p_val <= 1):
            raise ValueError(f"概率p必须在[0,1]范围内,当前为{p_val}")

        # 转换为整数并验证
        try:
            M_int = int(M_val)
            K_int = int(K_val)
            n_int = int(n_val)
            if M_int != M_val or K_int != K_val or n_int != n_val:
                raise ValueError("参数M, K, n必须为整数")
        except (TypeError, ValueError):
            raise ValueError("参数M, K, n必须为整数")

        if M_int <= 0 or K_int < 0 or n_int < 0:
            raise ValueError("参数必须满足 M>0, K≥0, n≥0")
        if K_int > M_int or n_int > M_int:
            raise ValueError("K和n不能超过M")

        # 处理边界情况
        if p_val <= 0:
            return 0
        if p_val >= 1:
            return min(K_int, n_int)

        # 创建分布对象并查找分位数
        hg = hypergeom(M_int, K_int, n_int)
        max_k = min(K_int, n_int)
        for k in range(0, max_k + 1):
            if hg.cdf(k) >= p_val - 1e-10:  # 浮点容差
                return k
        return max_k  # 理论上不会执行到此


    def hypergeometric_inverse_cumulative_distribution(input_str):
        """
        计算超几何分布的逆累积分布函数(分位数值),对标Matlab的hygeinv函数。

        参数:
            input_str: 输入字符串,格式为四元组 (p, M, K, n),各参数可为矩阵或标量。

        返回:
            数值、SymPy矩阵或错误信息字符串。

        示例:
            >>> hypergeometric_inverse_cumulative_distribution("(0.5, 10, 5, 3)")
            1
            >>> hypergeometric_inverse_cumulative_distribution("([[0.1, 0.5], [0.9, 1.0]], 10, 5, 3)")
            Matrix([[1, 1], [2, 3]])
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            if isinstance(expr, tuple) and len(expr) == 4:

                if all(e.is_number for e in expr):

                    p, M, K, n = expr  # 参数顺序: p, M总体大小, K成功数, n抽样数
                    # 标量计算
                    try:
                        p_val = float(p)
                        M_val = int(M)
                        K_val = int(K)
                        n_val = int(n)
                        result = compute_inv_cdf(p_val, M_val, K_val, n_val)
                    except Exception as e:
                        error = True
                        result = f"参数错误: {str(e)}"
                else:
                    error = True
            else:
                error = True

            return result if not error else f"输入错误: {input_str}"

        except Exception as e:
            return f"错误: {str(e)}"


    # 标量计算示例
    print(hypergeometric_inverse_cumulative_distribution("0.99,1000,10,50"))
    # 3

    print(hypergeometric_inverse_cumulative_distribution("0.5,1000,10,50"))
    # 0
    
    
    超几何函数的概率密度函数

    Y = hygepdf(X,M,K,N)使用相应的总体大小M, 总体中具有所需特征的项目数量K和提取的样本数量N计算X中每个值的超几何pdf. X,M,K和N可以是向量,矩阵,它们都具有相同的大小.标量输入被扩展为与其他输入具有相同维度的常数数组.

    M,K和N中的参数必须都是正整数,N≤M. X中的值必须小于或等于所有参数值.

    X -- 标量, 符号变量, 向量, 矩阵

    M, K, N --  数值标量, 向量, 矩阵.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from sympy.stats import Hypergeometric, density
    from scipy.stats import hypergeom


    def hypergeometric_probability_density(input_str):
        """
        计算超几何分布概率密度函数,对标Matlab的hygepdf函数。

        参数:
            input_str: 输入字符串,格式为四元组 (x, M, K, n),各参数可为矩阵或标量。
                      参数说明:
                      - x: 成功次数
                      - M: 总体大小
                      - K: 总体中成功数量
                      - n: 抽样数量

        返回:
            数值、SymPy矩阵或错误信息字符串。

        示例:
            >>> hypergeometric_probability_density("(2, 100, 20, 5)")
            0.2022
            >>> hypergeometric_probability_density("([0,1,2], 10, 5, 3)")
            Matrix([[0.0833, 0.4167, 0.4167]])
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            def eval_hypergeometric_pdf(x_val, M_val, K_val, n_val):
                """计算单个元素的概率密度"""
                # 参数验证
                # 符号计算直接返回表达式
                X = Hypergeometric('X', M_val, K_val, n_val)
                return density(X)(x_val)

            if isinstance(expr, tuple) and len(expr) == 4:

                if all(e.is_integer for e in expr):
                    params = tuple(int(e) for e in expr)
                    """
                    计算超几何分布的概率质量函数(PMF),对标Matlab的hygepdf函数

                    参数:
                    x_val (int): 成功次数
                    M_val (int): 总体大小
                    K_val (int): 总体中成功的元素个数
                    n_val (int): 抽取的样本大小

                    返回:
                    float: 超几何分布在x_val处的概率密度值
                    """
                    # 直接调用scipy.stats.hypergeom.pmf计算概率密度
                    result = hypergeom.pmf(*params)

                elif any(e.free_symbols for e in expr):
                    """计算单个元素的概率密度"""
                    # 参数验证
                    X = Hypergeometric('X', *expr[1:])
                    result = density(X)(expr[0])
                else:
                    error = True

            return result if not error else f"输入错误:{input_str}"

        except Exception as e:
            return f"系统错误: {str(e)}"


    # 测试示例
    if __name__ == "__main__":
        # 标量测试
        print(hypergeometric_probability_density("(2, 100, 20, 5)"))
        # 输出: 0.20734379349990548

        # 符号计算测试
        print(hypergeometric_probability_density("(k, 10, 5, 3)"))
        # 输出: binomial(5, k)*binomial(5, 3 - k)/120
    
    
    超几何函数的随机数

    R = hygernd(M,K,N)从具有相应总体大小的超几何分布中生成随机数,M,总体中具有所需特征的项目数量K, 以及提取的样本数量N. M,K和N可以是向量,矩阵,它们都具有相同的大小, 这也是R的大小.

    M,K或N的标量输入被扩展为与其他输入具有相同维度的常数数组.

    R=hyernd(M,K,N,M,N)生成一个M-by-N阵列. M,K,N参数可以是标量或与R大小相同的数组.

    M, K, N --  数值标量, 向量, 矩阵.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from scipy.stats import hypergeom
    import numpy as np


    def hypergeometric_random_number(input_str):
        """
        生成超几何分布随机数,对标Matlab的hygernd函数。

        参数格式:
            (M, K, N) -> 单个随机数
            (M, K, N, size) -> 指定形状的数组
            (M_mat, K_mat, N_mat) -> 矩阵参数,逐元素生成随机数

        参数说明:
            M: 总体大小(必须为正整数)
            K: 成功项数量(0 ≤ K ≤ M)
            N: 抽样数量(0 ≤ N ≤ M)
            size: 输出形状(整数或元组)

        返回:
            随机数、SymPy矩阵、numpy数组或错误信息

        示例:
            >>> hypergeometric_random_number("(100, 20, 5)")
            3
            >>> hypergeometric_random_number("(100, 20, 5, 3)")
            Matrix([[2, 4, 3]])
            >>> hypergeometric_random_number("([[90,100],[110,120]], 20, 5)")
            Matrix([[2, 3], [1, 4]])
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            def generate_rvs(M_val, K_val, N_val, size=None):
                """核心生成函数"""
                # 参数验证
                M = int(M_val)
                K = int(K_val)
                N = int(N_val)

                if M <= 0 or K < 0 or N < 0:
                    raise ValueError("参数必须满足 M>0, K≥0, N≥0")
                if K > M or N > M:
                    raise ValueError("K和N不能超过M")

                # 生成随机数
                if size:
                    arr = hypergeom.rvs(M, K, N, size=size)
                    return sp.Matrix(arr) if isinstance(arr, np.ndarray) else arr
                else:
                    return hypergeom.rvs(M, K, N)

            # 解析输入参数
            if isinstance(expr, tuple):
                # 处理标量参数+size参数 ------------------------------------------------
                if len(expr) == 3:  # 单个随机数
                    return generate_rvs(*expr)

                elif len(expr) >= 4:  # 带size参数
                    M, K, N = expr[:3]
                    size = tuple(int(x) for x in expr[3:]) if len(expr) > 4 else int(expr[3])
                    return generate_rvs(M, K, N, size=size)

            raise ValueError("输入格式错误,应为 (M,K,N) 或 (M,K,N,size)")

        except Exception as e:
            return f"错误: {str(e)}"


    # 测试示例
    if __name__ == "__main__":
        # 标量测试
        print(hypergeometric_random_number("(100, 20, 5)"))
        # 0

        # 一维数组测试
        print(hypergeometric_random_number("(100, 20, 5, 3)"))
        # Matrix([[2],
        #         [1],
        #         [0]])
    
    
    超几何函数的均值和方差

    [MN,V] = hygestat(M, K, N)返回具有相应总体大小的超几何分布的均值和方差, M, 总体中具有所需特征的项目数量K, 以及提取的样本数量N. M,K和N的向量或矩阵输入必须具有相同的大小,这也是MN和V的大小.

    M,K或N的标量输入被扩展为与其他输入具有相同维度的常数矩阵.

    具有参数M,K和N的超几何分布的平均值为NK/M,方差为NK(M-K)(M-N)/[M^2(M-1)].

    M, K, N --  数值标量, 向量, 矩阵.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from scipy.stats import hypergeom


    def hypergeometric_mean_variance(input_str):
        """
        计算超几何分布的均值与方差,对标Matlab的hygestat函数。

        参数格式:
            (M, K, N) -> 返回标量均值与方差
            (M_mat, K_mat, N_mat) -> 返回同形状的均值矩阵和方差矩阵

        参数说明:
            M: 总体大小(必须为正整数)
            K: 成功项数量(0 ≤ K ≤ M)
            N: 抽样数量(0 ≤ N ≤ M)

        返回:
            (均值, 方差) 元组,或错误信息字符串

        示例:
            >>> hypergeometric_mean_variance("(100, 20, 5)")
            (4.0, 1.2626262626262625)
            >>> hypergeometric_mean_variance("([100, 150], [20, 30], [5, 10])")
            (Matrix([[4.0, 6.0]]), Matrix([[1.2626, 2.2222]]))
            >>> hypergeometric_mean_variance("(50, 60, 30)")
            '错误:K必须在0到M之间'
        """
        try:
            expr = sp.sympify(input_str)
            mean_matrix, var_matrix = None, None
            error = False

            def compute_stats(M_val, K_val, N_val):
                """核心计算函数"""
                # 参数验证
                try:
                    M = int(M_val)
                    K = int(K_val)
                    N = int(N_val)
                except (TypeError, ValueError):
                    raise ValueError("参数M、K、N必须为整数")

                if M <= 0:
                    raise ValueError("M必须为正整数")
                if not (0 <= K <= M):
                    raise ValueError("K必须在0到M之间")
                if not (0 <= N <= M):
                    raise ValueError("N必须在0到M之间")

                # 计算统计量
                dist = hypergeom(M, K, N)
                return dist.mean(), dist.var()

            # 解析输入参数 -----------------------------------------------------------
            if isinstance(expr, tuple) and len(expr) == 3:
                M, K, N = expr  # 参数顺序对应Matlab的hygestat(M, K, N)

                # 标量计算模式
                try:
                    mean, var = compute_stats(M, K, N)
                    return (mean, var)
                except Exception as e:
                    return f"错误:{str(e)}"

            else:
                return "输入格式错误:应为三元素元组 (M, K, N)"

        except Exception as e:
            return f"系统错误:{str(e)}"


    # 测试示例
    if __name__ == "__main__":
        # 标量测试
        print(hypergeometric_mean_variance("(100, 20, 5)"))
        # (1.0, 0.7676767676767676)
    
    
    广义超几何函数

    hypergeom(a,b,z) 根据输入是浮点还是符号,超几何返回浮点或符号结果。

    计算这些数字的超几何函数。因为这些数字是浮点数,所以hypergeom返回浮点结果。

    a —— 超几何函数的上参数,数字,向量,符号数字,符号变量,符号表达式,符号函数,符号向量

    b —— 超几何函数的下参数,数字,向量,符号数字,符号变量,符号表达式,符号函数,符号向量

    z —— 标量,数值,符号变量
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp


    def hypergeometric_function_construct(input_str):
        """
        构造并简化广义超几何函数,对标MATLAB的hypergeom函数。

        参数:
        input_str (str): 输入字符串,格式应为'([a1, a2, ...], [b1, b2, ...], z)',其中:
            - a1, a2, ... 是上参数列表
            - b1, b2, ... 是下参数列表
            - z 是变量或数值

        返回:
            Sympy表达式: 简化后的超几何函数表达式,或错误信息。
        """
        try:
            # 将输入字符串解析为Sympy表达式
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 检查输入是否为三元组(上参数,下参数,z)
            if isinstance(expr, tuple) and len(expr) == 3:
                # 处理上参数列表
                a = tuple(expr[0]) if isinstance(expr[0], list) else (expr[0],)
                # 处理下参数列表
                b = tuple(expr[1]) if isinstance(expr[1], list) else (expr[1],)
                z = expr[2]

                # 构造超几何函数
                hyper_func = sp.hyper(a, b, z)
                # 尝试展开为更简单的表达式
                result = sp.hyperexpand(hyper_func)
            else:
                error = True

            return result if not error else f"输入格式错误: {input_str}"
        except Exception as e:
            return f"错误: {e}"


    # 示例代码
    if __name__ == "__main__":
        # 示例1:符号参数,返回未简化形式
        input1 = '(a,[],x)'
        result1 = hypergeometric_function_construct(input1)
        print(f"示例1结果: {result1}")
        # (1 - x)**(-a)

        # 示例2:可简化的超几何函数
        input2 = '([1, 1], [2], -x)'
        result2 = hypergeometric_function_construct(input2)
        print(f"示例2结果: {result2}")
        # log(x + 1)/x

        # 示例3:数值参数,返回符号表达式(如需要数值结果可调用.evalf())
        input3 = '([1, 1], [2], -1)'
        result3 = hypergeometric_function_construct(input3)
        print(f"示例3符号结果: {result3}")
        # log(2)
        print(f"示例3数值结果: {result3.evalf()}")
        # 0.693147180559945
    
    
    平方和的平方根(斜边)

    C = hypot(A,B)返回以下方程的计算结果(计算是为了避免下溢或上溢): C = sqrt(abs(A)^2 + abs(B)^2)

    A,B — 输入数组,标量,向量,矩阵
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np


    def hypotenuse_calculate(input_str):
        """
        对标MATLAB hypot函数计算直角三角形的斜边

        参数:
        input_str (str): SymPy可解析的字符串,格式为:
            (n, x) 其中n和x可以是标量或矩阵

        返回:
            Matrix/float: 计算结果矩阵或标量
        """
        try:
            expr = sp.sympify(input_str)
            error = False

            # 检查输入是否为二元组
            if not isinstance(expr, tuple) or len(expr) != 2:
                return f"输入错误: 需要两个参数 {input_str}"

            # 参数解析
            a, b = expr[0], expr[1]

            # 转换为numpy数组(支持标量和矩阵)
            def to_ndarray(val):
                if isinstance(val, list):
                    return np.array(val, dtype=float)
                elif isinstance(val, sp.Number):
                    return float(val)
                else:
                    return None

            np_a = to_ndarray(a)
            np_b = to_ndarray(b)

            if np_a is None or np_b is None:
                return f"参数类型错误: 需要数值或矩阵 {input_str}"

            # 计算斜边(自动处理广播)
            result = np.hypot(np_a, np_b)

            # 转换回SymPy格式
            if isinstance(result, np.ndarray):
                return sp.Matrix(result.tolist())
            else:
                return float(result)

        except Exception as e:
            return f"错误: {str(e)}"


    # 案例1:标量计算
    print(hypotenuse_calculate("(3, 4)"))
    # → 5.0

    # 案例2:矩阵与标量
    print(hypotenuse_calculate("([3,4], 4)"))
    # Matrix([[5.00000000000000],
    #         [5.65685424949238]])

    # 案例3:矩阵广播
    print(hypotenuse_calculate("([[1,2],[3,4]], [5,6])"))
    # Matrix([[5.09901951359278, 6.32455532033676],
    #         [5.83095189484530, 7.21110255092798]])