首页 函数目录

    广义拉盖尔函数和拉盖尔多项式

    如果n是非负整数,laguerreL(n,x)返回n次拉盖尔多项式.当n不是非负整数时.laguerreL返回拉盖尔函数.

    如果n是非负整数,则laguerreL(n,a,x) 返回n次广义拉盖尔多项式.

    n — 多项式的次数, 数,向量,矩阵,符号数,符号向量,符号矩阵,符号函数

    x — 输入, 数,向量,矩阵,符号数,符号向量,符号矩阵,符号函数

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


    def laguerre_polynomial(input_str):
        """
        计算广义或普通 Laguerre 多项式,对标 MATLAB 的 laguerreL 函数

        参数:
        input_str: 字符串形式的输入,支持以下格式:
                   - 两个参数: "(n, x)" 对应普通 Laguerre 多项式
                   - 三个参数: "(n, a, x)" 对应广义 Laguerre 多项式
                   参数可以是标量或矩阵

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

        示例:
        >>> laguerre_polynomial("(2, 0.5)")
        0.125
        >>> laguerre_polynomial("(2, 1, 0.5)")
        0.375
        >>> laguerre_polynomial("([[1,2], [3,4]], [[0,1], [2,3]])")
        Matrix([
        [1, 0.5],
        [0, -0.5]])
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 参数解析逻辑
            if isinstance(expr, tuple):
                # 处理广义 Laguerre 多项式 (n, a, x)
                if len(expr) == 3:
                    if all(e.is_number for e in expr):
                        n = int(expr[0])
                        a = float(expr[1])
                        x = complex(expr[2])
                        result = eval_genlaguerre(n, a, x)
                    elif any(e.free_symbols for e in expr):
                        result = sp.assoc_laguerre(*expr).doit()
                    else:
                        error = True
                elif len(expr) == 2:
                    if all(e.is_number for e in expr):
                        n = int(expr[0])
                        a = 0
                        x = complex(expr[1])
                        result = eval_genlaguerre(n, a, x)
                    elif any(e.free_symbols for e in expr):
                        result = sp.laguerre(*expr).doit()
                    else:
                        error = True
                else:
                    error = True
            else:
                error = True

            return result if not error else f"错误:输入必须是参数元组"

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


    # 示例测试
    if __name__ == "__main__":
        # 普通 Laguerre 测试
        print("普通 Laguerre 多项式测试:")
        print(laguerre_polynomial("0, 5"))
        # (1+0j)

        print(laguerre_polynomial("1, 2"))
        # (-1+0j)

        print(laguerre_polynomial("x, 0.5"))
        # laguerre(x, 0.5)

        # 广义 Laguerre 测试
        print("\n广义 Laguerre 多项式测试:")
        print(laguerre_polynomial("(x, 0, 5)"))
        # laguerre(x, 0.5)

        print(laguerre_polynomial("(2, 1, 0.5)"))
        # (1.625+0j)
    
    
    朗伯W函数

    lambertw(x)返回Lambert W函数的主分支.此语法等效于lambertw(0,x).

    lambertw(k,x)是Lambert W函数的第k个分支.仅当k=0或k=-1时.此语法才返回实值.

    x —— 输入,数字,矢量,矩阵,数组,符号数,符号变量,符号数组,符号函数,符号表达式

    k —— Lambert W函数的分支,整数,整数的矢量或矩阵,符号整数,符号矢量或整数的矩阵
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from scipy.special import lambertw


    def lambert_w_value(input_str):
        """
        对标 MATLAB 的 lambertw 函数,计算 Lambert W 函数的值,支持标量和矩阵输入。

        参数:
        input_str: 输入的字符串,可以是数值、矩阵或元组(分支参数和变量参数)。

        返回:
        计算结果(数值、矩阵或符号表达式),或错误信息。

        示例:
        >>> lambert_w_value("0.5")
        0.3517337112491958
        >>> lambert_w_value("(-1, 0.5)")
        -1.756431208626170
        >>> lambert_w_value("[[1, 2], [3, 4]]")
        Matrix([
        [0.567143290409784, 0.852605502013725],
        [1.04990889496404, 1.20216787319705]])
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 处理元组输入 (分支k, 变量x)
            if isinstance(expr, tuple) and len(expr) == 2:
                k_part = expr[0]
                x_part = expr[1]
                if k_part.is_integer and x_part.is_number:
                    k = int(k_part)
                    x = complex(x_part)
                    result = lambertw(x, k=k)
                elif k_part.is_integer and x_part.free_symbols:
                    result = sp.LambertW(x_part, k_part)
                else:
                    error = True
            elif expr.is_number:
                k = 0
                x = complex(expr)
                result = lambertw(x, k=k)
            elif expr.free_symbols:
                result = sp.LambertW(expr)
            else:
                error = True

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

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


    # 示例代码
    if __name__ == "__main__":
        # 示例1: 计算主分支 W0(0.5)
        print("示例1:", lambert_w_value("0.5"))
        # (0.35173371124919584+0j)

        # 示例2: 计算分支 k=-1 的 W_{-1}(0.5)
        print("示例2:", lambert_w_value("(-1, 0.5)"))
        # (-2.259158898533606-4.220960969266197j)
    
    
    拉普拉斯变换

    F = laplace(f) 返回 f 的拉普拉斯变换. 默认情况下, 独立变量为t, 变换变量为s.

    F = laplace(f,transVar) 使用变换变量 transVar 而不是 s.

    F = laplace(f,var,transVar) 分别使用独立变量 var 和变换变量 transVar 而不是 t 和 s.

    f — 输入, 符号表达式,符号函数,符号向量,符号矩阵

    var — 独立变量,t(默认),符号变量. 独立变量, 指定为符号变量. 此变量通常称为“时间变量”或“空间变量”. 如果您未指定变量, 则默认情况下, 拉普拉斯使用t. 如果f不包含t, 则拉普拉斯使用函数 symvar 来确定独立变量.

    transVar — 变换变量, s(默认)| z , 符号变量 , 符号表达式 , 符号向量 , 符号矩阵 变换变量,指定为符号变量、表达式、向量或矩阵. 此变量通常称为“复频率变量”. 如果您未指定变量,则默认情况下,拉普拉斯使用s. 如果s是f的独立变量, 则拉普拉斯使用z.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp


    def laplace_transform(input_str):
        """
        对标 MATLAB 的 laplace 函数,计算拉普拉斯变换

        参数:
        input_str: 输入字符串,可以是:
                  1. 单个表达式 (自动检测变量)
                  2. 元组 (f, transVar)
                  3. 元组 (f, var, transVar)
                  4. 矩阵

        返回:
        拉普拉斯变换结果 (数值、矩阵或符号表达式),或错误信息

        示例:
        >>> laplace_transform("exp(-t)")
        1/(s + 1)
        >>> laplace_transform("(exp(-t), z)")
        1/(z + 1)
        >>> laplace_transform("(sin(a*x), x, s)")
        a/(a**2 + s**2)
        >>> laplace_transform("[[t, t**2], [t**3, t**4]]")
        Matrix([
        [  1/s**2,    2/s**3],
        [6/s**4, 24/s**5]])
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            def compute_laplace(f, var=None, trans_var=None):
                """
                核心计算函数
                """
                # 自动检测变量
                if var is None:
                    # 优先尝试常用变量 t
                    t = sp.symbols('t')
                    var = t if f.has(t) else next(iter(f.free_symbols), t)

                # 自动生成变换变量
                if trans_var is None:
                    trans_var = sp.symbols('s') if var == sp.symbols('t') else sp.symbols('z')

                # 执行拉普拉斯变换并忽略收敛条件
                return sp.laplace_transform(f, var, trans_var, noconds=True)

            # 处理元组输入 (f, var, trans_var) 或 (f, trans_var)
            if isinstance(expr, tuple):
                params = list(expr)
                n_params = len(params)

                if n_params not in (2, 3):
                    return f"错误:需要 2 或 3 个参数,当前收到 {n_params} 个"

                # 解析参数
                f_part = params[0]
                var_part = params[1] if n_params == 3 else None
                trans_var_part = params[-1]

                # 标量计算
                result = compute_laplace(
                    f=f_part,
                    var=var_part,
                    trans_var=trans_var_part
                )

            # 处理标量输入
            elif expr.free_symbols:
                result = compute_laplace(expr)
            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:", laplace_transform("exp(-t)"))
        # 1/(s + 1)

        # 测试2: 指定变换变量
        print("测试2:", laplace_transform("(exp(-t), z)"))
        # 1/(z + 1)

        # 测试3: 指定变量和变换变量
        print("测试3:", laplace_transform("(sin(a*x), x, s)"))
        # a/(a**2 + s**2)
    
    
    拉普拉斯算子

    l = laplacian(f,v) 返回符号域 f 相对于笛卡尔坐标中的向量 v 的拉普拉斯算子. 如果 f 是一个数组, 则该函数计算 f 的每个元素的拉普拉斯算子并返回与 f 大小相同的输出 l.

    l = laplacian(f) 返回符号域 f 相对于由 f 中的符号变量构造的默认向量的拉普拉斯算子.

    f — 符号域,符号表达式,符号函数,符号矩阵变量,符号矩阵函数

    v — 用于查找拉普拉斯算子的向量,符号标量变量的向量,符号函数,符号矩阵变量,符号矩阵函数
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp


    def laplacian_equation(input_str):
        """
        对标 MATLAB 的 laplacian 函数,计算拉普拉斯算子

        参数:
        input_str: 输入字符串,支持以下形式:
                  1. 标量表达式 (自动检测变量)
                  2. 元组 (表达式, 变量列表)
                  3. 矩阵 (逐元素计算)

        返回:
        拉普拉斯算子计算结果 (标量、矩阵或符号表达式),或错误信息

        示例:
        >>> laplacian_equation("x**2 + y**2")
        4
        >>> laplacian_equation("([[x*y, x**2], [y**2, x+y]], [x, y])")
        Matrix([
        [0, 2],
        [2, 0]])
        """
        try:
            expr = sp.sympify(input_str)
            error_msg = None
            result = None

            def compute_laplacian(f, vars=None):
                """计算拉普拉斯算子的核心函数"""
                # 自动检测变量(按字母顺序排序)
                if vars is None:
                    vars = sorted(f.free_symbols, key=lambda s: s.name)
                    if not vars:
                        raise ValueError("表达式不含自由变量")

                # 验证变量类型
                if not all(isinstance(v, sp.Symbol) for v in vars):
                    raise TypeError("变量列表中包含非符号对象")

                # 计算拉普拉斯算子:Σ ∂²f/∂v²
                return sum(sp.diff(f, v, v) for v in vars)

            # 处理元组输入 (表达式, 变量列表)
            if isinstance(expr, tuple):
                # 参数数量验证
                if len(expr) != 2:
                    return f"错误:需要 2 个参数的元组 (表达式, 变量列表),收到 {len(expr)} 个参数"

                f_part, vars_part = expr[0], expr[1]

                # 变量列表验证
                if not isinstance(vars_part, (list, tuple)):
                    return "错误:第二个参数必须是变量列表"

                # 转换为符号变量
                try:
                    vars_list = [sp.sympify(v) for v in vars_part]
                except Exception as e:
                    return f"变量列表解析错误: {str(e)}"

                result = compute_laplacian(f_part, vars_list)

            # 处理标量输入 (自动检测变量)
            elif expr.free_symbols:
                result = compute_laplacian(expr)

            else:
                error_msg = f"无法识别的输入类型: {type(expr)}"

            return result if not error_msg else error_msg

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


    # 测试用例
    if __name__ == "__main__":
        # 测试1: 标量函数
        print("测试1:", laplacian_equation("f(x,y,z)"))
        # Derivative(f(x, y, z), (x, 2)) + Derivative(f(x, y, z), (y, 2)) + Derivative(f(x, y, z), (z, 2))

        print("测试2:", laplacian_equation("x**2 + y**2 + z**2"))
        # 6

        # 测试3: 带变量列表
        print("测试3:", laplacian_equation("(sin(x)*cos(y), [x, y])"))
        # -2*sin(x)*cos(y)
    
    
    最小公倍数

    L = lcm(A,B) 返回 A 和 B 元素的最小公倍数.

    A,B — 输入值,标量,向量,实数数组或正整数值

    L — 最小公倍数,实数,正整数值
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np


    def lcm_number(input_str):
        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(int(e) for e in expr)
                    result = np.lcm(*params)
                elif any(e.free_symbols for e in expr):
                    result = sp.lcm(*expr)
                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(lcm_number("(6, 8)"))
        # 24
    
    
    埃尔米特不定矩阵的分块LDL分解

    [L,D,P] = ldl(A)将满矩阵A分解为置换的下三角矩阵L和满足A = L*D*L'的分块对角矩阵D, 以向量形式返回置换信息P.

    A — 输入矩阵,实数或复数方阵

    L — 下三角因子,方阵

    D — 分块对角因子,方阵

    P — 置换信息,矩阵,向量
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import numpy as np
    import sympy as sp
    from scipy.linalg import lu, ldl


    def ldl_decomposition_matrix(input_str):
        """
        执行 LDL 分解的主函数

        参数:
        input_str: 输入矩阵的字符串表达式(如 "[[1, 2], [3, 4]]")

        返回:
        - 符号矩阵: 返回 (L, D) 元组
        - 数值矩阵: 返回 (L, D, perm) 元组
        - 错误输入: 返回错误消息字符串

        注意:
        - 当矩阵包含符号时自动声明符号为实数类型
        - 自动检查矩阵对称性(符号矩阵场景)
        """
        try:
            # 将输入字符串转换为 SymPy 表达式
            expr = sp.sympify(input_str)
            error = False
            result = None

            A = sp.Matrix(expr) if isinstance(expr, list) else None
            if A is not None:
                # 检测符号和虚数存在性
                contains_symbols = A.is_symbolic()
                has_imaginary = any(element.has(sp.I) for element in A)

                if contains_symbols:
                    # 自动声明所有符号为实数
                    symbols = A.free_symbols
                    real_subs = {s: sp.Symbol(s.name, real=True) for s in symbols}
                    A = A.subs(real_subs)

                    # 显式检查矩阵对称性
                    if A != A.T:
                        return f"错误: 矩阵必须对称,当前矩阵不对称\n{A}"

                    # 执行 LDL 分解
                    try:
                        l, d = A.LDLdecomposition()
                        result = (l, d)
                    except ValueError as e:
                        return f"分解错误: {e}"
                elif has_imaginary:
                    # 执行 LDL 分解
                    try:
                        l, d = A.LDLdecomposition()
                        result = (l, d)
                    except ValueError as e:
                        return f"分解错误: {e}"
                else:
                    # 数值矩阵处理
                    try:
                        N_A = np.array(A, dtype=float)
                        lu_mat, d_mat, perm = ldl(N_A)
                        result = (
                            sp.Matrix(lu_mat),
                            sp.Matrix(d_mat),
                            sp.Matrix(perm)
                        )
                    except np.linalg.LinAlgError as e:
                        return f"数值分解错误: {e}"
            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: 符号矩阵分解")
        symbolic_matrix = "[[a, b], [b, c]]"
        print(f"输入矩阵: {symbolic_matrix}")
        L, D = ldl_decomposition_matrix(symbolic_matrix)
        print("L 矩阵:")
        print(L)
        # Matrix([[1, 0],
        #         [b/a, 1]])
        print("D 矩阵:")
        print(D)
        # Matrix([[a, 0],
        #         [0, c - b**2/a]])
        print("\n" + "=" * 50 + "\n")

        # 示例 2: 实数数值矩阵分解
        print("示例 2: 数值矩阵分解")
        numeric_matrix = "[[4, 12, -16], [12, 37, -43], [-16, -43, 98]]"
        print(f"输入矩阵: {numeric_matrix}")
        L, D, perm = ldl_decomposition_matrix(numeric_matrix)
        print("L 矩阵:")
        print(L)
        # Matrix([[1.00000000000000, 0, 0],
        #         [3.00000000000000, 0.147058823529412, 1.00000000000000],
        #         [-4.00000000000000, 1.00000000000000, 0]])
        print("D 矩阵:")
        print(D)
        # Matrix([[4.00000000000000, 0, 0],
        #         [0, 34.0000000000000, 0],
        #         [0, 0, 0.264705882352941]])
        print("置换矩阵:")
        print(perm)
        # Matrix([[0],
        #         [2],
        #         [1]])
        print("\n" + "=" * 50 + "\n")
    
    
    勒奇超越函数

    LenchPhi(z,s,a)对于某些特殊参数,LerchPhi会自动计算为精确值.

    LerchPhi可以评估为任意的数值精度.

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


    def lench_phi_transcendent(input_str):
        """
        对标 MATLAB 的 LerchPhi 函数的实现,支持标量和矩阵输入

        Lerch Phi 函数定义:
        Φ(z, s, a) = ∑_{n=0}^∞ z^n / (a + n)^s

        分类归属:
        属于特殊函数中的超越函数(Transcendental Function),
        是广义的 Zeta 函数,包含 Riemann Zeta 和 Hurwitz Zeta 函数作为特例

        参数:
        input_str: 输入表达式字符串,格式为元组 (n, a, x) 或单个数值,
                   支持矩阵输入(需确保维度一致)

        返回:
        计算结果(标量/矩阵)或错误信息字符串

        示例:
        >>> lench_phi_transcendent("(0.5, 1, 0.2)")
        1.64493406684823
        >>> lench_phi_transcendent("([[0.5, 1], [2, 3]], 1, 0.2)")
        Matrix([
        [1.64493406684823, 2.16439397443791],
        [3.30685281944005, 4.17469149400356]])
        """
        try:
            # 解析输入为 SymPy 表达式
            expr = sp.sympify(input_str, evaluate=False)
            error = False

            # 参数校验
            if not isinstance(expr, tuple) or len(expr) != 3:
                return f"输入格式错误: 需要三元组 (n, a, x),实际输入 {input_str}"

            if all(e.is_number for e in expr):
                params = tuple(complex(e.evalf()) for e in expr)
                result = lerchphi(*params)
            elif any(e.free_symbols for e in expr):
                result = sp.lerchphi(*expr)
            else:
                error = True

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

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


    # ----------------------
    # 示例测试代码
    # ----------------------
    if __name__ == "__main__":
        # 标量计算示例
        print(lench_phi_transcendent("(0.5, 1, 0.2)"))
        # (5.59472668491108 + 0.0j)

        print(lench_phi_transcendent("(2, 1, 1.5)"))
        # (-0.376774759859769 - 1.11072073453959j)
    
    
    第一类勒让德多项式

    P = legendre(n,X) 为 X 中的每个元素计算阶数为n,级数为m = 0, 1, ..., n 时的第一类勒让德多项式.

    n — 勒让德函数的阶,正整数

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


    def legendre_polynomial(input_str):
        """
        对标 MATLAB 的 legendreP 函数,计算 Legendre 多项式

        参数:
        input_str: 输入字符串,可以是以下形式:
                  1. 元组 (n, x):标量或矩阵参数
                  2. 单个数值/符号:默认视为 n=输入值,x=自动符号化

        返回:
        Legendre 多项式计算结果 (数值、矩阵或符号表达式),或错误信息

        示例:
        >>> legendre_polynomial("(0, 0.5)")
        1.00000000000000
        >>> legendre_polynomial("([[1,2], [3,4]], [[0.1,0.2], [0.3,0.4]])")
        Matrix([
        [0.100000000000000, 0.200000000000000],
        [ -0.365000000000000, -1.12000000000000]])
        """
        try:
            expr = sp.sympify(input_str)
            error_msg = None
            result = None

            def legendre_p_sym(n, x):
                """核心计算函数,包含参数验证"""
                # 数值型n的验证
                if n.is_number:
                    # 检查是否为整数
                    if not n.is_integer:
                        raise ValueError("阶数n必须为整数")
                    # 转换为Python整数
                    n_int = int(n)
                    # 检查非负性
                    if n_int < 0:
                        raise ValueError("阶数n必须为非负整数")

                # 计算Legendre多项式
                return sp.legendre(n, x)

            def legendre_p_sic(n, x):
                """
                对标 MATLAB 的 legendreP 函数,计算Legendre多项式值(仅标量数值参数)

                参数:
                n (int):  多项式阶数(非负整数)
                x (float): 自变量值

                返回:
                float: Legendre多项式在x处的值

                异常:
                ValueError: 如果n不是整数或为负数
                """
                # 验证n是否为非负整数
                if not isinstance(n, (int, np.integer)):
                    raise ValueError("阶数n必须是整数")
                if n < 0:
                    raise ValueError("阶数n必须为非负整数")

                # 计算Legendre多项式值
                return eval_legendre(n, x)

            # 处理元组输入 (n, x)
            if isinstance(expr, tuple) and len(expr) == 2:

                if all(e.is_number for e in expr):
                    n = int(expr[0])
                    x = float(expr[1])
                    result = legendre_p_sic(n, x)

                elif any(e.free_symbols for e in expr):
                    result = legendre_p_sym(*expr)

                else:
                    error = True

            else:
                # 如果输入是纯数字,视为n=输入值,x=符号x
                result = legendre_p_sym(expr, sp.symbols('x'))

            return result

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


    # 测试用例
    if __name__ == "__main__":
        # 测试1: 标量计算
        print("测试1:", legendre_polynomial("(0, 0.5)"))
        # 1.0

        print("测试2:", legendre_polynomial("(2, 0.5)"))
        # -0.125

        print("测试4:", legendre_polynomial("(2, x)"))
        # 3*x**2/2 - 1/2

        print("测试5:", legendre_polynomial("3"))
        # 5*x**3/2 - 3*x/2

        print("测试6:", legendre_polynomial("(2.5, 0.1)"))
        # -0.485
    
    
    第二类勒让德多项式

    P = legendre(n,X) 为 X 中的每个元素计算阶数为n,级数为m = 0, 1, ..., n 时的第二类勒让德多项式.

    n — 勒让德函数的阶,正整数

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


    def legendre_polynomial_second_kind(input_str):
        """
        对标 Wolfram 的 LegendreQ[n, 0, x],计算第二类 Legendre 多项式(连带次数 m=0)

        参数:
        input_str: 输入字符串,解析为 (n, x) 的元组,支持标量或矩阵输入

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

        注意:
        - 仅支持整数阶 n 和标量 x
        - 当 n 为非整数时,符号计算可能不准确
        - 矩阵输入需确保形状一致

        示例:
        >>> legendre_polynomial_second_kind("(2, 0.5)")
        0.549306144334055
        >>> legendre_polynomial_second_kind("(n, x)")
        (log((x + 1)/(1 - x))*LegendreP(n, x)/2 - Sum(LegendreP(k, x)/(n - k), (k, 0, n - 1))/2)
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            def legendre_q_scalar(n, x):
                """
                计算第二类 Legendre 函数 Q_n(x)(m=0 的情况) - 标量输入版本

                参数:
                    n: 阶数(非负整数)
                    x: 自变量(实数或复数)

                返回:
                    Q_n(x) 的值
                """
                # 确保 n 是整数
                if not isinstance(n, (int, np.integer, sp.Integer)):
                    raise TypeError("阶数 n 必须是整数")
                if n < 0:
                    raise ValueError("阶数 n 必须为非负整数")

                # 计算 Q_n(x)
                q, _ = lqmn(0, int(n), complex(x))
                return q[0, -1]

            # 输入必须为 (n, x) 的元组
            if isinstance(expr, tuple) and len(expr) == 2:

                if all(e.is_number for e in expr):
                    result = legendre_q_scalar(*expr)
                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("Q0(0.5) =", legendre_polynomial_second_kind("0, 0.5"))
        # 0.5493061443340549

        print("Q1(1.5) =", legendre_polynomial_second_kind("1, 1.5"))
        # 0.20707843432557524

        print("Q2(2.5) =", legendre_polynomial_second_kind("2, 2.5"))
        # 0.009884255468216039

        # 2. 复数输入
        print("\n复数输入:")
        x_complex = 0.5 + 0.5j
        print(f"Q2({x_complex}) =", legendre_polynomial_second_kind(f"2, {x_complex}"))
        # (-1.3663605082270465-0.7250175708671287j)
    
    
    符号函数极限

    limit(f,var,a)在var接近a时返回符号表达式f的双向极限.

    limit(f,a)使用symvar找到的默认变量.

    limit(f)返回的极限为0.

    limit(f,var,a,left)在var接近a时返回f的左侧极限.

    limit(f,var,a,right)在var接近a时返回f的右侧极限.

    f —— 输入,符号表达式,符号函数,符号向量,符号矩阵

    var — 自变量,符号变量

    a —— 极限点, 数字
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp


    def limit_equation(input_str):
        """
        对标 MATLAB 的 limit 函数实现,支持多元极限计算

        功能特性:
        1. 支持标量/矩阵输入
        2. 支持左右极限计算
        3. 自动符号变量检测
        4. 数值与符号混合计算

        参数格式:
        "表达式, 变量->趋近点, 方向" 或元组形式 (表达式, 变量, 趋近点, 方向)

        返回:
        计算结果(标量/矩阵)或错误信息字符串

        示例:
        >>> limit_equation("(sin(x)/x, x, 0)")
        1
        >>> limit_equation("([[x,y], [1/x,sin(y)/y]], y, 0)")
        Matrix([
        [x, 0],
        [1/x, 1]])
        >>> limit_equation("(1/x, x, 0, 'right')")
        ∞
        """
        try:
            # 参数解析与标准化
            def parse_parameters(expr):
                """将输入统一转换为四元组 (f, var, a, dir)"""
                # 默认参数设置
                default_var = None
                default_a = 0
                default_dir = '+-'

                if isinstance(expr, tuple):
                    params = list(expr)
                    # 参数数量校验
                    if len(params) < 2 or len(params) > 4:
                        raise ValueError("参数数量错误,需要2-4个参数")

                    # 参数类型推断
                    f = params[0]
                    var = params[1] if len(params) >= 2 else default_var
                    a = params[2] if len(params) >= 3 else default_a
                    direction = params[3] if len(params) == 4 else default_dir
                    return f, var, a, direction
                else:
                    # 处理非元组输入
                    return expr, default_var, default_a, default_dir

            # 符号化输入并解析参数
            expr = sp.sympify(input_str, evaluate=False)
            f_expr, var_expr, a_expr, dir_expr = parse_parameters(expr)

            # 主计算逻辑
            def compute_limit(f, var, a, direction):
                """核心极限计算函数"""
                # 自动检测变量
                if var is None:
                    free_symbols = f.free_symbols
                    if len(free_symbols) != 1:
                        raise ValueError("自动变量检测失败:表达式包含多个自由符号")
                    var = next(iter(free_symbols))

                # 方向参数标准化
                dir_map = {'left': '-', 'right': '+', None: None}
                direction = dir_map.get(str(direction).lower(), direction)

                # 执行极限计算
                try:
                    return sp.limit(f, var, a, dir=direction)
                except (NotImplementedError, ValueError) as e:
                    return f"计算错误: {str(e)}"

            # 分支处理逻辑
            result = None
            # 情况2:符号表达式输入
            if isinstance(f_expr, sp.Expr):
                result = compute_limit(f_expr, var_expr, a_expr, dir_expr)
            else:
                raise TypeError("不支持的输入类型")

            return result.evalf() if isinstance(result, sp.Expr) else result

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


    # ----------------------
    # 示例测试代码
    # ----------------------
    if __name__ == "__main__":
        # 基础标量计算
        print(limit_equation("(sin(x)/x, x, 0)"))
        # 1.00000000000000

        print(limit_equation("(exp(1/x), x, 0, 'right')"))
        # oo

        # 自动变量检测
        print(limit_equation("(sin(z)/z, z, 0)"))
        # 1.00000000000000

        print(limit_equation("(sin(x)/x)"))
        # 1.00000000000000
    
    
    线性方程组求解

    X = linsolve(A,B) 使用以下方法之一求解线性方程组 AX = B:

    当A是方阵时,linsolve使用LU分解和部分主元消元法.

    对于所有其他情况,linsolve使用QR分解和列主元消元法.

    如果A为病态(对于方阵)或秩亏(对于矩形矩阵),则linsolve发出警告.

    A - 系数矩阵, 符号矩阵

    B - 输入数组, 向量,矩阵.

    X - 输出,向量,矩阵.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from sympy import Matrix, linsolve, linear_eq_to_matrix, Eq, sympify


    def linear_equations_solve(input_str):
        """
        改进后的线性方程组求解函数,支持符号输入及方程表达式直接输入
        """
        try:
            # 符号化输入并标准化处理
            expr = sympify(input_str)

            def parse_input(expr):
                """输入解析标准化为 (A, b) 形式"""
                # 增广矩阵处理
                M = sp.Matrix(expr) if isinstance(expr, list) else None
                if M is not None:
                    if M.cols < 2:
                        raise ValueError("增广矩阵至少需要2列")
                    return M[:, :-1], M[:, -1]

                # 元组输入处理
                if isinstance(expr, tuple):
                    if len(expr) != 2:
                        raise ValueError("输入格式应为 (方程列表, 变量列表) 或 (系数矩阵, 常数项)")
                    equations_part, vars_part = expr
                    # 先判断是否为 (方程表达式, 变量列表) 形式
                    if all(isinstance(v, sp.Symbol) for v in vars_part):
                        # 检查 equations_part 是否真的是方程表达式列表
                        if all(isinstance(eq, (sp.Expr, sp.Eq)) for eq in equations_part):
                            # 将表达式列表转换为等式列表(假设表达式右边为0)
                            eq_list = [Eq(eq, 0) if not isinstance(eq, sp.Eq) else eq for eq in equations_part]
                            A, b = linear_eq_to_matrix(eq_list, vars_part)
                            return A, b
                    # 否则按 (系数矩阵, 常数项) 处理
                    A = Matrix(equations_part) if isinstance(equations_part, list) else equations_part
                    b = Matrix(vars_part) if isinstance(vars_part, list) else vars_part
                    if not isinstance(A, Matrix) or not isinstance(b, Matrix):
                        raise TypeError("系数矩阵和常数项需要为矩阵或可转换形式")
                    return A, b

                raise TypeError("不支持的输入格式")

            A, b = parse_input(expr)
            # 维度校验
            if A.rows != b.rows:
                raise ValueError(f"维度不匹配: A({A.shape}) vs b({b.shape})")

            # 符号解计算
            return linsolve((A, b))
        except Exception as e:
            return f"求解错误: {str(e)}"


    # ----------------------
    # 示例测试代码
    # ----------------------
    if __name__ == "__main__":
        x, y, z = sp.symbols('x y z')

        # 正确输入测试(方程表达式列表 + 变量列表)
        test_input = (
            [3 * x + 2 * y - z - 1,
             2 * x - 2 * y + 4 * z + 2,
             2 * x - y + 2 * z],
            [x, y, z]
        )
        print(linear_equations_solve(str(test_input)))
        # {(1, -2, -2)}

        # 数值解示例(增广矩阵)
        print(linear_equations_solve("[[3, 2, -1, 1], [2, -2, 4, -2], [2, -1, 2, 0]]"))
        # {(1, -2, -2)}

        # 符号解示例(系数矩阵 + 常数项)
        print(linear_equations_solve("([[1, 1], [1, -1]], [5, 1])"))
        # {(3, 2)}
    
    
    点线图

    ListPlot(x,(y)通过将抽象数字映射为几何图形,赋予数据空间意义.直观、快速地将离散数据点可视化.

    趋势识别:销售数据监控

    X = [1, 2, 3, 4, 5] (代表星期一至星期五)

    Y = [1, 2, 3, 2, 1] (代表每日销量)

    图的作用:一眼看出销量在周中(星期三)达到峰值,周初和周末较低。结论:可能需要加强周末促销或分析周中高峰原因。

    异常点检测:传感器读数

    X = [1, 2, 3, 4, 5] (连续5个时间点的采样)

    Y = [10, 10.2, 10.1, 15.5, 10.3] (温度传感器读数)

    图的作用:第4个点 (15.5) 明显脱离其他点形成的“平坦线”。结论:该时间点可能存在传感器瞬时故障、外部干扰或真实异常事件,需要检查。

    算法迭代过程:优化算法收敛

    X = [1, 2, 3, 4, 5] (迭代次数)

    Y = [100, 50, 25, 12, 6] (目标函数值,如误差、成本)

    图的作用:清晰显示误差随迭代次数快速下降并趋于稳定。结论:算法收敛良好;可能在第4/5次迭代后即可停止,节省计算资源。

    简单系统响应:弹簧振子位移

    X = [0, 1, 2, 3, 4] (时间 t)

    Y = [0, 2, 0, -2, 0] (位移 s)

    图的作用:点描绘出一个振荡衰减(或理想简谐运动)的轨迹。结论:直观验证了物理模型的预期行为(周期性运动)。

    A/B测试结果:用户点击率对比

    数据组A (旧方案): Y_A = [5.1, 5.3, 5.0, 5.2, 5.1] (%)

    数据组B (新方案): Y_B = [5.5, 6.0, 5.8, 5.7, 6.2] (%)

    图的作用:将两条线画在同一图上。结论:新方案(B线)稳定且显著高于旧方案(A线),初步证明新方案有效。

    资源消耗监控:服务器内存占用

    X = [9:00, 10:00, 11:00, 12:00, 13:00] (时间)

    Y = [45, 48, 65, 62, 50] (内存使用率 %)

    图的作用:显示在上午11点和12点出现明显峰值。结论:该时段负载较高,需关注是否常态或进行扩容/优化。

    离散事件记录:网站每日故障次数

    X = [1, 2, 3, 4, 5] (日期)

    Y = [0, 0, 1, 0, 3] (故障次数)

    图的作用:大部分日期无故障(Y=0),第3天有1次小故障,第5天发生3次故障(显著异常)。结论:需紧急排查第5天的系统问题。
    
    三维点线图

    ListPlot3D(f1(x),f2(x)) 将离散的三维数据点集转化为空间中的可视化图形,揭示复杂的高维关系.

    对数螺旋线: 半径对数增长,避免大尺度发散

    ListPlot3D(ln(a+1)*cos(a),ln(a+1)*sin(a),a=[0.1,50,500])

    阻尼振荡弹簧: 振幅指数衰减的压缩螺旋

    ListPlot3D(a*cos(a)*exp(-0.01a),a*sin(a)*exp(-0.01a),0.2a,a=[0.1,50,500])

    双频率扭曲曲线: XY 平面螺旋 + Z 方向正弦振荡

    ListPlot3D(a*cos(0.5a),a*sin(0.8a),10sin(0.1a),a=[0.1,50,500])

    球面螺旋: 球坐标系下的缓慢展开螺旋

    ListPlot3D(a*sin(0.02a)*cos(a),a*sin(0.02a)*sin(a),a*cos(0.02a),a=[0.1,50,500])

    锥形莫比乌斯带: 经典莫比乌斯带叠加径向缩放

    ListPlot3D((1+0.3cos(1.5a))*cos(a),(1+0.3cos(1.5a))*sin(a),0.5sin(1.5a)*log(a+1),a=[0.1,50,500])

    指数增长螺旋线 (半径指数爆炸): 两个带电粒子在强电场和磁场耦合作用下的分离轨迹。

    ListPlot3D(exp(0.1*a)*a,exp(0.1*a)*(-a),a,a=[0.1,50,500])

    对数收敛空间曲线 (半径对数饱和): 演示非线性函数组合对空间形态的显著影响。

    ListPlot3D(ln(a+10)*a,ln(a+10)*sqrt(a),0.5*a^2,a=[1,50,500])

    幂律组合弹簧 (振幅幂律衰减): 更真实的阻尼模型(指数衰减是理想特例)。

    ListPlot3D(a*exp(-0.02*(a^0.8)),(a^1.2)*exp(-0.02*a^0.8),0.3a,a=[0.5,50,500])

    双曲螺旋线 (渐近线约束): 粒子在特定势场(如重力+斥力)中的逃逸轨迹。

    ListPlot3D(sinh(0.1a),a*cosh(0.1a),0.2a,a=[0.1,50,500])
    
    自然对数

    Y = log(X)返回数组X中每个元素的自然对数ln(x).

    Y = log(b, X)返回数组X中每个元素的以b为底数的对数ln(x).

    log函数的域包含负数和复数,如果使用不当,可能会导致意外结果.对于负数和复数z=u + i*w,复数对数log(z)返回log(abs(z)) + 1i*angle(z)

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


    def logarithmic_natural(input_str):
        """
        对标MATLAB的log函数,计算自然对数

        参数:
        input_str: 输入的字符串表达式,可以是标量、矩阵或SymPy表达式

        返回:
        自然对数结果,矩阵或标量。若输入错误返回错误信息。

        示例:
        logarithmic_natural('5') -> ln(5)的数值
        logarithmic_natural('[[1, 2], [3, 4]]') -> 各元素自然对数的矩阵
        """
        try:
            expr = sp.sympify(input_str)
            result = None
            error = False

            if expr.is_number:
                z = complex(expr)
                result = np.log(z)
            elif expr.free_symbols:
                # 处理标量或符号表达式
                result = sp.log(expr, sp.E)
            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(logarithmic_natural('2'))
        # (0.6931471805599453+0j)
    
    
    针对较小的X精确计算1+X的自然对数

    Y = log1p(X) 计算数组X中每个元素的自然对数log(1+X),但不显式计算1+X.如果X<-1,则Y为复数.

    此函数对于X中的小实数值更精确,因为它会补偿1+X中的舍入误差.

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


    def logarithmic_natural_1p(input_str):
        """
        对标MATLAB的log1p函数,精确计算 log(1+X)
        特别适用于X接近0时的小值场景

        参数:
        input_str: 输入的字符串表达式,可以是标量、矩阵或SymPy表达式

        返回:
        log(1+x) 计算结果,矩阵或标量。若输入错误返回错误信息

        示例:
        logarithmic_natural_1p('1e-20') -> 结果约等于1e-20
        logarithmic_natural_1p('[[0, 0.5], [1, 2]]') -> 各元素计算log1p的矩阵
        """
        try:
            expr = sp.sympify(input_str)  # 转换为SymPy表达式
            error = False
            result = None

            # 处理标量或符号表达式
            if expr.is_number:
                z = complex(expr)
                result = np.log1p(z)
            elif expr.free_symbols:
                result = log1p(expr)  # 数值化计算结果
            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(logarithmic_natural_1p('2+2j'))
        # (1.2824746787307684+0.5880026035475675j)

        # 示例2: 符号表达式输入
        print("\n示例2 符号表达式:")
        x = sp.Symbol('x')
        print(logarithmic_natural_1p('x'))
        # log1p(x)
    
    
    对数积分

    A = logint(x)计算对数积分函数(积分对数)

    logint根据您使用的参数返回浮点或精确的符号结果.

    计算这些数字的整数对数.因为这些数字不是符号对象,所以logint返回浮点结果.

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


    def logarithmic_integral(input_str):
        """
        对标 MATLAB 的 logint 函数的实现,支持标量和矩阵输入

        对数积分定义 (SymPy 实现):
        li(x) = ∫₀^x 1/ln(t) dt (Cauchy主值积分)

        分类归属:
        属于特殊函数中的积分函数,与指数积分、三角函数积分同属超越积分类

        参数:
        input_str: 输入表达式字符串,可以是标量、矩阵或符号表达式

        返回:
        计算结果(标量/矩阵)或错误信息字符串

        示例:
        >>> logarithmic_integral("2")
        1.04516378011749
        >>> logarithmic_integral("[[1, 2], [3, 4]]")
        Matrix([
        [0,       1.04516378011749],
        [2.16358859424961, 4.06403425769027]])
        >>> logarithmic_integral("x")
        li(x)
        """
        try:
            # 解析输入为 SymPy 表达式
            expr = sp.sympify(input_str, evaluate=False)
            return sp.li(expr).evalf()

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


    # ----------------------
    # 示例测试代码
    # ----------------------
    if __name__ == "__main__":
        # 标量计算示例
        print(logarithmic_integral("2"))
        # 1.04516378011749

        print(logarithmic_integral("1.5"))
        # 0.125064986315296

        # 符号计算示例
        x = sp.Symbol('x')
        print(logarithmic_integral("x"))
        # li(x)
    
    
    矩阵对数

    L = logm(A) 是 A 的主矩阵对数,即 expm(A) 的倒数.

    输出L是每个特征值都具有严格位于π和π之间的虚部的唯一对数. 如果A是奇异矩阵或在负实轴上具有特征值,则未定义主对数.

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


    def logarithmic_matrix(input_str):
        """
        计算输入矩阵的矩阵对数,对标 MATLAB 的 logm 函数。

        参数:
        input_str: 输入的字符串,代表矩阵的表达式。

        返回:
        如果输入是有效的方阵,则返回矩阵的对数(计算结果为浮点数);
        否则返回错误信息。
        """
        try:
            # 将输入字符串转换为 SymPy 表达式
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 尝试将输入转换为矩阵
            A = sp.Matrix(expr) if isinstance(expr, list) else None
            if A is not None:
                # 检查矩阵是否为方阵
                if A.is_square:
                    # 计算矩阵的对数并转换为浮点数
                    result = A.log().evalf()
                else:
                    # 非方阵输入判定为错误
                    error = True
            else:
                # 无法转换为矩阵的输入判定为错误
                error = True

            # 根据是否有错误返回结果或错误信息
            return result if not error else f"输入错误: {input_str},输入必须是方阵。"
        except Exception as e:
            # 捕获其他异常并返回错误信息
            return f"错误: {e}"


    # 示范代码
    # 示例 1: 有效的方阵输入
    input_str1 = "[[1, 2], [3, 4]]"
    result1 = logarithmic_matrix(input_str1)
    print(f"输入: {input_str1}, 结果: {result1}")
    # Matrix([[-0.350439813998554 + 2.39111795445172*I, 0.929351205704702 - 1.0937621702091*I],
    #         [1.39402680855705 - 1.64064325531366*I, 1.0435869945585 + 0.750474699138069*I]])
    
    
    以2为底的对数和浮点数分解数

    Y = log2(X)计算X的元素以2为底的对数,满足2^Y=X.

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


    def logarithmic_natural_2(input_str):
        """
        对标MATLAB的log2函数(基础对数部分)
        计算以2为底的对数,支持标量/矩阵/符号输入

        参数:
        input_str: 输入的字符串表达式,可以是标量、矩阵或SymPy表达式

        返回:
        以2为底的对数值,支持以下类型返回:
        - 标量数值:返回浮点数结果
        - 矩阵输入:返回同型矩阵,逐元素计算结果
        - 符号表达式:返回符号表达式
        - 错误输入:返回错误描述

        注意:
        本函数仅实现对数计算部分,MATLAB的浮点数分解功能([f,e] = log2(x))需额外实现

        示例:
        logarithmic_natural_2('8') -> 3.0
        logarithmic_natural_2('[[2,4],[8,16]]') -> [[1.0, 2.0], [3.0, 4.0]]
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 处理数值型标量
            if expr.is_number:
                z = complex(expr)
                result = np.log2(z)
            # 处理符号表达式
            elif expr.free_symbols:
                result = sp.log(expr, 2)  # 保持符号表达式形式
            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(logarithmic_natural_2('8'))
        # (2.9999999999999996+0j)

        print(logarithmic_natural_2('3'))
        # (1.5849625007211563+0j)

        # 示例3: 符号表达式
        print("\n示例3 符号表达式:")
        print(logarithmic_natural_2('x'))
        # log(x)/log(2)

        print(logarithmic_natural_2('2**y'))
        # log(2**y)/log(2)

        # 示例4: 边界值测试
        print("\n示例4 边界值:")
        print(logarithmic_natural_2('0.5'))
        # (-1+0j)

        print(logarithmic_natural_2('1'))
        # 0j
    
    
    对数正态参数估计

    [PAt,pCI]=lognfit(x)也返回参数估计值的95%置信区间。

    [PAt,pCI]=lognfit(x,alpha)指定置信区间的置信水平为100(1-alpha)%。

    x —— 样本数据, 矢量

    alpha——显著性水平, 0.05(默认)|范围(0,1)内的标量
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import numpy as np
    import sympy as sp
    from scipy.stats import norm


    def lognfit(input_data, alpha=0.05):
        """
        对数正态分布参数估计(对标MATLAB lognfit)

        参数:
        input_data (array_like): 输入数据样本,必须为正数
        alpha (float): 置信水平,默认0.05(返回95%置信区间)

        返回:
        tuple: (mu, sigma) 估计参数
        tuple: (mu_ci, sigma_ci) 置信区间(可选)

        示例:
        >>> data = [1.2, 3.5, 2.8, 5.1, 4.7]
        >>> mu, sigma = lognfit(data)
        >>> print(f"mu: {mu:.4f}, sigma: {sigma:.4f}")
        mu: 1.1931, sigma: 0.3050

        >>> params, ci = lognfit(data, alpha=0.1)
        >>> print(f"95% CI for mu: {ci[0]}")
        """
        try:
            # 输入数据验证
            data = np.asarray(input_data, dtype=np.float64)
            if np.any(data <= 0):
                raise ValueError("所有数据必须为正数")

            # 计算对数变换
            log_data = np.log(data)

            # 参数估计(最大似然估计)
            mu = np.mean(log_data)
            sigma = np.std(log_data, ddof=0)  # 使用N而非N-1计算标准差

            # 计算置信区间
            n = len(data)
            z_score = norm.ppf(1 - alpha / 2)

            mu_se = sigma / np.sqrt(n)
            mu_ci = (mu - z_score * mu_se, mu + z_score * mu_se)

            sigma_se = sigma / np.sqrt(2 * n)
            sigma_ci = (sigma - z_score * sigma_se, sigma + z_score * sigma_se)

            return (mu, sigma), (mu_ci, sigma_ci)

        except Exception as e:
            return f"Error: {e}"


    # 基本使用
    data = [1.2, 3.5, 2.8, 5.1, 4.7]
    params, ci = lognfit(data, 0.1)
    print(f"μ估计值: {params[0]}")
    # μ估计值: 1.1283013981833547

    print(f"95%置信区间: [{ci[0][0]}, {ci[0][1]}]")
    # 95%置信区间: [0.7465214703035561, 1.5100813260631534]
    
    
    常用对数(以10为底)

    Y = log10(X) 返回数组X中每个元素的常用对数.该函数同时接受实数和复数输入.对于X在区间(0, Inf)内的实数值,log10返回区间(-Inf ,Inf)内的实数值.

    对于X的复数值和负实数值,log10函数返回复数值.

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


    def logarithmic_natural_10(input_str):
        """
        对标MATLAB的log10函数,计算以10为底的对数
        支持标量、矩阵和符号表达式输入

        参数:
        input_str: 输入的字符串表达式,可以是:
                   - 数值(如'100')
                   - 矩阵(如'[[1, 10], [100, 1000]]')
                   - 符号表达式(如'x')

        返回:
        计算结果,类型与输入对应:
        - 数值输入:返回浮点数结果
        - 矩阵输入:返回同型矩阵,逐元素计算结果
        - 符号表达式:返回符号表达式
        - 错误输入:返回错误描述字符串

        示例:
        >>> logarithmic_natural_10('100')
        2.00000000000000
        >>> logarithmic_natural_10('[[1, 10], [100, 1000]]')
        Matrix([
        [0, 1],
        [2, 3]])
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 处理数值型标量
            if expr.is_number:
                z = complex(expr)
                result = np.log10(z)
            # 处理符号表达式
            elif expr.free_symbols:
                result = sp.log(expr, 10)  # 保持符号表达式形式
            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 标量输入:")
        print(logarithmic_natural_10('1000'))
        # (3+0j)

        print(logarithmic_natural_10('3'))
        # (0.4771212547196625+0j)

        # 示例3: 符号表达式
        print("\n示例3 符号表达式:")
        print(logarithmic_natural_10('x'))
        # log(x)/log(10)

        print(logarithmic_natural_10('10**y'))
        # log(10**y)/log(10)

        # 示例4: 边界值测试
        print("\n示例4 边界值:")
        print(logarithmic_natural_10('0.1'))
        # (-0.9999999999999999+0j)

        print(logarithmic_natural_10('1'))
        # 0j
    
    
    对数拟合

    p = logfit(x,y,n) 返回次数为n的对数 p(x) 的系数.

    x是查询点,指定为一个向量.

    y是查询点位置的拟合值,指定为向量.

    n是对数拟合的次数, 正整数标量.

    Y = a*log(x)+b

    Y = a*log10(x)+b

    Y = a*log2(x)+b
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import numpy as np
    import sympy as sp
    from scipy.optimize import curve_fit


    def log_fit_nonlinear(input_str):
        """
        实现MATLAB风格的logfit对数拟合函数

        参数:
        input_str: 输入字符串,格式为 (x_data, y_data) 或 (x_data, y_data, log_base)
                   log_base可选值为1(自然对数)/2/10,默认为1

        返回:
        字典包含:
        - expression: 拟合公式字符串
        - coefficients: 系数字典
        - r_squared: 拟合优度R²
        - params_cov: 参数协方差矩阵

        示例:
        >>> log_fit_nonlinear("([1,2,3], [5,8,10])")
        """
        try:
            # 解析输入表达式
            expr = sp.sympify(input_str)
            if not isinstance(expr, tuple) or len(expr) not in (2, 3):
                return "错误:输入格式应为 (x, y) 或 (x, y, log_base)"

            # 提取数据
            x_sym = sp.Matrix(expr[0]) if isinstance(expr[0], list) else None
            y_sym = sp.Matrix(expr[1]) if isinstance(expr[1], list) else None

            if x_sym is None or y_sym is None:
                return "错误:x或y数据格式不正确"

            # 转换为numpy数组
            x_data = np.array(x_sym).astype(float).flatten()
            y_data = np.array(y_sym).astype(float).flatten()

            # 验证数据有效性
            if len(x_data) != len(y_data):
                return "错误:x和y数据长度不一致"
            if np.any(x_data <= 0):
                return "错误:x数据必须全为正数"

            # 获取对数基底参数
            log_base = expr[2] if len(expr) == 3 else 1
            valid_bases = {1: np.log, 2: np.log2, 10: np.log10}
            if log_base not in valid_bases:
                return "错误:log_base必须为1/2/10"

            # 定义拟合函数
            def fit_func(x, a, b):
                return a * valid_bases[log_base](x) + b

            # 执行曲线拟合
            initial_guess = [1.0, 1.0]
            params, params_cov = curve_fit(
                fit_func,
                x_data,
                y_data,
                p0=initial_guess,
                maxfev=10000
            )

            # 计算拟合指标
            residuals = y_data - fit_func(x_data, *params)
            ss_res = np.sum(residuals ** 2)
            ss_tot = np.sum((y_data - np.mean(y_data)) ** 2)
            r_squared = 1 - (ss_res / ss_tot)

            # 构造结果
            base_symbol = {
                1: "ln",
                2: "log2",
                10: "log10"
            }[log_base]

            return {
                "expression": f"y = {params[0]:.4f}*{base_symbol}(x) + {params[1]:.4f}",
                "coefficients": {
                    "slope": params[0],
                    "intercept": params[1]
                },
                "goodness_of_fit": {
                    "r_squared": r_squared,
                    "mse": ss_res / len(x_data)
                },
                "covariance_matrix": params_cov
            }

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


    # 示例代码
    if __name__ == "__main__":
        # 示例1:自然对数拟合
        print("示例1:自然对数拟合")
        result1 = log_fit_nonlinear("([2,3,4,5], [3.1,4.2,5.0,5.8])")
        print("拟合结果:", result1["expression"])
        # y = 2.9090*ln(x) + 1.0433

        print("R平方值:", result1["goodness_of_fit"]["r_squared"])
        # 0.9963528403421813

        # 示例2:以10为底的对数拟合
        print("\n示例2:log10拟合")
        result2 = log_fit_nonlinear("([10,100,1000], [5,7,9], 10)")
        print("拟合结果:", result2["expression"])
        # y = 2.0000*log10(x) + 3.0000

        print("协方差矩阵:\n", result2["covariance_matrix"])
        #  [[ 0. -0.]
        #  [-0.  0.]]
    
    
    逻辑拟合

    p = logisticfit(x,y,n) 返回次数为n的对数 p(x) 的系数.

    x是查询点,指定为一个向量.

    y是查询点位置的拟合值,指定为向量.

    n是对数拟合的次数, 正整数标量.

    logistic1: Y = a/(1+exp(-b*(x-c)))

    logistic4: Y = d+(a-d)/(1+(x/c)^b)
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import numpy as np
    import sympy as sp
    from scipy.optimize import curve_fit


    def logistic_fit_nonlinear(input_str):
        """
        使用非线性最小二乘法拟合逻辑斯蒂曲线

        参数:
        input_str: 输入字符串,格式为包含x数据、y数据和可选参数n的元组,例如:
                   "([[x1,x2,...], [y1,y2,...]], n)" 或 "([x1,x2,...], [y1,y2,...], n)"

        返回:
        拟合后的SymPy表达式或错误信息字符串
        """
        try:
            expr = sp.sympify(input_str)  # 解析输入字符串为SymPy表达式
            error = False
            maxfev = 10000  # 最大函数评估次数

            # 定义三参数逻辑斯蒂函数 (n=1)
            def logistic_function1(x, a, b, c):
                return a / (1 + np.exp(-b * (x - c)))

            # 定义四参数S形函数 (n=4)
            def logistic_function2(x, d, a, c, b):
                return d + (a - d) / (1 + (x / c) ** b)

            # 解析输入数据
            if isinstance(expr, tuple):
                # 提取x,y数据及模型参数n
                if len(expr) > 2:
                    x, y, n = expr[0], expr[1], int(expr[2])
                else:
                    x, y = expr[0], expr[1]
                    n = 1  # 默认使用三参数模型

                # 将输入转换为NumPy数组
                X = sp.Matrix(x) if isinstance(x, list) else None
                Y = sp.Matrix(y) if isinstance(y, list) else None
                if X is not None and Y is not None:
                    x_data = np.array(np.ravel(X), dtype=float)
                    y_data = np.array(np.ravel(Y), dtype=float)
                else:
                    error = True
            else:
                error = True

            # 根据模型类型进行拟合
            if not error:
                if n == 1:
                    # 三参数模型拟合
                    initial_guess = [1, 1, 1]
                    params, _ = curve_fit(logistic_function1, x_data, y_data,
                                          p0=initial_guess, maxfev=maxfev)
                    a, b, c = params
                    expression = f"{a:.4f} / (1 + exp(-{b:.4f} * (x - {c:.4f})))"
                elif n == 4:
                    # 四参数模型拟合
                    initial_guess = [0, 1, 1, 1]
                    params, _ = curve_fit(logistic_function2, x_data, y_data,
                                          p0=initial_guess, maxfev=maxfev)
                    d, a, c, b = params
                    expression = f"{d:.4f} + ({a:.4f} - {d:.4f}) / (1 + (x / {c:.4f})^{b:.4f})"
                else:
                    error = True

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

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


    # 示例1: 三参数模型拟合
    input_str1 = "([[1,0],[1,0]],[7,8,14,18],1)"
    result1 = logistic_fit_nonlinear(input_str1)
    print("三参数模型拟合结果:", result1)
    # 11.75*exp(19.2551*x)/(exp(19.2551*x) + 1.08537673309963e-139)

    # 示例2: 四参数模型拟合
    input_str2 = "([[1,0],[1,0]],[7,8,14,18],4)"
    result2 = logistic_fit_nonlinear(input_str2)
    print("四参数模型拟合结果:", result2)
    # 1.0*(8.0*x**1.0 + 13.0)/(x**1.0 + 1)
    
    
    存在已知协方差情况下的最小二乘解

    x = lscov(A,b) 返回最小化误差平方和r'*r的最小二乘解.

    x = lscov(A,b,w) 返回最小化r'*diag(w)*r 的加权最小二乘解,其中 r=b-A*x.

    [x,stdx] = lscov(___) 还返回 x 的估计标准误差。标准误差是 x 的标准差的估计值。您可以使用上述语法中的任何输入参量组合。

    [x,stdx,mse] = lscov(___) 还返回均方误差。均方误差与函数最小化的值成正比。

    A, b — 操作数,向量,矩阵.

    w — 相对权重,非负实数列向量.

    x — 解, 向量 | 矩阵

    stdx — 估计的标准误差, 向量

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


    def least_squares_covariance(input_str):
        """
        对标MATLAB的lscov函数,计算存在协方差情况下的最小二乘解。

        参数:
        input_str: 输入的表达式字符串,格式为(A, b)或(A, b, V),其中:
                   - A 是设计矩阵
                   - b 是观测向量
                   - V 是协方差矩阵(二维方阵)或方差向量(一维)

        返回:
         最小二乘解,或错误信息字符串。
        """
        try:
            expr = sp.sympify(input_str)
            x, stdx, mse = None, None, None

            if isinstance(expr, tuple):
                # 普通最小二乘 (A, b)
                if len(expr) == 2:
                    A_sym = sp.Matrix(expr[0]) if isinstance(expr[0], list) else None
                    b_sym = sp.Matrix(expr[1]) if isinstance(expr[1], list) else None
                    if A_sym is not None and b_sym is not None:
                        A = np.array(A_sym.tolist(), dtype=float)
                        b = np.array(b_sym.tolist(), dtype=float).flatten()
                        x, residuals, _, _ = np.linalg.lstsq(A, b, rcond=None)
                        mse = np.sum(residuals) / (A.shape[0] - A.shape[1])
                        cov_matrix = mse * np.linalg.inv(A.T @ A)
                        stdx = np.sqrt(np.diag(cov_matrix))

                # 加权最小二乘 (A, b, V)
                elif len(expr) == 3:
                    A_sym = sp.Matrix(expr[0]) if isinstance(expr[0], list) else None
                    b_sym = sp.Matrix(expr[1]) if isinstance(expr[1], list) else None
                    V_sym = sp.Matrix(expr[2]) if isinstance(expr[2], list) else None
                    if all([m is not None for m in [A_sym, b_sym, V_sym]]):
                        A = np.array(A_sym.tolist(), dtype=float)
                        b = np.array(b_sym.tolist(), dtype=float).flatten()
                        V = np.array(V_sym.tolist(), dtype=float)

                        # 处理协方差矩阵
                        if V.ndim == 2:
                            try:
                                L = np.linalg.cholesky(V)
                            except np.linalg.LinAlgError:
                                return "错误: 协方差矩阵不正定"
                            A_prime = np.linalg.solve(L, A)
                            b_prime = np.linalg.solve(L, b)
                        else:
                            v = V.flatten()
                            if np.any(v <= 0):
                                return "错误: 方差必须为正数"
                            W_sqrt = np.diag(1.0 / np.sqrt(v))
                            A_prime = W_sqrt @ A
                            b_prime = W_sqrt @ b

                        # 求解加权最小二乘
                        x, residuals, _, _ = np.linalg.lstsq(A_prime, b_prime, rcond=None)
                        mse = np.sum(residuals) / (A_prime.shape[0] - A_prime.shape[1])
                        cov_matrix = np.linalg.inv(A_prime.T @ A_prime)
                        stdx = np.sqrt(np.diag(cov_matrix))

                else:
                    return "输入参数数量错误"
            else:
                return "输入格式错误"

            return x, stdx, mse
        except Exception as e:
            return f"错误: {e}"


    # 示范代码
    if __name__ == "__main__":
        # 示例1: 普通最小二乘
        A = [[1, 2], [3, 4], [5, 6]]
        b = [1, 2, 3]
        print("示例1 解:", least_squares_covariance(str((A, b))))
        # (array([-5.97106181e-17,  5.00000000e-01]), array([8.47946841e-17, 6.70360838e-17]), 3.0814879110195774e-33)

        # 示例2: 方差向量加权
        V = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]  # 对角线方差
        print("示例2 解:", least_squares_covariance(str((A, b, V))))
        # (array([-5.97106181e-17,  5.00000000e-01]), array([1.52752523, 1.20761473]), 3.0814879110195774e-33)

        A = [[1, 0.2, 0.1], [1, 0.5, 0.3], [1, 0.6, 0.4], [1, 0.8, 0.9], [1, 1, 1.1], [1, 1.1, 1.4]]
        b = [0.17, 0.26, 0.28, 0.23, 0.27, 0.24]
        print("示例3 解:", least_squares_covariance(str((A, b))))
        # (array([ 0.10184569,  0.48439898, -0.28465473]), array([0.00584332, 0.02060813, 0.01352573]), 1.277351520318261e-05)
    
    
    斜坡响应图

    lsimplot(sys) 它描绘了一个动态系统(由传递函数、状态空间模型等描述)在特定输入信号——单位斜坡输入 r(t) = t * u(t) (其中 u(t) 是单位阶跃函数)——作用下的输出响应随时间变化的曲线。

        汽车巡航控制系统(加速阶段)

        描述车辆在加速指令下,实际车速与期望车速的动态关系。

        lsimplot(2,s^2+3s+2)

        温度控制系统(缓慢升温)

        描述烤箱在缓慢升温指令下,实际温度与期望温度的动态关系。

        lsimplot(s+1,s^2+2s+5)

        卫星姿态控制系统(缓慢转动)

        描述卫星在缓慢转动指令下,实际角度与期望角度的动态关系。

        lsimplot(4,s^2+2s+4)

        电机位置控制系统(匀速运动)

        描述电机在匀速位置指令下,实际位置与期望位置的动态关系。

        lsimplot(3,s^2+4s+3)

        伺服位置控制系统(机械臂)

        斜坡输入: 目标位置匀速移动(如机械臂以 10 cm/s 的速度直线运动)。

        响应特征: 输出滞后于输入形成稳态误差(如持续落后 0.5 cm),反映系统增益不足或摩擦影响。

        实际意义:量化定位精度,指导是否需增加积分控制或提高电机扭矩。

        lsimplot([0.8], [1, 0.2, 0.05])

        温度爬升控制(工业熔炉)

        斜坡输入: 设定温度以 5°C/min 匀速上升(如从 100°C 到 500°C)。

        响应特征:初始阶段温度滞后,后期可能因热惯性超调(如实际温度超过设定值 20°C)。

        实际意义: 评估热系统响应延迟,优化加热功率分配策略。

        lsimplot([1.2, 0.1], [1, -0.7, 0.15])

        无人机高度跟踪(定速爬升)

        斜坡输入: 目标高度以 2 m/s 速度爬升(如起飞阶段)。

        响应特征: 受风扰影响,高度波动围绕斜坡上下振荡(振幅 ±0.3 m)。

        实际意义: 分析抗干扰能力,决定是否需增强气压计反馈或调整控制增益。

        lsimplot([0.5], [1, -0.3, 0.1, 0.02])

        数控机床进给系统 

        斜坡输入: 工作台以恒定速度 20 mm/s 移动(切削加工)。

        响应特征: 稳态时存在固定滞后(如 0.2 mm),但无振荡。

        实际意义: 揭示导轨摩擦导致的跟踪误差,需校准补偿或润滑维护。

        lsimplot([1.0, 0.4], [1, -0.5])

        经济匀速增长模型 

        斜坡输入: 预期经济以 3%/年 匀速增长。

        响应特征: 初期增长滞后(政策时滞),后期可能因投资过热超过预期。

        实际意义: 量化经济刺激政策的生效时间和过冲风险。

        lsimplot([0.7], [1, -0.6, 0.08])

    叠加斜坡响应图

    lsimplot([sys1],[sys2]...[sysN])是在同一坐标系中绘制多个系统对同一斜坡输入的响应曲线,或同一系统对不同斜坡输入的响应曲线。

        一阶系统对比

        比较正向和反向温度控制系统的升温响应

        lsimplot([1,s+2],[-1,s+2])

        欠阻尼二阶系统

        比较不同控制方向的卫星姿态调整

        lsimplot([s+1,s^2+s+1],[-s-1,s^2+s+1])

        参数变化对比

        刚度增强后的机械系统正反向运动

        lsimplot([s+1,s^2+s+1.5],[-s-1,s^2+s+1.5])

    
    线性方程的最小范数最小二乘解

    X = lsqminnorm(A,B) 返回可以求解线性方程 AX = B 并使 norm(A*X-B) 的值最小化的数组 X.

    如果此问题有多个解,则 lsqminnorm 返回能使 norm(X) 最小化的解. 如果 B 有多列,则前面的语句分别适用于X和B的每列.

    A — 系数矩阵,矩阵.

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


    def linalg_min_norm(input_str):
        """
        对标MATLAB的lsqminnorm函数,求解线性方程的最小范数最小二乘解

        参数:
        input_str: 输入字符串,格式为 (A, B) 的元组表达式
                   - A: 系数矩阵 (m×n)
                   - B: 右侧矩阵/向量 (m×k)

        返回:
        当输入有效时返回:
            numpy数组: 最小范数解 (n×k)
        否则返回错误信息字符串

        示例:
        >>> linalg_min_norm("([[1,2],[3,4],[5,6]], [7,8,9])")
        array([-3.5 ,  3.75])
        """
        try:
            expr = sp.sympify(input_str)

            # 输入格式验证
            if not isinstance(expr, tuple) or len(expr) != 2:
                return f"输入错误: 需要 (A, B) 格式的元组,实际输入: {input_str}"

            # 矩阵转换
            A_sym = sp.Matrix(expr[0]) if isinstance(expr[0], list) else None
            B_sym = sp.Matrix(expr[1]) if isinstance(expr[1], list) else None

            # 有效性检查
            if A_sym is None or B_sym is None:
                return f"输入错误: 矩阵转换失败 - A: {expr[0]}, B: {expr[1]}"

            # 转换为numpy数组
            A = np.array(A_sym.tolist(), dtype=float)
            B = np.array(B_sym.tolist(), dtype=float)

            # 维度校验
            if A.ndim != 2:
                return f"维度错误: A 必须是二维矩阵,实际维度: {A.ndim}"
            if B.ndim not in (1, 2):
                return f"维度错误: B 必须是一维向量或二维矩阵,实际维度: {B.ndim}"
            if A.shape[0] != B.shape[0]:
                return f"维度不匹配: A的行数({A.shape[0]}) != B的行数({B.shape[0]})"

            # 计算伪逆(Moore-Penrose pseudoinverse)
            A_pinv = np.linalg.pinv(A)

            # 矩阵乘法求解
            if B.ndim == 1:
                X = A_pinv @ B  # 向量情况 (n,)
            else:
                X = A_pinv @ B  # 矩阵情况 (n, k)

            return X

        except sp.SympifyError as e:
            return f"表达式解析错误: {str(e)}"
        except np.linalg.LinAlgError as e:
            return f"线性代数计算错误: {str(e)}"
        except Exception as e:
            return f"未知错误: {str(e)}"


    # 示例代码
    if __name__ == "__main__":
        # 示例1: 欠定系统 (无穷多解,求最小范数解)
        print("示例1: 欠定系统")
        case1 = linalg_min_norm("([[1, 1], [1, 1]], [2, 2])")
        print("解:", case1)
        # [[1.]
        #  [1.]]

        # 示例2: 超定系统 (最小二乘解)
        print("\n示例2: 超定系统")
        case2 = linalg_min_norm("([[1,2], [3,4], [5,6]], [7,8,9])")
        print("解:", case2)
        # [[-6. ]
        #  [ 6.5]]

        # 示例3: 多右侧项
        print("\n示例3: 多右侧项")
        case3 = linalg_min_norm("([[1,2], [3,4]], [[5,6], [7,8]])")
        print("解:\n", case3)
        # [[-3. -4.]
        #  [ 4.  5.]]
    
    
    非负最小二乘问题

    x = lsqonneg(C,d)返回在x≥0的情况下最小化范数(C*x-d)的向量x.参数C和d必须是实数的.

    C — 实数矩阵.

    d — 实数,向量.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import numpy as np
    import sympy as sp
    from scipy.optimize import nnls


    def least_squares_nonnegative_linear(input_str):
        """
        对标MATLAB的lsqnonneg函数,求解非负线性最小二乘问题

        参数:
        input_str: 输入字符串,格式为 (C, D) 的元组表达式
                   - C: 系数矩阵 (m×n)
                   - D: 右侧向量 (m×1)

        返回:
        成功时返回字典:
        {
            "x": 非负解向量 (n×1),
            "residual": 残差范数,
            "message": 状态描述
        }
        失败时返回错误信息字符串

        示例:
        >>> least_squares_nonnegative_linear("([[1,2],[3,4]], [5,6])")
        {'x': [0.0, 1.3], 'residual': 0.8944271909999159, 'message': '成功收敛'}
        """
        try:
            # 解析输入表达式
            expr = sp.sympify(input_str)

            # 输入格式验证
            if not isinstance(expr, tuple) or len(expr) != 2:
                return "输入错误: 需要 (C, D) 格式的元组"

            # 矩阵转换
            C_sym = sp.Matrix(expr[0]) if isinstance(expr[0], list) else None
            D_sym = sp.Matrix(expr[1]) if isinstance(expr[1], list) else None
            # 有效性检查
            if C_sym is None or D_sym is None:
                return "输入错误: 矩阵转换失败"
            if C_sym.shape[0] != D_sym.shape[0]:
                return f"维度不匹配: C的行数({C_sym.shape[0]}) != D的长度({D_sym.shape[0]})"

            # 转换为numpy数组
            C = np.array(C_sym.tolist(), dtype=float)
            D = np.array(D_sym.tolist(), dtype=float).flatten()  # 确保转换为1D数组

            # 维度校验
            if C.ndim != 2:
                return "系数矩阵C必须是二维矩阵"
            if len(D.shape) != 1:
                return "右侧向量D必须是一维数组"

            # 执行非负最小二乘计算
            x, residual = nnls(C, D)
            return x.tolist()
            '''
            return {
                "x": x.tolist(),
                "residual": float(residual),
                "message": "成功收敛" if residual < 1e-10 else "达到迭代限制"
            }
            '''
        except sp.SympifyError as e:
            return f"表达式解析错误: {str(e)}"
        except ValueError as e:
            return f"数值错误: {str(e)}"
        except Exception as e:
            return f"未知错误: {str(e)}"


    # 示例代码
    if __name__ == "__main__":
        # 示例1: 标准非负解
        print("示例1: 简单情况")
        case1 = least_squares_nonnegative_linear("[[1,0],[1,0],[0,1]],[2,1,1]")
        print("残差:", case1)
        # [1.4999999999999996, 1.0]

        # 示例2: 需要强制归零的解
        print("\n示例2: 边界解")
        case2 = least_squares_nonnegative_linear("([[2,1],[1,2]], [3,3])")
        print("解:", case2)
        # [0.9999999999999998, 1.0]
    
    
    LU矩阵分解

    [L,U,P] = lu(A, outputForm) 将满矩阵或稀疏矩阵A分解为一个上三角矩阵U和一个经过置换的下三角矩阵L,使得A=L*U, 及置换矩阵P,并满足A=P'*L*U.

    A — 输入矩阵,矩阵.

    outputForm — 置换输出的形状, 'matrix' (默认) | 'vector'

    L — 下三角因子,矩阵.

    U — 上三角因子,矩阵

    P — 行置换,向量,矩阵
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import numpy as np
    import sympy as sp
    from scipy.linalg import lu


    def lu_decomposition_matrix(input_str, output_form='matrix'):
        """
        对标MATLAB的lu函数,执行LU分解

        参数:
        input_str: 输入矩阵的字符串表达式
        output_form: 输出形式,可选:
            'matrix' - 返回 (L, U, P) 三个矩阵(默认)
            'compact' - 返回组合的紧凑格式
            'vector' - 返回行交换索引向量

        返回:
        成功时返回字典包含:
            - L: 下三角矩阵
            - U: 上三角矩阵
            - P: 置换矩阵/向量
        失败时返回错误信息字符串

        示例:
        >>> lu_decomposition_matrix("[[4,3],[6,3]]")
        {'L': [[1.0, 0.0], [0.6666666666666666, 1.0]],
         'U': [[6.0, 3.0], [0.0, 1.0]],
         'P': [[0,1],[1,0]]}
        """
        try:
            # 解析输入表达式
            expr = sp.sympify(input_str)
            A = sp.Matrix(expr) if isinstance(expr, list) else None

            if A is None:
                return "错误:输入不是有效矩阵"

            # 符号矩阵处理
            if A.is_symbolic() or any(element.has(sp.I) for element in A):
                # SymPy符号分解
                if not A.is_square:
                    return "错误:符号矩阵必须是方阵"

                L, U, swaps = A.LUdecomposition()
                P = sp.eye(A.rows).permute_rows(swaps)

                return {
                    "L": L.tolist(),
                    "U": U.tolist(),
                    "P": P.tolist(),
                    "swaps": swaps
                }

            # 数值矩阵处理
            else:
                A_np = np.array(A.tolist(), dtype=float)

                # 执行SciPy分解
                P_np, L_np, U_np = lu(A_np)

                # 处理输出形式
                if output_form == 'vector':
                    # 将置换矩阵转换为索引向量
                    perm = np.argmax(P_np, axis=1)
                    return {
                        "L": L_np.tolist(),
                        "U": U_np.tolist(),
                        "perm": perm.tolist()
                    }
                elif output_form == 'compact':
                    # 组合紧凑格式
                    LU = P_np @ A_np
                    return {
                        "LU": LU.tolist(),
                        "pivots": np.arange(A_np.shape[0]).tolist()
                    }
                else:
                    return {
                        "L": L_np.tolist(),
                        "U": U_np.tolist(),
                        "P": P_np.tolist()
                    }

        except sp.SympifyError as e:
            return f"表达式解析错误: {str(e)}"
        except ValueError as e:
            return f"数值错误: {str(e)}"
        except np.linalg.LinAlgError as e:
            return f"线性代数错误: {str(e)}"
        except Exception as e:
            return f"未知错误: {str(e)}"


    # 示例代码
    if __name__ == "__main__":
        # 示例1:基础数值分解
        print("示例1:2x2数值矩阵")
        case1 = lu_decomposition_matrix("[[4,3],[6,3]]")
        print("L:\n", case1["L"])
        # [[1.0, 0.0],
        #  [0.6666666666666666, 1.0]]
        print("U:\n", case1["U"])
        # [[6.0, 3.0],
        #  [0.0, 1.0]]
        print("P:\n", case1["P"])
        # [[0.0, 1.0],
        #  [1.0, 0.0]]

        # 示例2:符号矩阵分解
        print("\n示例2:3x3符号矩阵")
        case2 = lu_decomposition_matrix("[[a,2,3],[4,b,6],[7,8,c]]")
        print("符号L:\n", case2["L"])
        # [[1, 0, 0],
        # [a/4, 1, 0],
        # [7/4, (8 - 7*b/4)/(-a*b/4 + 2), 1]]
        print("符号U:\n", case2["U"])
        # [[4, b, 6],
        #  [0, -a*b/4 + 2, 3 - 3*a/2],
        #  [0, 0, c - (3 - 3*a/2)*(8 - 7*b/4)/(-a*b/4 + 2) - 21/2]]

        # 示例3:输出置换向量
        print("\n示例3:置换向量输出")
        case3 = lu_decomposition_matrix("[[1,2],[3,4]]", output_form='vector')
        print("置换索引:", case3["perm"])
        # [1, 0]
    
    
    广义卢卡斯函数

    Lucas(n, [z]) 返回卢卡斯数或卢卡斯多项式

    A — 整数,阶数.

    z - 标量, 符号标量, 返回卢卡斯多项式
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp


    def lucas_number(input_str):
        """
        对标Wolfram Lucas数的实现,计算第n个卢卡斯数
        https://mathworld.wolfram.com/LucasNumber.html

        参数:
        input_str: 输入的字符串表达式,可以是:
                   - 整数(如'5')
                   - 整数矩阵(如'[[0, 1], [2, 3]]')
                   - 符号表达式(需包含整数约束)

        返回:
        计算结果,类型与输入对应:
        - 整数输入:返回整数结果
        - 矩阵输入:返回同型矩阵,逐元素计算结果
        - 符号表达式:返回符号表达式
        - 错误输入:返回错误描述字符串

        示例:
        >>> lucas_number('0')
        2
        >>> lucas_number('[[1, 2], [3, 4]]')
        Matrix([[1, 3], [4, 7]])
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            def eval_lucas(n):
                """卢卡斯数核心计算公式,支持符号运算"""
                if not n.is_integer:
                    return None
                # 使用闭式公式计算,与Wolfram实现一致
                sqrt5 = sp.sqrt(5)
                return sp.simplify(((1 + sqrt5) / 2) ** n + ((1 - sqrt5) / 2) ** n)

            def lucas_polynomial(n_val, x_val):
                """
                计算第n阶Lucas多项式 L_n(x)

                参数:
                n (int): 多项式阶数
                x (symbol/float): 变量或具体数值

                返回:
                Expr: 符号表达式或数值结果

                示例:
                >>> lucas_polynomial(3, sp.Symbol('x'))
                x**3 + 3*x
                >>> lucas_polynomial(2, 1)
                3  # 1^2 + 2 = 3 (对应Lucas数 L_2=3)
                """
                if n_val.is_integer:
                    sqrt_term = sp.sqrt(x_val ** 2 + 4)
                    # 构建表达式
                    result_expr = 2 ** (-n_val) * ((x_val - sqrt_term) ** n_val + (x_val + sqrt_term) ** n_val)
                    return sp.simplify(result_expr)
                else:
                    return None

            if isinstance(expr, tuple):
                n = expr[0]  # base b
                x = expr[1]

                result = lucas_polynomial(n, x)
            # 处理标量输入
            elif expr.is_integer:
                result = eval_lucas(expr)

            # 处理符号表达式(需包含整数约束)
            elif expr.free_symbols:
                # 添加整数约束条件
                n = list(expr.free_symbols)[0]
                if sp.ask(sp.Q.integer(n)):
                    error = True
                else:
                    result = eval_lucas(expr)
            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 标量输入:")
        print(lucas_number('6'))
        # 18

        print(lucas_number('1'))
        # 1

        print(lucas_number('5'))
        # 11