首页 函数目录

    伽玛累积分布函数

    p=gamcdf(x,a)返回具有a中的形状参数的标准gamma分布的累积分布函数(cdf),在x中的值处进行评估。.

    p=gamcdf(x,a,b)返回伽玛分布的cdf,其中a中的形状参数和b中的比例参数在x中的值处进行评估.

    x是评估cdf的值,非负标量,非负标量数组

    a是形状参数,正标量值,正标量值数组

    b是比例参数,默认值是1,正标量值,正标量的数组.

    如果输入参数x,a和b中的一个或多个是数组,则数组大小必须相同.在这种情况下,gamcdf将每个标量输入扩展为与数组输入大小相同的常量数组.p中的每个元素都是由a和b中的对应元素指定的分布的cdf值, 在x中的相应元素处进行评估.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np
    from scipy.stats import gamma as scipy_gamma
    from sympy.stats import Gamma, cdf


    def gamma_cumulative_distribution(input_str):
        """
        伽马分布累积分布函数(CDF),支持符号变量和数值计算

        特性:
        1. 自动检测输入类型(符号/数值)
        2. 符号计算使用sympy,数值计算使用scipy加速
        3. 支持矩阵广播和元素级运算

        输入格式:
        "(x, k, theta)" 或 "(x, k)"(theta默认为1)
        参数可以是标量、矩阵或包含符号的表达式

        示例:
        "(t, 2, 1)"          -> 符号结果: 1 - (t + 1)*exp(-t)
        "([[1,2],[3,4]], 2)" -> 数值矩阵结果
        """
        try:
            # 符号检测函数
            expr = sp.sympify(input_str)
            result = None

            if isinstance(expr, tuple):
                if len(expr) == 3:
                    z = expr[0]
                    k = expr[1]  # k
                    theta = expr[2]  # theta
                elif len(expr) == 2:
                    z = expr[0]
                    k = expr[1]  # k
                    theta = 1  # theta
                else:
                    return f"输入错误:{input_str}"

                if any(e.free_symbols for e in expr):
                    X = Gamma("gamma", k, theta)
                    result = cdf(X)(z)
                else:
                    if k <= 0 or theta <= 0:
                        raise ValueError("k和theta必须>0")
                    result = scipy_gamma.cdf(float(z), a=float(k), scale=float(theta))

            return result

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


    # 测试案例
    if __name__ == "__main__":
        # 符号计算测试
        print("符号测试:")
        symbolic_input = "(t, 2, 1)"
        symbolic_result = gamma_cumulative_distribution(symbolic_input)
        print(f"输入: {symbolic_input}\n符号结果:", symbolic_result.simplify())
        # 符号结果: Piecewise(((-t + exp(t) - 1)*exp(-t), t > 0), (0, True))

        # 数值矩阵测试
        print("\n数值矩阵测试:")
        matrix_input = "(1, 2)"
        matrix_result = gamma_cumulative_distribution(matrix_input)
        print(f"输入: {matrix_input}\n数值结果:\n{np.array(matrix_result, dtype=float)}")
        # 0.2642411176571153

        # 混合输入测试
        print("\n混合输入测试:")
        mixed_input = "(x, 2, 1)"
        mixed_result = gamma_cumulative_distribution(mixed_input)
        print(f"输入: {mixed_input}\n混合结果:", mixed_result)
        # 混合结果: Piecewise((-(x + 1)*exp(-x) + 1, x > 0), (0, True))
    
    
    伽玛参数估计

    [phat,pci]=gamfit(data)返回MLE和95%置信区间。pci的第一行是置信区间的下限;最后一行是上限.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import numpy as np
    import scipy.stats as st


    def gamma_parameter_estimates(data):
        """
        估计Gamma分布的参数及置信区间,对标MATLAB的gamfit函数

        参数:
        data: list/array 输入数据样本

        返回:
        tuple: (参数估计值, 置信区间)
            参数估计值格式: [形状参数, 尺度参数]
            置信区间格式: [[形状参数CI], [尺度参数CI]]
            如果出错返回错误信息字符串
        """
        try:
            # 将输入转换为numpy数组
            data = np.array(data, dtype=float)

            # 拟合Gamma分布参数(固定位置参数loc=0)
            shape_est, _, scale_est = st.gamma.fit(data, floc=0)

            # 自举法参数设置
            n_bootstraps = 1000  # 通常建议1000次以上
            shape_estimates = []
            scale_estimates = []

            # 执行自举采样
            for _ in range(n_bootstraps):
                sample = np.random.choice(data, size=len(data), replace=True)
                shape, _, scale = st.gamma.fit(sample, floc=0)
                shape_estimates.append(shape)
                scale_estimates.append(scale)

            # 计算95%置信区间
            shape_ci = np.percentile(shape_estimates, [2.5, 97.5])
            scale_ci = np.percentile(scale_estimates, [2.5, 97.5])

            return [shape_est, scale_est], [shape_ci, scale_ci]

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


    # 示例代码
    if __name__ == "__main__":
        # 生成模拟数据(形状参数k=2,尺度参数θ=1)
        true_k, true_theta = 2, 1
        data = st.gamma.rvs(a=true_k, scale=true_theta, size=10)
        # 进行参数估计
        estimates, confidence_intervals = gamma_parameter_estimates(data)

        # 结果展示
        print(f"真实参数: 形状={true_k}, 尺度={true_theta}")
        print(f"估计参数: 形状={estimates[0]:.3f}, 尺度={estimates[1]:.3f}")
        print(f"形状参数95%置信区间: [{confidence_intervals[0][0]:.3f}, {confidence_intervals[0][1]:.3f}]")
        print(f"尺度参数95%置信区间: [{confidence_intervals[1][0]:.3f}, {confidence_intervals[1][1]:.3f}]")
        # 形状参数95%置信区间: [2.178, 8.166]
        # 尺度参数95%置信区间: [0.219, 1.020]
    
    
    伽玛分布的逆累积分布函数(gamma ppf = gamma cdf inverse)

    x=gaminv(p,a)返回具有形状参数a的标准伽玛分布的逆累积分布函数(icdf),该形状参数在p中的值处进行评估。.

    x=gaminv(p,a,b)返回具有形状参数a和尺度参数b的伽玛分布的icdf,以p中的值进行评估。.

    p是计算icdf的概率值,取值范围[0,1]

    a是形状参数. 正标量值,正标量值数组

    b是标度参数. 1是默认值,正标量值,正标量的数组.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import numpy as np
    import scipy.stats as st
    import sympy as sp


    def gamma_inverse_ppf(input_str):
        """
        Gamma分布逆累积分布函数(分位数函数),对标MATLAB的gaminv函数

        参数:
        p : float/array_like
            累积概率值,范围需在[0,1]之间
        a : float/array_like
            形状参数(shape parameter),必须为正数
        scale : float/array_like, 可选
            尺度参数(scale parameter),默认为1,必须为正数

        返回:
        ndarray : 对应的分位数值,形状与输入广播后的形状一致
        如果出错返回包含错误信息的字符串

        示例:
        >>> # 计算单个分位数
        >>> gamma_inverse_ppf(0.5, 2, 1)
        1.678346990016661

        >>> # 计算多个分位数(向量化计算)
        >>> gamma_inverse_ppf([0.1, 0.5, 0.9], 2, 1)
        array([0.53181161, 1.67834699, 3.88972044])

        >>> # 处理不同形状的输入
        >>> gamma_inverse_ppf([[0.1], [0.9]], [[2, 3]], 1)
        array([[0.53181161, 0.74008317],
               [3.88972044, 5.41908035]])
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            if isinstance(expr, tuple):
                if len(expr) == 3:
                    p = expr[0]
                    a = expr[1]
                    scale = expr[2]
                elif len(expr) == 2:
                    p = expr[0]
                    a = expr[1]
                    scale = 1
                else:
                    error = True

                if isinstance(p, list):
                    p = sp.Matrix(p)

                if isinstance(a, list):
                    a = sp.Matrix(a)

                if isinstance(scale, list):
                    scale = sp.Matrix(scale)

                # 将输入转换为numpy数组并进行广播
                p_arr, a_arr, scale_arr = np.broadcast_arrays(
                    np.asarray(p, dtype=float),
                    np.asarray(a, dtype=float),
                    np.asarray(scale, dtype=float)
                )

                # 参数有效性检查
                if np.any((p_arr < 0) | (p_arr > 1)):
                    raise ValueError("概率值p必须在[0, 1]范围内")
                if np.any(a_arr <= 0):
                    raise ValueError("形状参数a必须为正数")
                if np.any(scale_arr <= 0):
                    raise ValueError("尺度参数scale必须为正数")

                # 初始化结果数组
                result = np.empty_like(p_arr, dtype=float)

                # 向量化计算分位数
                for index in np.ndindex(p_arr.shape):
                    result[index] = st.gamma.ppf(
                        q=p_arr[index],
                        a=a_arr[index],
                        scale=scale_arr[index]
                    )
                if result.size == 1:
                    result = float(result)
                else:
                    result = sp.Matrix(result.tolist())
            else:
                error = True

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

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


    # 示例测试
    if __name__ == "__main__":
        # 测试用例1:标量输入
        print("标量输入测试:")
        print(gamma_inverse_ppf("0.5, 3, 5"))
        # 13.370301568617794

        # 测试用例2:向量输入
        print("\n向量输入测试:")
        print(gamma_inverse_ppf("[0.1, 0.5, 0.9], 2"))
        # Matrix([[0.531811608389612],
        #         [1.67834699001666],
        #         [3.88972016986743]])

        # 测试用例3:广播测试
        print("\n广播测试:")
        print(gamma_inverse_ppf("[[0.1], [0.9]], [[2, 3]]"))
        # Matrix([[0.531811608389612, 1.10206532824932],
        #         [3.88972016986743, 5.32232033783421]])
    
    
    伽玛分布的负对数似然函数

    nlogL=gamlike(params,data)返回给定数据的参数params的gamma对数似然的负值. params(1)=A,形状参数,params(2)=B,比例参数。params中的参数必须全部为正.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import numpy as np
    import scipy.stats as st


    def gamma_neg_log_like(params, data):
        """
        计算Gamma分布的负对数似然,对标MATLAB的gamlike函数

        参数:
        params : tuple/list/array_like
            包含形状参数(shape)和尺度参数(scale)的数组,格式为[shape, scale]
        data : list/array_like
            观测数据样本,所有值必须为正数

        返回:
        float: 负对数似然值
        如果出错返回包含错误信息的字符串

        示例:
        >>> # MATLAB等效调用:gamlike([2, 1], [1.2, 0.8, 2.3])
        >>> params = [2, 1]
        >>> data = [1.2, 0.8, 2.3]
        >>> gamma_neg_log_like(params, data)
        3.876492512616387
        """
        try:
            # 参数类型转换和验证
            params = np.asarray(params, dtype=float)
            data = np.asarray(data, dtype=float)

            # 检查参数维度
            if params.size != 2:
                raise ValueError("参数必须包含两个元素:[形状参数, 尺度参数]")

            # 解包参数
            shape, scale = params[0], params[1]

            # 参数有效性检查
            if shape <= 0 or scale <= 0:
                raise ValueError("形状参数和尺度参数必须大于0")
            if np.any(data <= 0):
                raise ValueError("所有数据值必须为正数")

            # 计算对数似然
            log_pdf = st.gamma.logpdf(data, a=shape, scale=scale)
            return -np.sum(log_pdf)

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


    # 示例测试
    if __name__ == "__main__":
        # 测试用例1:正常情况
        data = [1.2, 0.8, 2.3, 1.5]
        params = [2.0, 1.0]
        print(f"测试1结果: {gamma_neg_log_like(params, data)}")
        # 4.602447763476986

        # 测试用例2:多参数维度测试
        matrix_params = [[2.0, 1.0], [3.0, 0.5]]  # 两组不同参数
        print(f"\n测试4结果: {[gamma_neg_log_like(p, data) for p in matrix_params]}")
        # [4.602447763476986, 3.6597180824744107]
    
    
    Y = gamma(X) 返回在X的元素处计算的gamma函数值.

    X是标量,向量,矩阵
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from scipy.special import gamma


    def gamma_compute(input_str):
        """
        对标 MATLAB 的 gamma 函数,支持标量、矩阵和符号计算。

        参数:
        input_str: 输入的数学表达式字符串。

        返回:
        计算结果或错误信息字符串。

        示例:
        >>> gamma_compute("5")
        24.0
        >>> gamma_compute("Matrix([[1, 2], [3, 4]])")
        Matrix([[1, 1], [2, 6]])
        >>> gamma_compute("x + 1")
        x*gamma(x)
        >>> gamma_compute("invalid")
        '错误: ...'
        """
        try:
            expr = sp.sympify(input_str)
            # 数值处理分支
            if expr.is_number:
                z = complex(expr)
                return gamma(z)

            # 符号表达式处理分支
            elif expr.free_symbols:
                return sp.expand_func(sp.gamma(expr))

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

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


    # 示例测试
    if __name__ == "__main__":
        # 标量测试
        print(gamma_compute("2.5"))
        # (1.3293403881791352+0j)

        # 符号测试
        print(gamma_compute("x + 1"))
        # x*gamma(x)
    
    
    正则化不完全gamma函数

    Y = gammainc(X,A) 返回在 X 和 A 的元素处计算的正则化下不完全 gamma 函数。X 和 A 必须都为实数,A 必须为非负值.

    Y = gammainc(X,A,type) 返回正则化下/上不完全 gamma 函数。type 的选项是 'lower'(默认值)和 'upper'.

    X是标量,向量,矩阵

    A是标量,向量,矩阵. A的元素必须为非负实数.X和A必须大小相同,或者其中之一必须为标量.

    type是正则化不完全gamma函数的类型,upper或lower(默认)
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import scipy.special as sc


    def gamma_incomplete_function(input_str):
        """
        对标 MATLAB 的 gammainc 函数,计算正则化的下/上不完全伽马函数。

        参数:
        input_str: 输入的数学表达式字符串,格式为元组 (x, a, 'type'),其中 type 可选 'lower' 或 'upper'。

        返回:
        计算结果或错误信息字符串。

        示例:
        >>> gamma_incomplete_function("(2, 5, lower)")
        0.052653017343711
        >>> gamma_incomplete_function("(Matrix([[1,2]]), Matrix([[3,4]]), upper)")
        Matrix([[0.849145, 0.238536]])
        >>> gamma_incomplete_function("(x, a, lower)")
        lowergamma(a, x)/gamma(a)
        """
        try:
            expr = sp.sympify(input_str, evaluate=False)
            error = False
            result = None

            if isinstance(expr, tuple):
                # 解析参数
                if len(expr) == 3:
                    x, a, gammainc_type = expr
                    gammainc_type = str(gammainc_type)
                elif len(expr) == 2:
                    x, a = expr
                    gammainc_type = 'lower'
                else:
                    error = True
                    return f"输入错误: 参数数量错误,期望2或3个参数,实际{len(expr)}个"

                # 检查类型参数有效性
                if gammainc_type not in ['lower', 'upper']:
                    error = True
                    return f"输入错误: 类型参数必须为 'lower' 或 'upper',实际为 {gammainc_type}"

                if gammainc_type == "lower":
                    if any(e.free_symbols for e in [x, a]):
                        result = sp.lowergamma(a, x) / sp.gamma(a)
                    elif all(e.is_number for e in [x, a]):
                        result = sc.gammainc(float(a), float(x))
                else:
                    if any(e.free_symbols for e in [x, a]):
                        result = sp.uppergamma(a, x) / sp.gamma(a)
                    elif all(e.is_number for e in [x, a]):
                        result = sc.gammaincc(float(a), float(x))

                return result
            else:
                return f"输入错误: 输入必须是元组"

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


    # 示例测试
    if __name__ == "__main__":
        # 标量测试
        print(gamma_incomplete_function("2, 5, lower"))
        # 0.052653017343711125

        print(gamma_incomplete_function("(5, 2, upper)"))
        # 0.04042768199451279

        # 符号测试
        print(gamma_incomplete_function("(x, a, lower)"))
        # lowergamma(a, x)/gamma(a)
    
    
    正则化不完全gamma函数的逆函数

    X = gammaincinv(Y,A)返回在Y和A元素处计算的正则化下不完全gamma函数的逆函数,满足Y = gammainc(X,A). Y和A都必须为实数. Y的元素必须在闭区间[0,1]内,A必须为非负值.

    X = gammaincinv(Y,A,type) 返回正则化下或上不完全gamma函数的逆函数.type的选项是'lower'(默认值)和'upper'.

    Y是标量,向量,矩阵

    A是标量,向量,矩阵. A的元素必须为非负实数.Y和A必须大小相同,或者其中之一必须为标量.

    type是逆不完全gamma函数的类型,upper或lower(默认)
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import scipy.special as sc


    def gamma_incomplete_inverse_function(input_str):
        """
        计算逆不完全伽马函数,类似MATLAB的gammaincinv函数。

        参数:
        input_str: 输入的字符串表达式,格式为元组(y, a, 'lower'/'upper')或(y, a)。

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

        示例:
        >>> gamma_incomplete_inverse_function("(0.5, 1)")
        0.6931471806
        >>> gamma_incomplete_inverse_function("([[0.5], [0.6]], [[1], [2]])")
        Matrix([[1.386294361], [1.42711696]])
        """
        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):
                    params = tuple(float(e.evalf()) for e in expr)
                    result = sc.gammaincinv(*params[::-1])
                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__":
        # 标量测试
        print(gamma_incomplete_inverse_function("0.5, 0.6"))
        # 0.31570201701610756
    
    
    Y = gammaln(A)返回gamma函数的对数gammaln(A)=log(gamma(A)).

    A 必须是非负数和实数. gammaln命令可避免直接使用log(gamma(A))计算时可能会出现的下溢和上溢.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from scipy.special import gammaln


    def gamma_logarithm(input_str):
        """
         计算gamma函数的自然对数,对标MATLAB的gammaln函数。

         参数:
         input_str (str): 输入的数学表达式字符串,支持标量、矩阵或符号表达式。
                         对于数值输入,必须为非负实数;符号表达式需为合法SymPy表达式。

         返回:
         SymPy表达式/float/np.ndarray/str:
             - 符号输入返回SymPy的loggamma表达式
             - 标量数值输入返回float结果
             - 矩阵输入返回NumPy数组
             - 错误时返回字符串描述

         示例:
         >>> gamma_logarithm("5")          # 标量数值输入
         3.1780538303479458

         >>> gamma_logarithm("z")          # 符号输入
         loggamma(z)

         >>> gamma_logarithm("[[1, 2], [3, 4]]")  # 矩阵输入
         array([[0.        , 0.69314718],
                [1.79175947, 3.17805383]])

         >>> gamma_logarithm("-1")         # 错误输入
         '错误:输入必须为非负实数。'
         """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            if expr.free_symbols:
                result = sp.loggamma(expr)
            elif expr.is_number:
                # 数值型输入验证
                z = float(expr)
                # 使用SciPy计算数值结果
                result = gammaln(z)
            else:
                error = True

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

        except (sp.SympifyError, TypeError) as e:
            return f"语法错误:无法解析输入 '{input_str}' -> {e}"
        except ValueError as e:
            return f"计算错误:{e}"
        except Exception as e:
            return f"未知错误:{type(e).__name__} - {str(e)}"


    # 符号表达式
    print(gamma_logarithm("x+y"))
    # loggamma(x + y)

    # 标量计算测试
    print(gamma_logarithm("6"))
    # 4.787491742782046
    
    
    伽玛概率密度函数

    p=gampdf(x,a)返回具有a中的形状参数的标准gamma分布的概率密度函数(pdf),在x中的值处进行评估。.

    y=gampdf(x,a,b)返回具有形状参数a和比例参数b的伽马分布的pdf,在x中的值处进行评估.

    x是评估pdf的值,非负标量,非负标量数组

    a是形状参数,正标量值,正标量值数组

    b是比例参数,默认值是1,正标量值,正标量的数组.

    如果输入参数x,a和b中的一个或多个是数组,则数组大小必须相同.在这种情况下,gampdf将每个标量输入扩展为与数组输入大小相同的常量数组.p中的每个元素都是由a和b中的对应元素指定的分布的cdf值, 在x中的相应元素处进行评估.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from sympy.stats import Geometric, density, cdf, Gamma, E, variance
    from scipy.stats import gamma as scipy_gamma


    def gamma_pdf(input_str):
        """
        计算伽马分布概率密度函数 (对标MATLAB gampdf)

        参数:
        x: 输入值/矩阵
        k: 形状参数/矩阵
        theta: 尺度参数/矩阵 (默认1)

        返回:
        SymPy矩阵/数值/错误信息

        示例:
        >>> gamma_pdf(2, 1)  # 标量计算
        0.1353352832366127
        >>> gamma_pdf([[1,2],[3,4]], 2, 1)  # 矩阵输入
        Matrix([
        [0.367879441171442, 0.270670566473225],
        [0.149361205103592, 0.073262555554937]])
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            if isinstance(expr, tuple) and len(expr) <= 3:
                if len(expr) == 2:
                    theta = 1
                    if all(e.is_number for e in expr):
                        params = tuple(float(e.evalf()) for e in expr)
                        result = scipy_gamma.pdf(*params, theta)
                    elif any(e.free_symbols for e in expr):
                        G = Gamma("gamma", expr[1], theta)
                        result = density(G)(expr[0])
                elif len(expr) == 3:
                    if all(e.is_number for e in expr):
                        result = scipy_gamma.pdf(*expr)
                    elif any(e.free_symbols for e in expr):
                        G = Gamma("gamma", expr[1], expr[2])
                        result = density(G)(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(gamma_pdf("2, 1"))
        # 0.36787944117144233

        # 符号变量测试
        print(gamma_pdf("x, 1"))
        # exp(-x)
    
    
    伽玛随机数

    r = gamrnd(a,b) 从具有形状参数 a 和尺度参数 b 的 gamma 分布中生成一个随机数.

    r = gamrnd(a,b,sz) 从 gamma 分布中生成一个随机数数组,其中向量 sz 指定 size(r).

    a是形状参数,正标量值,正标量值数组

    b是比例参数,默认值是1,正标量值,正标量的数组.

    如果输入参数a和b都是数组,则数组大小必须相同.如果a或b是标量,则gamrnd会将标量参量扩展为与另一个参量大小相同的常量数组.r中的每个元素均是从a和b中对应元素所指定的分布中生成的随机数.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np


    def gamma_random_samples(input_str):
        """
        根据输入参数生成伽马分布的随机样本,模拟MATLAB的gamrnd函数行为。

        参数:
        input_str (str): 输入字符串,应能解析为包含形状参数a、比例参数b及可选大小参数的元组。
                         例如:"(2, 3)", "(1, 5, 10)", "([1,2], [3,4], 5, 2)"。

        返回:
        numpy.ndarray 或 float: 生成的随机样本数组或标量。若输入错误则返回错误信息字符串。

        示例:
        >>> gamma_random_samples("(2, 3)")
        # 生成一个形状参数2、比例参数3的样本

        >>> gamma_random_samples("(2, 5, 10)")
        # 生成10个形状参数2、比例参数5的样本

        >>> gamma_random_samples("([1,2], [3,4], 5, 2)")
        # 生成5x2的数组,每个元素基于对应的形状和比例参数
        """
        try:
            expr = sp.sympify(input_str)
            if isinstance(expr, tuple):
                if len(expr) >= 2:
                    a, b = expr[0], expr[1]
                    size = tuple(expr[2:]) if len(expr) > 2 else None
                    # 生成伽马分布样本
                    return np.random.gamma(a, b, size=size)
                else:
                    return f"输入错误: 元组长度不足,至少需要形状参数a和比例参数b。"
            else:
                return f"输入错误: 输入必须为包含a和b的元组。"
        except Exception as e:
            return f"错误: {e}"


    # 示例代码
    if __name__ == "__main__":
        # 示例1: 生成单个样本
        print("示例1 输出:", gamma_random_samples("(2, 5)"))
        # 8.0401321476408

        # 示例2: 生成5个样本
        print("示例2 输出形状:", gamma_random_samples("(2, 5, 5)"))
        # [22.3469496   7.22552538 13.73268475  1.51002786  9.18842614]

        # 示例3: 生成5x2矩阵,参数为数组
        samples = gamma_random_samples("([1, 2], [3, 4], 5, 2)")
        print("示例3 输出形状:", samples)
        # [[0.39950036 7.19800049]
        #  [5.23155375 5.40451038]
        #  [0.67944897 8.87343055]
        #  [2.5881992  3.66194587]
        #  [1.17191571 0.99974115]]
    
    
    伽玛均值和方差

    [M,V]=gamstat(A,B)返回形状参数在A中,尺度参数在B中的伽马分布的均值和方差.A和B可以是具有相同大小的向量.矩阵,这也是M和V的大小.

    A或B的标量输入被扩展为与另一输入具有相同维度的常数数组.A和B中的参数必须为正.

    参数A和B的伽马分布的平均值为AB.方差为A*B^2.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from sympy.stats import Gamma, E, variance
    import numpy as np


    def gamstat(k, theta):
        """
        计算Gamma分布的均值和方差,对标MATLAB的gamstat函数

        参数:
        k : 形状参数(shape parameter),可以是标量、向量或多维数组
        theta : 尺度参数(scale parameter),可以是标量、向量或多维数组

        返回:
        (mean, var) : 包含均值和方差的元组,形状与广播后的输入一致

        数学公式:
        均值 = k * theta
        方差 = k * theta^2
        """
        # 转换为NumPy数组
        k_arr = np.asarray(k, dtype=float)
        theta_arr = np.asarray(theta, dtype=float)

        # 检查参数有效性
        if np.any(k_arr <= 0) or np.any(theta_arr <= 0):
            raise ValueError("参数k和theta必须大于0")

        # 使用广播机制计算
        mean = k_arr * theta_arr
        var = k_arr * (theta_arr ** 2)

        return mean, var


    def gamma_mean_variance(input_str):
        """
        计算Gamma分布的均值和方差,对标MATLAB的gamstat函数。

        参数:
        input_str (str): 输入字符串,应能解析为包含形状参数a和比例参数b的元组。
                         支持标量、列表或矩阵形式,例如:"(2, 3)", "([1,2], [3,4])"。

        返回:
        tuple: 包含均值矩阵和方差矩阵的元组,若输入错误则返回错误信息字符串。

        示例:
        >>> gamma_mean_variance("(2, 3)")
        (6, 18)

        >>> gamma_mean_variance("([1, 2], [3, 4])")
        (Matrix([[3, 8]]), Matrix([[9, 32]]))

        >>> gamma_mean_variance("([1, 2], 2)")
        (Matrix([[2, 4]]), Matrix([[4, 16]]))
        """
        try:
            expr = sp.sympify(input_str)
            M, V = None, None  # 初始化均值和方差结果

            # 定义符号参数
            a_sym = sp.Symbol("a", positive=True)
            b_sym = sp.Symbol("b", positive=True)
            X = Gamma("X", a_sym, b_sym)  # 定义Gamma随机变量

            # 符号表达式计算均值和方差
            mean_expr = E(X)
            var_expr = variance(X)

            def eval_mean_var(a_val, b_val):
                """代入数值计算均值和方差"""
                return (
                    mean_expr.subs({a_sym: a_val, b_sym: b_val}).evalf(),
                    var_expr.subs({a_sym: a_val, b_sym: b_val}).evalf()
                )

            # 检查输入是否为二元组
            if not isinstance(expr, tuple) or len(expr) != 2:
                return f"输入错误: 需要形状参数a和比例参数b的二元组,当前输入: {input_str}"

            # 情况4: a和b均为标量
            if all(e.is_number for e in expr):
                params = tuple(float(e.evalf()) for e in expr)
                M, V = gamstat(*params)
            elif any(e.free_symbols for e in expr):
                M, V = eval_mean_var(*expr)
            else:
                raise ValueError(f"输入错误:{input_str}")

            return (M, V)

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


    # 示例代码
    if __name__ == "__main__":
        # 示例1: 标量参数
        print("示例1:", gamma_mean_variance("(2, 3)"))
        # (6.0, 18.0)
    
    
    广义自回归条件异方差模型拟合

    是特别用来建立条件方差模型并对其进行预测的.

    这些模型被运用于经济学领域,尤其是金融时间序列分析中.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np
    from arch import arch_model


    def garchfit_regression_expression(input_str,model_type='Garch', p=1, q=1, dist='normal', update_freq=0):
        """
        对输入的时间序列数据进行 ARCH 模型拟合。

        参数:
        input_str: 输入的字符串表达式,表示时间序列数据(矩阵或列表)。

        返回:
        如果输入有效,则返回 ARCH 模型的拟合参数(以中文命名);否则返回错误信息。
        """
        try:
            # 将输入字符串转换为 SymPy 表达式
            expr = sp.sympify(input_str)

            # 检查输入是否为矩阵
            if isinstance(expr, list):
                # 将 SymPy 矩阵转换为 NumPy 数组并展平
                A = np.array(expr, dtype=float).ravel()
            else:
                return f"输入错误: {input_str}"

            # 使用 ARCH 模型进行拟合
            # 假设 p=1(ARCH(1) 模型),vol='ARCH'(ARCH 模型)
            am = arch_model(A * 100, vol='Garch', p=p, dist=dist)
            # 拟合模型,设置 update_freq=0 和 disp='off' 以关闭输出
            res = am.fit(update_freq=update_freq, disp=update_freq > 0)

            # 获取拟合参数
            params_dict = dict(res.params)

            # 创建一个新的字典,用于存储重命名后的参数
            renamed_params_dict = {}

            # 遍历原始字典,将键重命名为更具描述性的中文名称
            # 根据模型类型重命名参数
            for key, value in params_dict.items():
                if key == 'mu':
                    renamed_params_dict['均值'] = value
                elif key == 'omega':
                    renamed_params_dict['常数项'] = value
                elif key.startswith('alpha'):
                    idx = key.split('[')[1].split(']')[0] if '[' in key else '1'
                    renamed_params_dict[f'ARCH({idx})系数'] = value
                elif key.startswith('beta'):
                    idx = key.split('[')[1].split(']')[0] if '[' in key else '1'
                    renamed_params_dict[f'GARCH({idx})系数'] = value
                elif key == 'nu' and dist == 't':
                    renamed_params_dict['自由度'] = value
                elif key == 'lambda' and dist == 'skewt':
                    renamed_params_dict['偏度参数'] = value
                else:
                    renamed_params_dict[key] = value

            # 计算一些有用的统计量
            volatility = res.conditional_volatility
            residuals = res.resid

            # 返回结果字典
            result = {
                '参数估计': renamed_params_dict,
                '模型类型': model_type,
                '阶数': f"ARCH({p})" if model_type == 'ARCH' else f"GARCH({p},{q})",
                '误差分布': dist,
                '对数似然值': res.loglikelihood,
                'AIC': res.aic,
                'BIC': res.bic,
                '条件波动率': volatility.tolist(),
                '残差': residuals.tolist(),
                '模型摘要': str(res.summary())
            }

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


    def main():
        """
        主函数,用于演示 archfit_regression_expression 函数的使用。
        """
        # 示范代码
        input_examples = [
            "[[1, 2, 3, 4, 5]]",  # 时间序列数据
            # 结果: {'均值': 2.999870510602842, '方差偏移': 1.9871738584685994, '方差系数': 0.00810550114746725}
            "[[0.1, 0.2, 0.3, 0.4, 0.5]]",  # 时间序列数据
            # 结果: {'均值': 0.2999917328352241, '方差偏移': 0.019852350048059936, '方差系数': 0.00921009134817112}
        ]

        for input_str in input_examples:
            print(f"输入: {input_str}")
            result = garchfit_regression_expression(input_str)
            print(f"结果: {result}")
            print("-" * 40)


    if __name__ == "__main__":
        main()
    
    
    高斯拟合

    gauss1: Y = a1*exp(-((x-b1)/c1)^2)

    gauss2: Y = a1*exp(-((x-b1)/c1)^2)+a2*exp(-((x-b2)/c2)^2)

    gauss3: Y = a1*exp(-((x-b1)/c1)^2)+...+a3*exp(-((x-b3)/c3)^2)

    gauss8: Y = a1*exp(-((x-b1)/c1)^2)+...+a8*exp(-((x-b8)/c8)^2)

    以此类推,最大到 gauss8
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np
    from scipy.optimize import curve_fit


    def gauss_fit_nonlinear(input_str):
        """
        使用非线性最小二乘法进行高斯曲线拟合,支持1到8阶高斯函数。

        参数:
        input_str: 字符串形式的输入数据,格式为"(x_data, y_data, n)",其中
                   x_data 和 y_data 是数据点,n 是要拟合的高斯函数阶数。

        返回:
        拟合后的高斯函数表达式(SymPy 表达式)或错误信息。
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            maxfev = 10000  # 最大函数评估次数

            # 定义1到8阶高斯函数
            def gauss1(x, a1, b1, c1):
                return a1 * np.exp(-((x - b1) / c1) ** 2)

            def gauss2(x, a1, b1, c1, a2, b2, c2):
                return gauss1(x, a1, b1, c1) + gauss1(x, a2, b2, c2)

            def gauss3(x, a1, b1, c1, a2, b2, c2, a3, b3, c3):
                return gauss2(x, a1, b1, c1, a2, b2, c2) + gauss1(x, a3, b3, c3)

            def gauss4(x, a1, b1, c1, a2, b2, c2, a3, b3, c3, a4, b4, c4):
                return gauss3(x, a1, b1, c1, a2, b2, c2, a3, b3, c3) + gauss1(x, a4, b4, c4)

            def gauss5(x, a1, b1, c1, a2, b2, c2, a3, b3, c3, a4, b4, c4, a5, b5, c5):
                return gauss4(x, a1, b1, c1, a2, b2, c2, a3, b3, c3, a4, b4, c4) + gauss1(x, a5, b5, c5)

            def gauss6(x, a1, b1, c1, a2, b2, c2, a3, b3, c3, a4, b4, c4, a5, b5, c5, a6, b6, c6):
                return gauss5(x, a1, b1, c1, a2, b2, c2, a3, b3, c3, a4, b4, c4, a5, b5, c5) + gauss1(x, a6, b6, c6)

            def gauss7(x, a1, b1, c1, a2, b2, c2, a3, b3, c3, a4, b4, c4, a5, b5, c5, a6, b6, c6, a7, b7, c7):
                return gauss6(x, a1, b1, c1, a2, b2, c2, a3, b3, c3, a4, b4, c4, a5, b5, c5, a6, b6, c6) + gauss1(x, a7, b7,
                                                                                                                  c7)

            def gauss8(x, a1, b1, c1, a2, b2, c2, a3, b3, c3, a4, b4, c4, a5, b5, c5, a6, b6, c6, a7, b7, c7, a8, b8, c8):
                return gauss7(x, a1, b1, c1, a2, b2, c2, a3, b3, c3, a4, b4, c4, a5, b5, c5, a6, b6, c6, a7, b7,
                              c7) + gauss1(x, a8, b8, c8)

            # 解析输入数据
            if isinstance(expr, tuple):
                if len(expr) > 2:
                    x, y, n = expr[0], expr[1], int(expr[2])
                else:
                    x, y = expr[0], expr[1]
                    n = 1

                # 转换为NumPy数组
                if x is None or y is None:
                    raise ValueError("Invalid input format")
                x_data = np.array(x, dtype=float).ravel()
                y_data = np.array(y, dtype=float).ravel()
            else:
                raise ValueError("Input must be a tuple")

            # 参数边界设置 (a≥0, b∈ℝ, c≥0)
            lower_bounds = [0, -np.inf, 0] * n
            upper_bounds = [np.inf, np.inf, np.inf] * n
            param_bounds = (lower_bounds, upper_bounds)

            # 生成初始猜测参数
            initial_guess = []
            sorted_indices = np.argsort(x_data)
            sorted_x = x_data[sorted_indices]
            sorted_y = y_data[sorted_indices]

            # 通过寻找峰值改进初始猜测
            peak_indices = np.argsort(sorted_y)[-n:][::-1]  # 取最大的n个y值对应的索引
            peak_x = sorted_x[peak_indices]
            peak_x.sort()

            for i in range(n):
                a_guess = sorted_y[peak_indices[i]] - np.min(sorted_y)
                b_guess = peak_x[i]
                c_guess = (np.max(sorted_x) - np.min(sorted_x)) / (2 * n)
                initial_guess.extend([a_guess, b_guess, c_guess])

            # 选择对应阶数的高斯函数进行拟合
            gauss_funcs = [None, gauss1, gauss2, gauss3, gauss4,
                           gauss5, gauss6, gauss7, gauss8]
            if n < 1 or n > 8:
                raise ValueError("n must be between 1 and 8")

            params, _ = curve_fit(gauss_funcs[n], x_data, y_data,
                                  p0=initial_guess, maxfev=maxfev,
                                  bounds=param_bounds)

            # 生成拟合表达式
            terms = []
            for i in range(n):
                a, b, c = params[3 * i: 3 * i + 3]
                terms.append(f"{a:.4f}*exp(-((x - {b:.4f})/{c:.4f})**2)")
            return sp.sympify("+".join(terms))

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


    # 示例使用
    if __name__ == "__main__":
        # 生成测试数据(两个高斯峰叠加)
        x = np.linspace(0, 10, 100)
        y = 3 * np.exp(-(x - 2) ** 2 / 1) + 2 * np.exp(-(x - 7) ** 2 / 0.5) + np.random.normal(0, 0.1, 100)

        # 构造输入字符串(注意需要转换为Python列表)
        input_str = f"({x.tolist()}, {y.tolist()}, 2)"
        print(input_str)
        # 进行二阶高斯拟合
        result = gauss_fit_nonlinear(input_str)
        print("拟合结果:", result)
        # 3.0246*exp(-3.9764864633667*(0.500375281461096*x - 1)**2) + 2.0451*exp(-93.9532479488075*(0.143209027897119*x - 1)**2)
    
    
    高斯窗

    w = gausswin(L,std,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 gausswin_window(input_str):
        """
        对标MATLAB的gausswin函数,生成高斯窗口。

        参数:
        input_str (str): 输入的参数字符串,格式应为 "M", "M, alpha" 或 "M, alpha, sym_flag"
            - M: 窗口长度(正整数)
            - alpha: 高斯窗的alpha参数(正数,默认2.5),对应MATLAB中的alpha,与标准差σ的关系为σ = (M-1)/(2*alpha)
            - sym_flag: 可选参数,0表示非对称窗口(sym=False),其他值表示对称窗口(默认,sym=True)

        返回:
        list: 高斯窗口数组,或错误信息字符串。
        """
        try:
            expr = sp.sympify(input_str)
            m = None
            alpha = 2.5  # MATLAB默认alpha为2.5
            sym = True  # 默认对称窗口

            # 解析输入参数
            if isinstance(expr, (int, sp.Integer, float, sp.Float)):
                # 单个参数,例如 "64"
                m = int(expr)
            elif isinstance(expr, tuple):
                # 元组参数,例如 "64, 0.4" 或 "64, 0.4, 0"
                if len(expr) >= 1:
                    m = int(expr[0])
                if len(expr) >= 2:
                    alpha = float(expr[1])
                if len(expr) >= 3:
                    # 处理第三个参数(sym_flag)
                    sym_flag = str(expr[2])
                    sym = False if sym_flag == '0' else True
                if len(expr) > 3:
                    raise ValueError("参数过多,最多支持3个参数")
            else:
                return f"输入错误:无法解析的参数格式 '{input_str}'"

            # 参数有效性检查
            if m is None or m <= 0:
                return "错误:窗口长度M必须为正整数"
            if alpha <= 0:
                return "错误:alpha必须为正数"

            # 计算标准差σ,根据MATLAB公式 σ = (M-1)/(2*alpha)
            std = (m - 1) / (2 * alpha)

            # 生成高斯窗口
            window = signal.windows.gaussian(m, std, sym)

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


    # 示例代码
    if __name__ == "__main__":
        # 示例1:默认参数(M=64, alpha=2.5, sym=True)
        print("示例1 默认参数:", gausswin_window("64")[:5])
        # [0.04393693362340742, 0.053411098929097026, 0.06452050267116646, 0.0774512497553297, 0.09238970420181072]

        # 示例2:自定义alpha(M=64, alpha=0.4, sym=True)
        print("示例2 自定义alpha:", gausswin_window("64,0.4")[:5])
        # [0.9231163463866358, 0.9277423175922188, 0.9322411350082428, 0.936610727772961, 0.9408490778060681]

        # 示例3:非对称窗口(M=64, alpha=0.4, sym=False)
        print("示例3 非对称窗口:", gausswin_window("64,0.4,0")[:5])
        # [0.9207563392996183, 0.9254450947656505, 0.9300077511714193, 0.9344422118574613, 0.938746432156527]
    
    
    最大公约数

    G = gcd(A,B,v=0) 返回 A 和 B 的元素的最大公约数. G 中的元素始终是非负值, gcd(0,0) 返回 0. 此语法支持任何数值类型的输入

    [G,U,V] = gcd(A,B,v=1) 还返回 Bézout 系数 U 和 V,它们满足:A.*U + B.*V = G。Bézout 系数用于对 Diophantine 方程求解。

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

    def gcd_number(input_str):
        """
        对标MATLAB的gcd函数,计算最大公约数及Bézout系数

        参数:
        input_str (str): 输入的参数字符串,格式应为 "a, b"(支持标量或矩阵)

        返回:
        tuple: (G, U, V) 包含最大公约数和Bézout系数的矩阵/标量
        str: 错误信息(格式错误/非整数输入/矩阵形状不匹配等)

        功能说明:
        1. 支持标量计算:gcd(6,15) → (3, -2, 1)
        2. 支持矩阵计算:逐元素计算gcd
        3. 自动处理标量与矩阵的广播
        4. 返回Bézout系数满足 a*u + b*v = gcd(a,b)
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            def extended_gcd(a, b):
                # 转换为 NumPy 数组并确保是整数类型
                a0 = np.array(a, dtype=np.int64, ndmin=1, copy=False)
                b0 = np.array(b, dtype=np.int64, ndmin=1, copy=False)

                # 应用广播规则
                a_broadcast, b_broadcast = np.broadcast_arrays(a0, b0)

                # 初始化结果数组
                shape = a_broadcast.shape
                g_arr = np.zeros(shape, dtype=np.int64)
                u_arr = np.zeros(shape, dtype=np.int64)
                v_arr = np.zeros(shape, dtype=np.int64)

                # 对每个元素单独计算扩展欧几里得算法
                for idx in np.ndindex(shape):
                    a_val = a_broadcast[idx]
                    b_val = b_broadcast[idx]

                    sign_a = np.sign(a_val) if a_val != 0 else 1
                    sign_b = np.sign(b_val) if b_val != 0 else 1

                    a1 = np.abs(a_val)
                    b1 = np.abs(b_val)

                    u, v = 1, 0
                    u1, v1 = 0, 1

                    while b1 != 0:
                        q = a1 // b1
                        r = a1 % b1
                        new_u = u - q * u1
                        new_v = v - q * v1

                        a1, b1 = b1, r
                        u, v = u1, v1
                        u1, v1 = new_u, new_v

                    g_arr[idx] = a1
                    u_arr[idx] = u * sign_a
                    v_arr[idx] = v * sign_b

                return g_arr, u_arr, v_arr

            # 检查传入的 expr 是否为元组类型
            if isinstance(expr, tuple):
                # 如果 expr 是一个长度为 3 的元组
                if len(expr) == 3:
                    # 从元组中提取第一个元素作为底数 n(这里注释提到 base b 可能有误,推测应该是 base n)
                    n = expr[0]
                    # 从元组中提取第二个元素
                    x = expr[1]
                    # 将元组中的第三个元素转换为整数类型
                    v = int(expr[2])
                    # 检查 v 是否既不等于 0 也不等于 1
                    if v != 0 and v != 1:
                        # 如果不满足条件,抛出 ValueError 异常,提示参数必须是 0 或 1
                        raise ValueError("参数必须是0或1")
                # 如果 expr 是一个长度为 2 的元组
                elif len(expr) == 2:
                    # 从元组中提取第一个元素作为底数 n
                    n = expr[0]
                    # 从元组中提取第二个元素
                    x = expr[1]
                    # 将 v 的值设为 0
                    v = 0

                if v == 0:
                    result = np.gcd(n, x)
                else:
                    result = extended_gcd(n, x)
            # 如果 expr 不是元组类型
            else:
                # 将错误标志设为 True
                error = True

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

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


    # 示例代码 ======================================================================
    if __name__ == "__main__":
        # 示例1:标量计算
        print("示例1:gcd(6, 15, 1)")
        result = gcd_number("6, 15, 1")
        print(result)
        print("\n")
        # (array([3]), array([-2]), array([1]))

        # 示例2:
        test_input = "12,15"
        print("输入:", test_input)
        result = gcd_number(test_input)
        print(result)
        print("\n")
        # 3

        test_input = "5, 15, 1"
        print("输入:", test_input)
        result = gcd_number(test_input)
        print(result)
        print("\n")
        # (array([5]), array([1]), array([0]))
    
    
    最大公约数矩阵

    A = gcdmat(n) 返回 n×n 矩阵,其 A(i,j) 等于 gcd(i,j)

    对于所有非负r, 矩阵 A 是对称正定矩阵, A^r 是对称半正定矩阵

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


    def generate_gcd_matrix(n):
        """
        生成n×n的GCD矩阵,其中元素A[i][j] = gcd(i+1, j+1)

        参数:
        n (int): 矩阵维度(正整数)

        返回:
        np.ndarray: 生成的GCD矩阵
        """
        # 初始化n×n的零矩阵
        A = np.zeros((n, n), dtype=int)
        # 遍历每个元素计算gcd(注意i和j从0开始,对应1-based编号)
        for i in range(n):
            for j in range(n):
                A[i][j] = sp.gcd(i + 1, j + 1)
        return A


    def gcdmat_matrix(input_str):
        """
        根据输入字符串生成GCD矩阵

        参数:
        input_str (str): 输入的矩阵维度字符串表达式(需能解析为正整数)

        返回:
        sp.Matrix | str: 生成的Sympy矩阵对象或错误信息
        """
        try:
            # 将输入字符串解析为Sympy表达式
            expr = sp.sympify(input_str)

            # 检查是否为有效正整数
            if not expr.is_integer:  # 检查数学上是否为整数
                return f"错误:输入必须为整数,但收到 {input_str}"
            n = int(expr)  # 转换为Python整数
            if n <= 0:
                return f"错误:维度必须为正整数,但收到 {n}"

            # 生成矩阵并转换为Sympy矩阵对象
            return sp.Matrix(generate_gcd_matrix(n))

        except sp.SympifyError:
            return f"解析错误:'{input_str}' 不是有效的数学表达式"
        except Exception as e:
            return f"运行时错误:{str(e)}"


    if __name__ == "__main__":
        # 示例测试代码
        test_cases = [
            "3",
            # Matrix([[1, 1, 1],
            #         [1, 2, 1],
            #         [1, 1, 3]])

            "4"
            # Matrix([[1, 1, 1, 1],
            #         [1, 2, 1, 2],
            #         [1, 1, 3, 1],
            #         [1, 2, 1, 4]])
            ]

        for case in test_cases:
            print(f"输入 '{case}':")
            result = gcdmat_matrix(case)
            if isinstance(result, sp.Matrix):
                print(f"生成的 {result.rows}x{result.cols} 矩阵:")
                print(result)
            else:
                print(result)
            print("\n" + "-" * 50 + "\n")
    
    
    Gear矩阵

    A = gearmat(n,i,j) 返回 n×n 矩阵, 其中下对角线和上对角线上为 1, (1,abs(i)) 位置为 sign(i), (n,n+1-abs(j)) 位置为 sign(j), 其余所有位置为 0.

    参量 i 和 j 的默认值分别为 n 和 -n. 它们必须为 -n 到 n 范围内的整数

    矩阵 A 是奇异矩阵,可具有双重和三重特征值,并且可以是亏损矩阵

    所有特征值的形式均为 2*cos(a),特征向量的形式为 [sin(w+a), sin(w+2a), …, sin(w+na)]

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


    def generate_gear_matrix(n, i, j):
        """
        生成n×n的齿轮矩阵,具有以下特征:
        1. 次对角线(上下对角线)填充1
        2. (1,|i|)位置填充sign(i)
        3. (n, n+1-|j|)位置填充sign(j)

        参数:
        n (int): 矩阵维度(>=2的正整数)
        i (int): 第一行特征位置(非零整数,-n <= i <=n)
        j (int): 最后一行特征位置(非零整数,-n <= j <=n)

        返回:
        np.ndarray: 生成的齿轮矩阵

        异常:
        ValueError: 参数不符合要求时抛出
        """
        # 参数验证
        if n < 1:
            raise ValueError("矩阵维度n必须是正整数")
        if i == 0 or j == 0:
            raise ValueError("参数i和j不能为零")
        if not (-n <= i <= n) or not (-n <= j <= n):
            raise ValueError(f"参数i和j必须在[-{n}, {n}]范围内")

        # 创建基础矩阵
        A = np.zeros((n, n), dtype=int)

        # 填充次对角线(Python使用0-based索引)
        # 下对角线(主对角线下方)
        np.fill_diagonal(A[1:], 1)
        # 上对角线(主对角线上方)
        np.fill_diagonal(A[:, 1:], 1)

        # 设置特征元素(转换为0-based索引)
        # 第一行:位置(0, abs(i)-1)
        A[0, abs(i) - 1] = np.sign(i)
        # 最后一行:位置(n-1, n - abs(j) -1)
        # 计算公式调整为:n - abs(j) 对应MATLAB的n+1-|j|
        A[n - 1, n - abs(j)] = np.sign(j)

        return A


    def gearmat_matrix(input_str):
        """
        解析输入字符串并生成齿轮矩阵

        参数:
        input_str (str): 支持两种格式:
                       - 单整数:"n" 生成默认矩阵(i=n, j=-n)
                       - 元组:"(n,i,j)" 或 "n,i,j" 生成自定义矩阵

        返回:
        sp.Matrix | str: Sympy矩阵对象或错误信息
        """
        try:
            expr = sp.sympify(input_str)

            # 处理元组输入 (n, i, j)
            if isinstance(expr, tuple):
                if len(expr) != 3:
                    return f"需要3个参数,但收到{len(expr)}个"

                # 验证所有元素为整数
                if not all(e.is_integer for e in expr):
                    return "所有参数必须为整数"

                n, i, j = map(int, expr)
                matrix = generate_gear_matrix(n, i, j)

            # 处理单整数输入
            elif expr.is_integer:
                n = int(expr)
                if n < 1:
                    return f"维度必须≥1,但收到{n}"
                matrix = generate_gear_matrix(n, i=n, j=-n)  # 默认参数

            else:
                return "无效的输入格式"

            return sp.Matrix(matrix)

        except (sp.SympifyError, ValueError) as e:
            return f"输入错误:{str(e)}"
        except Exception as e:
            return f"运行时错误:{str(e)}"


    if __name__ == "__main__":
        # 示例测试
        test_cases = [
            "3",
            # Matrix([[0, 1, 1],
            #         [1, 0, 1],
            #         [-1, 1, 0]])

            "(4, 2, -3)",
            # Matrix([[0, 1, 0, 0],
            #         [1, 0, 1, 0],
            #         [0, 1, 0, 1],
            #         [0, -1, 1, 0]])
        ]

        for case in test_cases:
            print(f"输入: {case}")
            result = gearmat_matrix(case)
            if isinstance(result, sp.Matrix):
                print(f"生成 {result.rows}x{result.cols} 齿轮矩阵:")
                print(result)
            else:
                print(result)
            print("\n" + "=" * 50 + "\n")
    
    
    几何分布的累积分布函数

    y=geocdf(x,p)返回几何分布的累积分布函数(cdf),使用p中的相应概率在x中的每个值处进行评估。

    x -- 整数标量, 向量,矩阵,多维数组,是第一次成功之前的失败次数

    p -- 标量,向量,矩阵,多维数组,是成功的概率

    y -- cdf值,作为标量或[0,1]范围内的标量数组返回。在任何必要的标量展开后,y与x和p的大小相同。
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import numpy as np
    import scipy.stats as st
    import sympy as sp
    from sympy.stats import Geometric, cdf


    # 几何分布的累积分布函数
    def geometric_cdf(input_str):
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 计算卡方分布的概率密度函数 (PDF)
            # 转换为 SymPy 数组(仅在符号分支使用)

            if isinstance(expr, tuple) and len(expr) == 2:
                if all(e.is_number for e in expr):
                    k = int(expr[0])  # 实验的次数,标量或数组
                    p = float(expr[1])  # 成功的概率
                    # 计算概率值,处理k为负值的情况(设置概率为0)
                    result = np.where(k >= 0, st.geom.cdf(k, p), 0)
                elif any(e.free_symbols for e in expr):
                    k, p = expr
                    X = Geometric('geom', p)
                    cdf_expr = cdf(X)(k)
                    result = cdf_expr.evalf()
            else:
                error = True

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


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


    # 示例使用:
    # 标量输入
    print(geometric_cdf("3, 0.5"))
    # 0.875

    # 符号变量输入
    print(geometric_cdf("x, 0.5"))
    # Piecewise((1.0 - 2.0*0.5**(floor(x) + 1.0), x >= 1), (0, True))
    
    
    几何分布的概率质量函数

    y=geopdf(x,p)使用p中的相应概率返回x中每个值处的几何分布的概率密度函数(pdf)。x和p可以是向量、矩阵或多维数组。标量输入被扩展为与其他输入具有相同维度的常数数组。p中的参数必须位于[0,1]区间内。

    x -- 整数标量, 向量,矩阵,多维数组,是第一次成功之前的失败次数

    p -- 标量,向量,矩阵,多维数组,是成功的概率
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import numpy as np
    import scipy.stats as st
    import sympy as sp
    from sympy.stats import Geometric, density


    # 几何分布的概率质量函数
    def geometric_pdf(input_str):
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 计算卡方分布的概率密度函数 (PDF)
            # 转换为 SymPy 数组(仅在符号分支使用)

            if isinstance(expr, tuple) and len(expr) == 2:
                if all(e.is_number for e in expr):
                    k = int(expr[0])  # 实验的次数,标量或数组
                    p = float(expr[1])  # 成功的概率
                    # 计算概率值,处理k为负值的情况(设置概率为0)
                    result = np.where(k >= 0, st.geom.pmf(k, p), 0)
                elif any(e.free_symbols for e in expr):
                    k, p = expr
                    X = Geometric('geom', p)
                    density_expr = density(X)(k)
                    result = density_expr.evalf()
            else:
                error = True

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


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


    # 示例使用:
    # 标量输入
    print(geometric_pdf("3, 0.5"))
    # 0.125

    # 符号变量输入
    print(geometric_pdf("x, 0.5"))
    # 0.5*0.5**(x - 1.0)
    
    
    平面几何图

    GeoPlot(Point2d,Segment,Circle,Ellipse,Polygon,Fill,Legend)绘制点,线,圆,椭圆及多边形。

    Point2d[a,b]绘制(a,b)坐标的点。

    Segment(a1,b1,a2,b2)绘制(a1,b1)到(a2,b2)的线条。

    Circle(a,b,r)绘制以(a,b)为圆心,r为半径的圆。

    Ellipse(a,b,r,vr)绘制以(a,b)为圆心,r为半径, vr为垂直半径的椭圆。

    Polygon(a1,b1,a2,b2,a3,b3....)绘制多点之间的多边形。

    Fill: 是否在几何体内填充颜色。

    Legend: 是否有注释
    
    立体几何图

    GeoPlot3D(Point3d,Line3d,Plane,Legend)绘制点,线,平面。

    Point3d[x,y,z]绘制(x,y,z)空间坐标的点。

    Line3d(x1,y1,z1,x2,y2,z2)绘制空间(x1,y1,z1)到(x2,y2,z2)的线条。

    Plane(x1,y1,z1,x2,y2,z2,(x_range),(y_range),(z_range))绘制空间平面。

    Legend: 是否有注释
    
    几何分布的随机采样函数

    r=geornd(p)从具有概率参数p的几何分布中生成随机数。p可以是向量、矩阵或多维数组。r的大小等于p的大小。p中的参数必须位于[0,1]区间内。

    r=geornd(p,m,n,…)或r=georn d(p、[m、n,…])生成多维m-by-n-by-。..包含来自具有概率参数p的几何分布的随机数的数组。p可以是标量或与r大小相同的数组。

    几何分布有助于在一系列独立试验中模拟一次成功之前的失败次数,其中每次试验都会导致成功或失败,任何单个试验的成功概率都是常数p。
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import numpy as np
    from scipy.stats import geom


    def geornd_scipy(p, size=None):
        """
        几何分布随机采样函数(使用 SciPy)
        返回首次成功前的失败次数(k=0,1,2,...)

        参数:
            p: 成功概率(标量或矩阵)
            size: 输出形状(整数或元组)

        返回:
            随机数或随机数矩阵
        """
        # 处理标量概率
        if np.isscalar(p):
            if not 0 < p <= 1:
                raise ValueError("概率 p 必须在 (0,1] 区间")
            # 使用 SciPy 的几何分布生成器(p 参数对应失败概率)
            return geom.rvs(p, size=size) - 1

        # 处理矩阵概率
        p_arr = np.asarray(p)
        if p_arr.ndim == 0:
            return geom.rvs(p_arr, size=size) - 1

        # 检查所有概率值是否有效
        if np.any((p_arr <= 0) | (p_arr > 1)):
            raise ValueError("所有概率值必须在 (0,1] 区间")

        # 为每个概率值生成随机数
        return np.vectorize(lambda p_val: geom.rvs(p_val) - 1)(p_arr)


    # 示例用法
    if __name__ == "__main__":
        np.random.seed(42)  # 设置随机种子

        # 示例1:标量概率(单个随机数)
        print("单个随机数:", geornd_scipy(0.3))
        # 1

        # 示例2:指定维度(2x3矩阵)
        print("\n2x3矩阵:")
        print(geornd_scipy(0.5, size=(2, 3)))
        # [[4 1 1]
        #  [0 0 0]]

        # 示例3:矩阵概率
        prob_matrix = [[0.2, 0.5], [0.3, 0.7]]
        print("\n矩阵概率:")
        print(geornd_scipy(prob_matrix))
        # [[4 1]
        #  [0 2]]

        # 示例4:不同形状
        print("\n一维数组:")
        print(geornd_scipy(0.6, size=5))
        # [1 0 0 0 0]
    
    
    冈珀茨拟合

    gompertz: Y = d+(a-d)*exp(-exp(-b*(x-c)))

    返回冈珀茨拟合方程式
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np
    from scipy.optimize import curve_fit


    def gompertz_fit_nonlinear(input_str):
        try:
            expr = sp.sympify(input_str)
            error = False
            expression = None
            maxfev = 100000
            x_sym = sp.symbols('x')  # 定义符号变量x

            # 定义 Gompertz 函数
            def gompertz(x, a, b, c, d):
                return d + (a - d) * np.exp(-np.exp(-b * (x - c)))

            # 检查输入是否为包含两个元素的元组
            if isinstance(expr, tuple) and len(expr) == 2:
                x_part, y_part = expr[0], expr[1]

                # 转换为矩阵并验证
                if not isinstance(x_part, list) or not isinstance(y_part, list):
                    error = True
                else:
                    x_data = np.array(x_part, dtype=float).ravel()
                    y_data = np.array(y_part, dtype=float).ravel()

                    if len(x_data) != len(y_data):
                        error = True
                    else:
                        # 初始参数猜测
                        initial_guess = [max(y_data), 1, np.mean(x_data), min(y_data)]

                        # 非线性拟合
                        params, _ = curve_fit(
                            gompertz,
                            x_data,
                            y_data,
                            p0=initial_guess,
                            maxfev=maxfev
                        )

                        # 提取参数并构造Sympy表达式
                        a, b, c, d = params
                        expression = f"{d:.4f} + ({a:.4f} - {d:.4f}) * exp(-exp(-{b:.4f} * (x - {c:.4f})))"
            else:
                error = True  # 输入格式不正确

            if error:
                return f"输入错误: {input_str}"
            else:
                return sp.simplify(expression)

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


    # 示例输入:x和y数据点
    input_data = "([1,2,3,4,5], [2.0, 4.5, 6.5, 8.0, 8.5])"
    result = gompertz_fit_nonlinear(input_data)
    print(result)
    # 0.4148 + 8.7322*exp(-3.77555321883638*exp(-0.7963*x))
    
    
    符号标量场的梯度向量(数值梯度)

    FX = gradient(F) 返回向量F的一维数值梯度.输出FX对应于∂F/∂x,即x(水平)方向上的差分.点之间的间距假定为1

    FX = gradient(F,[vars],[points]) 返回符号表达式列表的符号标量场的梯度向量.

    [FX,FY] = gradient(F) 返回矩阵F的二维数值梯度的x和y分量.附加输出FY对应于∂F/∂y,即y(垂直)方向上的差分.每个方向上的点之间的间距假定为1

    F — 输入数组,向量,矩阵,符号表达式

    vars -- 符号变量列表.

    points -- 数值列表.

    FX, FY — 数值梯度,数组
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np


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

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

        返回:
        代入后的数值结果或符号表达式
        """
        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 gradient_by_function(input_str):
        """
            对标 MATLAB 的 gradient 函数,计算数值或符号梯度。

            MATLAB梯度规则:
            - 对于向量:中心差分(边界使用单边差分)
            - 对于矩阵:对每个维度分别计算梯度

            参数:
            input_str (str): 输入表达式,可以是以下形式:
                1. 纯矩阵 (如 "Matrix([[1,2],[3,4]])")
                2. 符号表达式 (如 "x**2 + y**3")
                3. 元组结构 (如 "(f, [x,y], [1,2])")
                   其中最后一个元素为可选的代入点

            返回:
            SymPy 矩阵/表达式 或错误信息字符串
            """
        try:
            # 将输入的字符串转换为 SymPy 表达式
            expr = sp.sympify(input_str)
            # 初始化错误标志为 False
            error = False
            # 初始化结果变量
            result = None

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

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

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

            # 检查输入是否为元组,且最后一个元素为数值列表
            if isinstance(expr, tuple) and isinstance(expr[-1], list) and all(item.is_number for item in expr[-1]):
                # 提取代入点
                points = expr[-1]
                # 移除元组的最后一个元素
                expr = remove_last_from_tuple(expr)
            else:
                # 如果不满足条件,代入点设为 None
                points = None

            # 检查输入是否为包含两个元素的元组
            if isinstance(expr, tuple) and len(expr) == 2:
                # 提取函数和变量
                func, variables = expr
                # 计算函数关于变量的梯度
                grad = sp.derive_by_array(func, variables)
                # 如果梯度结果长度大于 1,转换为 SymPy 矩阵
                result = sp.Matrix(grad) if len(grad) > 1 else grad
                # 将变量代入梯度结果
                result = get_result_value(variables, points, result)
            # 检查输入是否为 SymPy 矩阵
            elif isinstance(expr, list):
                # 检查矩阵是否为数值矩阵
                sp_matrix = sp.Matrix(expr)
                if sp_matrix.is_symbolic() is False:
                    # 检查矩阵是否为向量(行数或列数为 1)
                    is_vector = sp_matrix.rows == 1 or sp_matrix.cols == 1
                    if is_vector:
                        # 将向量转换为一维 NumPy 数组
                        A = np.ravel(np.array(sp_matrix, dtype=float))
                        # 计算向量的梯度
                        np_grad = np.gradient(A)
                    else:
                        # 将矩阵转换为 NumPy 数组
                        np_array = np.array(sp_matrix.tolist(), dtype=float)
                        # 计算矩阵的梯度
                        np_grad = np.gradient(np_array)

                    # 将 NumPy 梯度结果转换为 SymPy 矩阵
                    if isinstance(np_grad, list):
                        result = [sp.Matrix(g) for g in np_grad]
                    else:
                        result = sp.Matrix(np_grad)
                else:
                    # 提取矩阵中的自由符号
                    symbols = sp_matrix.free_symbols
                    # 计算矩阵关于符号的梯度
                    result = sp.derive_by_array(sp_matrix, list(symbols))
                    # 将梯度结果转换为 SymPy 矩阵
                    result = sp.Matrix(result)
                    # 将变量代入梯度结果
                    result = get_result_value(symbols, points, result)
            # 检查输入表达式是否包含自由符号
            elif expr.free_symbols:
                # 提取表达式中的自由符号
                symbols_set = list(expr.free_symbols)
                # 计算表达式关于符号的梯度
                result = sp.derive_by_array(expr, symbols_set)
                # 将梯度结果转换为 SymPy 矩阵
                result = sp.Matrix(result)
                # 将变量代入梯度结果
                result = get_result_value(symbols_set, points, result)
            else:
                # 如果输入表达式不包含自由符号,设置错误标志为 True
                error = True

            # 如果没有错误,返回结果;否则返回错误信息
            return result if not error else f"输入错误: {input_str}"
        except Exception as e:
            return f"输入错误:{e}"


    # 示例用法
    if __name__ == "__main__":
        # 示例1: 符号表达式梯度
        print("\n示例1: 符号梯度")
        x, y = sp.symbols('x y')
        input_expr = "x**2 + y**3"
        grad = gradient_by_function(input_expr)
        print(f"\n表达式: {input_expr}")
        print("符号梯度:")
        print(grad)
        # Matrix([[2*x],
        #         [3*y**2]])

        # 示例2: 带代入点的符号梯度
        print("\n示例2: 带代入点的梯度")
        input_tuple = "(x**2 + y**3, [x, y], [1, 2])"
        grad = gradient_by_function(input_tuple)
        print(f"\n输入:{input_tuple}")
        print("代入点后的数值梯度:")
        print(grad)
        # Matrix([[2.00000000000000],
        #         [12.0000000000000]])
    
    
    具有敏感特征值的托普利茨矩阵

    A = grcar(n,k) 返回 n×n 托普利茨矩阵, 其中下对角线上的元素为 -1, 主对角线上的元素为 1, 主对角线上方的 k 个对角线上的元素为 1. k 必须为整数, 默认值为 k = 3. A 具有对扰动敏感的特征值.

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


    def create_grcar_matrix(n, k=3):
        """
        生成一个n×n的Grcar矩阵。

        Grcar矩阵是一种具有特殊结构的测试矩阵,主对角线为1,下方第一条对角线为-1,
        上方k条对角线为1,其余位置为0。

        参数:
            n (int): 矩阵的维度。
            k (int, 可选): 主对角线上方的对角线数量,默认为3。

        返回:
            numpy.ndarray: 生成的Grcar矩阵。
        """
        # 创建n×n的零矩阵
        A = np.zeros((n, n), dtype=int)

        # 设置主对角线为1
        np.fill_diagonal(A, 1)

        # 设置下方第一条对角线为-1
        # A[1:]表示从第二行开始的所有行,填充其主对角线(即原矩阵的下第一条对角线)
        np.fill_diagonal(A[1:], -1)

        # 设置主对角线上方的k条对角线为1
        for diag in range(1, k + 1):
            # 对每行,从第diag列开始,填充其主对角线(即原矩阵右上方的第diag条对角线)
            np.fill_diagonal(A[:, diag:], 1)

        return A


    def grcar_matrix(input_str):
        """
        根据输入字符串生成Grcar矩阵。

        输入可以是单个数字n(如"5")或元组(n, k)(如"(5, 3)")。

        参数:
            input_str (str): 描述矩阵参数的字符串。

        返回:
            sympy.Matrix or str: 生成的矩阵或错误信息。
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            if isinstance(expr, tuple):
                # 处理元组输入,例如"(5, 3)"
                if len(expr) != 2:
                    error = True
                else:
                    n = int(expr[0])
                    k = int(expr[1])
                    result = create_grcar_matrix(n, k)
            elif expr.is_number:
                # 处理单个数字输入,例如"5"
                n = int(expr)
                result = create_grcar_matrix(n)
            else:
                error = True

            if error:
                return f"输入格式错误: {input_str}"
            else:
                return sp.Matrix(result)
        except Exception as e:
            return f"错误: {e}"


    # 示例代码
    if __name__ == "__main__":
        # 示例1:生成5x5,k=3的Grcar矩阵
        print("示例1:n=5, k=3")
        print(grcar_matrix("5"))
        # Matrix([[1, 1, 1, 1, 0],
        #         [-1, 1, 1, 1, 1],
        #         [0, -1, 1, 1, 1],
        #         [0, 0, -1, 1, 1],
        #         [0, 0, 0, -1, 1]])

        # 示例2:生成5x5,k=2的Grcar矩阵
        print("\n示例2:n=5, k=2")
        print(grcar_matrix("(5, 2)"))
        # Matrix([[1, 1, 1, 0, 0],
        #         [-1, 1, 1, 1, 0],
        #         [0, -1, 1, 1, 1],
        #         [0, 0, -1, 1, 1],
        #         [0, 0, 0, -1, 1]])
    
    
    广义奇异值分解

    [U,V,S] = gsvd(A,B) 执行矩阵A和B的广义奇异值分解,并返回酉矩阵U和V以及非负对角矩阵S

    A, B — 输入矩阵(以单独参量指定),矩阵
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np
    from scipy.linalg import qr, svd


    def generalized_singular_value_decomposition(input_str):
        """
        执行广义奇异值分解(GSVD),对标MATLAB的gsvd函数。

        参数:
        input_str: 输入字符串,表示两个矩阵的元组,例如 "([[1,2],[3,4]], [[5,6],[7,8]])"

        返回:
        返回包含U, V, X, C, S的元组(SymPy矩阵),或错误信息。
        """
        try:
            # 解析输入字符串为SymPy表达式
            expr = sp.sympify(input_str)
            if not isinstance(expr, tuple) or len(expr) != 2:
                return "输入错误:请输入包含两个矩阵的元组。"

            if any(isinstance(e, list) is False for e in expr):
                return "输入错误:无法解析为两个有效矩阵。"

            # 转换为NumPy数组
            A_np = np.array(expr[0], dtype=float)
            B_np = np.array(expr[1], dtype=float)

            # 检查矩阵列数是否相同
            if A_np.shape[1] != B_np.shape[1]:
                return f"错误:矩阵A和B的列数必须相同。A的列数:{A_np.shape[1]}, B的列数:{B_np.shape[1]}"

            # 计算矩阵B的QR分解(经济模式)
            # B^T = Q_B * R_B → B = R_B^T @ Q_B^T
            Q_B, R_B = qr(B_np.T, mode='economic')
            R_B = R_B.T  # 调整后B = Q_B @ R_B

            # 计算A * Q_B^T
            AQ_B = A_np @ Q_B.T

            # 对AQ_B进行奇异值分解(SVD)
            U, D, Zt = svd(AQ_B, full_matrices=False)
            Z = Zt.T

            # 计算X矩阵:X = Q_B^T @ Z
            X = Q_B.T @ Z

            # 计算C和S的对角元素
            C_diag = D
            S_diag = np.sqrt(1 - D ** 2)

            # 构造对角矩阵C和S
            C = np.diag(C_diag)
            S = np.diag(S_diag)

            # 计算V矩阵:B = V @ S @ X^T → V = B @ X @ inv(S)
            # 由于B = Q_B @ R_B,代入得 Q_B @ R_B = V @ S @ X^T
            # 结合X = Q_B^T @ Z → Q_B = X @ Z^T
            V = (R_B @ Z) @ np.diag(1.0 / S_diag)

            # 转换为SymPy矩阵
            U_sp = sp.Matrix(U)
            V_sp = sp.Matrix(V)
            X_sp = sp.Matrix(X.T)  # X在分解式中转置
            C_sp = sp.Matrix(C)
            S_sp = sp.Matrix(S)

            return (U_sp, V_sp, X_sp, C_sp, S_sp)

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


    # 示例使用
    input_str = "([[1,6,11],[2,7,12],[3,8,13],[4,9,14],[5,10,15]], [[8,1,6],[3,5,7],[4,9,2]])"
    result = generalized_singular_value_decomposition(input_str)

    if isinstance(result, tuple):
        U, V, X, C, S = result
        print("U =")
        print(U)
        # Matrix([[-0.354557057037681, 0.688686643768252, -0.100420070696462],
        #         [-0.398696369998832, 0.375554529395871, 0.401020580634150],
        #         [-0.442835682959984, 0.0624224150234908, -0.685649669614349],
        #         [-0.486974995921135, -0.250709699348890, 0.569917880112097],
        #         [-0.531114308882287, -0.563841813721270, -0.184868720435436]])

        print("\nV =")
        print(V)
        # Matrix([[nan, nan, 8.64112621464805],
        #         [nan, nan, 4.34326123905226],
        #         [nan, nan, 0.200526501807073]])

        print("\nX =")
        print(X)
        # Matrix([[-0.201664911192694, -0.516830501392304, -0.831996091591915],
        #         [-0.890317132783019, -0.257331626824051, 0.375653879134918],
        #         [0.408248290463863, -0.816496580927726, 0.408248290463863]])

        print("\nC =")
        print(C)
        # Matrix([[35.1272233335747, 0, 0],
        #         [0, 2.46539669691652, 0],
        #         [0, 0, 1.17309315627448e-15]])

        print("\nS =")
        print(S)
        # Matrix([[nan, 0, 0],
        #         [0, nan, 0],
        #         [0, 0, 1.00000000000000]])
    else:
        print(result)
    
    
    古德曼函数

    Y = Gudermannian(x)得到古德曼函数结果,将三角函数和双曲函数连系起来.

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


    def gudermannian_function(input_str):
        """
        计算输入表达式的 Gudermannian 函数值,支持标量、矩阵和符号表达式。

        Gudermannian 函数定义为:gd(x) = 2 * arctan(exp(x)) - π/2

        参数:
        input_str (str): 输入的数学表达式字符串,可以是标量、矩阵或符号。

        返回:
        计算结果 (SymPy 表达式/矩阵) 或错误信息字符串。
        """
        try:
            # 将输入字符串解析为 SymPy 表达式
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 处理元组类型输入(通常为无效输入)
            if expr.free_symbols:
                # 符号表达式处理:返回符号表达式
                result = sp.simplify(2 * sp.atan(sp.exp(expr)) - sp.pi / 2)
            elif expr.is_number:
                z = complex(expr)
                result = np.arcsin(np.tanh(z))
            else:
                error = True

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

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


    # 示例用法
    if __name__ == "__main__":
        # 示例 1: 标量数值输入
        print("示例 1:")
        print(gudermannian_function("1+2j"))
        # (1.2304675059389543-0.6765532587260855j)

        # 示例 2: 符号输入
        print("\n示例 2:")
        x = sp.symbols('x')
        print(gudermannian_function("x"))
        # 2*atan(exp(x)) - pi/2