首页 函数目录

    将笛卡尔坐标转换为极坐标

    [theta,rho] = cart2pol(x,y) 可将二维笛卡尔坐标数组x和y的对应元素变换为极坐标theta和rho

    x, y, z — 笛卡尔坐标,标量,向量,矩阵

    theta — 角坐标,数组

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


    def cartesian_to_polar(input_str):
        """
        将笛卡尔坐标转换为极坐标(支持数值、符号和矩阵输入)

        参数:
        input_str: 输入表达式字符串,可以是元组、矩阵或数值形式

        返回:
        根据输入类型返回:
        - 两个数值/符号:返回(theta, rho)
        - 两个矩阵:返回(theta矩阵, rho矩阵)
        - 三个元素输入:返回(theta, rho, 第三参数)
        - 错误时返回错误信息字符串
        """
        try:
            # 预处理输入字符串并转换为SymPy表达式
            expr = sp.sympify(input_str)
            error = False
            T, R = None, None

            def cartesian_polar_sym(x, y):
                """核心转换函数,使用SymPy函数支持符号计算"""
                rho = sp.sqrt(x ** 2 + y ** 2).evalf()
                theta = sp.atan2(y, x).evalf()
                return theta, rho

            # 定义函数(示例:笛卡尔转极坐标)
            def cartesian_polar_sci(x, y):
                rho = np.sqrt(x ** 2 + y ** 2)
                theta = np.arctan2(y, x)
                return theta, rho

            # 处理元组输入(主要处理逻辑)
            if isinstance(expr, tuple) and len(expr) in (2, 3):

                if all(e.is_number for e in expr[:2]):
                    params = tuple(float(e.evalf()) for e in expr[:2])
                    T, R = cartesian_polar_sci(*params)
                elif any(e.free_symbols for e in expr[:2]):
                    T, R = cartesian_polar_sym(*expr[:2])
                else:
                    error = True

                # 检查是否处理成功
                error = error or (T is None or R is None)

            else:  # 非元组输入视为错误
                error = True

            # 处理结果返回
            if error:
                return f"输入错误: {input_str}"

            # 处理可能存在的第三个参数
            if len(expr) == 3:
                third_param = expr[2]
                if isinstance(third_param, list):
                    third_matrix = sp.Matrix(third_param)
                    return T, R, third_matrix
                else:
                    return T, R, third_param
            else:
                return T, R

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


    def main():
        """主函数,包含多个测试案例"""
        # 测试案例1:数值输入
        print("=== 示例1:数值输入 ===")
        input_str = "(3, 4)"
        theta, rho = cartesian_to_polar(input_str)
        print(f"输入: {input_str}")
        print(f"Theta: {theta}, Rho: {rho}\n")
        # 结果: Theta: 0.9272952180016122, Rho: 5.0

        # 测试案例2:符号输入
        print("=== 示例2:符号输入 ===")
        x, y = sp.symbols('x y')
        input_str = "(x, y)"
        theta, rho = cartesian_to_polar(input_str)
        print(f"输入: {input_str}")
        print("Theta:", theta)
        print("Rho:", rho, "\n")
        # 结果:
        # Theta: atan2(y, x)
        # Rho: (x**2 + y**2)**0.5

    if __name__ == "__main__":
        main()
    
    
    将笛卡尔坐标转换为球面坐标

    [azimuth,elevation,r] = cart2sph(x,y,z) 将笛卡尔坐标数组x,y和z的对应元素转换为球面坐标azimuth,elevation和r

    x, y, z — 笛卡尔坐标,标量,向量,矩阵

    azimuth — 方位角,数组

    elevation — 仰角,数组

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


    def cartesian_to_spherical(input_str):
        try:
            expr = sp.sympify(input_str)
            error = False
            az, el, r = None, None, None

            def cartesian_spherical_sci(x, y, z):
                azimuth = np.arctan2(y, x)  # 方位角
                r = np.sqrt(x ** 2 + y ** 2 + z ** 2)  # 距离
                elevation = np.arcsin(z / r)  # 仰角
                return azimuth, elevation, r

            def cartesian_spherical_sym(x, y, z):
                """
               将笛卡尔坐标(x, y, z)转换为球坐标系(方位角, 仰角, 距离)

               参数:
               x, y, z: SymPy表达式/符号/数值

               返回:
               (azimuth, elevation, r) 元组,包含:
               - 方位角 (azimuth): 弧度,xy平面内与x轴的夹角 [−π, π]
               - 仰角 (elevation): 弧度,与xy平面的夹角 [−π/2, π/2]
               - 距离 (r): 到原点的欧氏距离
                """
                """核心转换函数(全符号计算)"""
                r = sp.sqrt(x ** 2 + y ** 2 + z ** 2)
                azimuth = sp.atan2(y, x)
                elevation = sp.asin(z / r) if r != 0 else sp.S.NaN
                return azimuth.evalf(), elevation.evalf(), r.evalf()

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

                if all(e.is_number for e in expr):
                    params = tuple(float(e.evalf()) for e in expr)
                    z, el, r = cartesian_spherical_sci(*params)
                elif any(e.free_symbols for e in expr):
                    z, el, r = cartesian_spherical_sym(*expr)
                else:
                    error = True
            else:
                error = True

            if error:
                return f"输入错误:{input_str}"
            else:
                return z, el, r


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


    def main():
        """测试案例"""
        print("=== 数值测试 ===")
        # 测试案例1:标量输入
        print(cartesian_to_spherical("(3, 4, 0)"))
        # 结果: (0.9272952180016122, 0.0, 5.0)

        print("\n=== 符号测试 ===")
        # 测试案例3:符号输入
        s = "(x, y, z)"
        az_sym, el_sym, r_sym = cartesian_to_spherical(s)
        print("符号表达式:")
        print(az_sym)
        print(el_sym)
        print(r_sym)
        # 结果:
        # az_sym: atan2(y, x)
        # el_sym: asin(z/sqrt(x**2 + y**2 + z**2))
        # r_sym: (x**2 + y**2 + z**2)**0.5


    if __name__ == "__main__":
        main()
    
    
    卡塔兰数

    z = catalan(n) 返回第n个卡塔兰数

    卡塔兰数是组合数学中一种常出现于各种计数问题中的数列.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp


    def catalan_number_calculate(input_str):
        """
        计算卡塔兰数(Catalan Number)的函数。

        参数:
        input_str (str): 输入的字符串,表示要计算的卡塔兰数的索引。

        返回:
        result (int or str): 如果输入有效,返回卡塔兰数的计算结果;如果输入无效,返回错误消息。
        """
        try:
            # 将输入字符串转换为符号表达式
            x = sp.sympify(input_str)

            # 检查输入是否为元组(即是否包含多个表达式)
            if isinstance(x, tuple):
                return f"错误输入: {input_str} 不是一个有效的数字或表达式。"

            # 检查输入是否为非负整数
            if not x.is_integer or x < 0:
                return f"错误输入: {input_str} 必须是一个非负整数。"

            # 计算卡塔兰数
            result = sp.factorial(2 * x) / (sp.factorial(x + 1) * sp.factorial(x))

            # 返回整数结果
            return int(result)

        except Exception as e:
            # 转换失败,返回错误消息
            return f"错误输入: {e}"


    def main():
        """
        主函数,用于演示 catalan_number_calculate 函数的使用。
        """
        # 示例输入
        inputs = ["0", "1", "5", "10"]

        # 遍历输入并计算卡塔兰数
        for input_str in inputs:
            result = catalan_number_calculate(input_str)
            print(f"输入: {input_str} -> 输出: {result}")
        '''
        输入: 0 -> 输出: 1
        输入: 1 -> 输出: 1
        输入: 5 -> 输出: 42
        输入: 10 -> 输出: 16796
        '''

    # 调用主函数
    if __name__ == "__main__":
        main()
    
    
    柯西矩阵

    A = cauchy(x,y) 返回一个 n×n 矩阵, 其中包含的项满足 A(i,j) = 1/(x(i)+y(j)). 参量 x 和 y 是长度为 n 的向量. 如果您为 x 和 y 传入标量, 它们将解释为向量 1:x 和 1:y

    A = cauchy(x) 返回与上述 y = x 的情况相同的结果. 换言之,A(i,j) = 1/(x(i)+x(j))

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


    def cauchy_matrix(input_str):
        """
        生成柯西矩阵(Cauchy Matrix)的函数。

        柯西矩阵的定义:C[i, j] = 1 / (x[i] - y[j]),其中 x 和 y 是两个向量。

        参数:
        input_str (str): 输入的字符串,表示两个向量 x 和 y 或单个向量(x = y)。

        返回:
        result (sp.Matrix or str): 如果输入有效,返回柯西矩阵;如果输入无效,返回错误消息。
        """
        try:
            # 将输入字符串转换为符号表达式
            expr = sp.sympify(input_str)
            error = False
            result = None

            def evaluation_cauchy_matrix(x, y):
                """
                生成柯西矩阵的内部函数。

                参数:
                x (np.array): 向量 x
                y (np.array): 向量 y

                返回:
                C (np.array): 柯西矩阵
                """
                n = len(x)
                m = len(y)
                C = np.zeros((n, m), dtype=float)
                for i in range(n):
                    for j in range(m):
                        C[i, j] = 1.0 / (x[i] - y[j])
                return C

            # 检查输入是否为元组,且元组的两个元素都是列表
            if isinstance(expr, tuple) and isinstance(expr[0], list) and isinstance(expr[1], list):
                x = np.array(expr[0], dtype=float)
                y = np.array(expr[1], dtype=float)
                result = evaluation_cauchy_matrix(x, y)
                result = sp.Matrix(result)
            # 检查输入是否为单个列表
            elif isinstance(expr, list):
                x = y = np.array(expr, dtype=float)
                result = evaluation_cauchy_matrix(x, y)
                result = sp.Matrix(result)
            else:
                error = True

            # 如果输入无效,返回错误消息
            if error:
                return f"输入错误: {input_str}"
            else:
                return result

        except Exception as e:
            # 捕获异常并返回错误消息
            return f"错误: {e}"


    def main():
        """
        主函数,用于演示 cauchy_matrix 函数的使用。
        """
        # 示例输入
        inputs = [
            "([1, 2, 3], [4, 5, 6])",
            # 输出: Matrix([[-0.333333333333333, -0.250000000000000, -0.200000000000000],
            #              [-0.500000000000000, -0.333333333333333, -0.250000000000000],
            #              [-1.00000000000000, -0.500000000000000, -0.333333333333333]])

            "[1, 2, 3]",
            # 输出: Matrix([[oo, -1.00000000000000, -0.500000000000000],
            #              [1.00000000000000, oo, -1.00000000000000],
            #              [0.500000000000000, 1.00000000000000, oo]])

            "([1, 2], [3, 4, 5])",  # 向量长度不匹配
            # 输出: Matrix([[-0.500000000000000, -0.333333333333333, -0.250000000000000],
            #              [-1.00000000000000, -0.500000000000000, -0.333333333333333]])
        ]

        # 遍历输入并生成柯西矩阵
        for input_str in inputs:
            result = cauchy_matrix(input_str)
            print(f"输入: {input_str}")
            print(f"输出: {result}")
            print("-" * 40)


    # 调用主函数
    if __name__ == "__main__":
        main()
    
    
    定期存单的应计利息

    AccrInt = cdai(CouponRate,Settle,Maturity,IssueDate) 计算定期存单的应计利息.

    CouponRate —— 息票率, 用于确定债券应付息票的年百分比率, 小数

    Settle —— 债券结算日期, 日期时间数组|字符串数组|日期字符向量

    Maturity——债券到期日, 日期时间数组|字符串数组|日期字符向量

    IssueDate —— 存单签发日期

    Basis —— 日计数基准, 2(默认)|数值:0、1、2、3、4、6、7、8、9、10、11、12、13
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    from datetime import datetime, timedelta


    def accrued_interest_certificate_deposit(Settle, Maturity, IssueDate, CouponRate=0.0,Basis=2):
        """计算定期存单的应计利息"""
        try:

            # 转换日期字符串为datetime对象
            date_format = '%Y-%m-%d'
            settle_date = datetime.strptime(Settle, date_format)
            issue_date = datetime.strptime(IssueDate, date_format)

            # 验证结算日在起息日之后
            if settle_date < issue_date:
                raise ValueError("结算日不能早于起息日")

            # 计算计息天数(实际日历天数)
            days = (settle_date - issue_date).days

            # 根据Basis值确定年基准天数
            basis = int(Basis)
            if basis == 0:  # actual/actual
                # 计算实际年天数(考虑闰年)
                year_days = 366 if (issue_date.year % 4 == 0 and issue_date.year % 100 != 0) or (
                        issue_date.year % 400 == 0) else 365
                basis_days = year_days
            elif basis == 1:  # 30/360
                basis_days = 360
                # 转换为30/360计算方式
                d1 = min(issue_date.day, 30)
                d2 = min(settle_date.day, 30) if settle_date.day != 31 or d1 == 30 else 30
                months = (settle_date.year - issue_date.year) * 12 + (settle_date.month - issue_date.month)
                days = months * 30 + (d2 - d1)
            elif basis == 2:  # actual/360
                basis_days = 360
            elif basis == 3:  # actual/365
                basis_days = 365
            else:
                raise ValueError(f"不支持的Basis值: {basis}. 必须是0, 1, 2或3")

            # 计算应计利息(基于本金=1)
            coupon_rate = float(CouponRate)
            accrued_interest = coupon_rate * days / basis_days

            # 返回百分比形式,四舍五入到4位小数
            return round(accrued_interest * 100, 4)
        except Exception as e:
            raise RuntimeError(f"计算失败: {str(e)}")


    # ======== 测试用例 ========
    if __name__ == "__main__":
        # MATLAB官方测试案例
        try:
            ai = accrued_interest_certificate_deposit(Settle='2002-01-02', Maturity='2002-03-31', IssueDate='2001-10-01', CouponRate=0.05)
            print(f"应计利息: {ai}")
            # 输出: 1.2917

        except Exception as e:
            print(e)
    
    
    将复数对角型转换为实数块对角型

    [Vnew,Dnew] = cdf2rdf(V,D) 将实矩阵 X 的 [V,D] = eig(X) 或 [V,D] = eigs(X,___) 的输出从复数对角型转换为实数对角型。

    此操作将变换 X 的特征值在 D 中的表示方式,并变换 V 以使 X*Vnew = Vnew*Dnew。

    V — 右特征向量矩阵, 矩阵, 指定为 [V,D] = eig(X) 或 [V,D] = eigs(X,___) 返回的矩阵。

    D — 对角特征值矩阵, 矩阵, 指定为 [V,D] = eig(X) 或 [V,D] = eigs(X,___) 返回的矩阵。沿 D 的对角线的一些特征值可能是实数,但假设复共轭特征值对的彼此相邻的。

    Vnew — 变换后的右特征向量矩阵, 矩阵

    Dnew — 变换后的对角特征值矩阵, 矩阵
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np
    from scipy import linalg


    def complex_diagonal_real_riagonal(input_str):
        """
        严格实现MATLAB风格的cdf2rdf函数,必须输入V和D两个矩阵

        参数:
        input_str (str): 输入的矩阵字符串,格式示例:
           "[[1,0],[0,1]], [[1+2j,0],[0,1-2j]]"  # V, D矩阵

        返回:
        tuple: (V_real, D_real)

        示例:
        >>> V_real, D_real = cdf2rdf("[[1,0],[0,1]], [[1+2j,0],[0,1-2j]]")
        """
        try:
            expr = sp.sympify(input_str)
            error = False

            # 检查表达式是否为元组且长度为 2
            if isinstance(expr, tuple) and len(expr) == 2:
                if all(isinstance(e, list) for e in expr):
                    # 将 V 矩阵转换为 numpy 数组,数据类型为复数,并展平
                    V_np = np.array(expr[0], dtype=complex).ravel()
                    # 将 D 矩阵转换为 numpy 数组,数据类型为复数
                    D_np = np.array(expr[1], dtype=complex)
                    # 调用 scipy.linalg 的 cdf2rdf 函数将复数对角矩阵转换为实数块对角矩阵
                    V_real, D_real = linalg.cdf2rdf(V_np, D_np)
                else:
                    error = True
            else:
                # 如果表达式不是元组或者长度不为 2,将错误标志设置为 True
                error = True

            # 如果没有错误发生
            if not error:
                # 将实数化后的 V 和 D 转换为 sympy 矩阵并返回
                return sp.Matrix(V_real), sp.Matrix(D_real)
            else:
                # 如果有错误发生,返回包含输入内容的错误信息
                return f"输入错误:{input_str}"

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


    # 示例代码
    if __name__ == "__main__":
        # 正确输入示例
        input_str = "[-0.37, 5.37],[[-0.8, -0.4], [0.5, -0.9]]"
        V_real, D_real = complex_diagonal_real_riagonal(input_str)

        print("转换后的实数V矩阵:")
        print(V_real)
        # Matrix([[-0.370000000000000, 0], [0, 5.37000000000000]])

        print("\n转换后的块对角D矩阵:")
        print(D_real)
        # Matrix([[-0.800000000000000, -0.400000000000000], [0.500000000000000, -0.900000000000000]])
    
    
    定期存单的价格

    [Price,AccrInt] = cdprice(Yield,CouponRate,Settle,Maturity,IssueDate)计算定期存单的价格.

    Yield —— 到期收益率

    CouponRate —— 息票率, 用于确定债券应付息票的年百分比率, 小数

    Settle —— 债券结算日期, 日期时间数组|字符串数组|日期字符向量

    Maturity——债券到期日, 日期时间数组|字符串数组|日期字符向量

    IssueDate —— 存单签发日期

    Basis —— 日计数基准, 2(默认)|数值:0、1、2、3、4、6、7、8、9、10、11、12、13
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    from datetime import datetime, timedelta


    def certificate_deposit_price(Yield, Settle, Maturity, IssueDate, CouponRate, Basis=2):
        """计算定期存单的价格和应计利息"""
        try:

            def calculate_days(start_date, end_date, basis):
                """根据日计数基准计算天数"""
                if basis == 1:  # 30/360
                    # 处理起始日
                    start_day = start_date.day
                    if start_day == 31:
                        start_day = 30
                    elif start_date.month == 2 and start_date.day == 29 and (
                            start_date.year % 4 == 0 and (start_date.year % 100 != 0 or start_date.year % 400 == 0)):
                        start_day = 30

                    # 处理结束日
                    end_day = end_date.day
                    if end_day == 31:
                        if start_day == 30:
                            end_day = 30
                        else:
                            end_day = 30
                    elif end_date.month == 2 and end_date.day == 29 and (
                            end_date.year % 4 == 0 and (end_date.year % 100 != 0 or end_date.year % 400 == 0)):
                        end_day = 30

                    # 计算月份差
                    months = (end_date.year - start_date.year) * 12 + (end_date.month - start_date.month)
                    # 计算天数
                    days = months * 30 + (end_day - start_day)
                    return days
                else:  # 实际天数
                    return (end_date - start_date).days

            def get_basis_days(basis, issue_date):
                """根据日计数基准获取年基准天数"""
                if basis == 0:  # actual/actual
                    year = issue_date.year
                    # 判断是否为闰年
                    if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
                        return 366
                    return 365
                elif basis == 1 or basis == 2:  # 30/360 or actual/360
                    return 360
                elif basis == 3:  # actual/365
                    return 365
                else:
                    raise ValueError(f"不支持的Basis值: {basis}")

            # 转换日期字符串为datetime对象
            date_format = '%Y-%m-%d'
            settle_date = datetime.strptime(Settle, date_format)
            maturity_date = datetime.strptime(Maturity, date_format)
            issue_date = datetime.strptime(IssueDate, date_format)

            # 验证日期顺序
            if settle_date < issue_date:
                raise ValueError("结算日不能早于起息日")
            if settle_date > maturity_date:
                raise ValueError("结算日不能晚于到期日")

            # 获取日计数基准
            basis = int(Basis)
            basis_days = get_basis_days(basis, issue_date)

            # 计算各个时间段的天数
            days_accrued = calculate_days(issue_date, settle_date, basis)  # 起息日到结算日
            days_to_maturity = calculate_days(settle_date, maturity_date, basis)  # 结算日到到期日
            days_total = calculate_days(issue_date, maturity_date, basis)  # 起息日到到期日

            # 计算应计利息(每1单位面值)
            coupon_rate = float(CouponRate)
            accrued_interest = coupon_rate * days_accrued / basis_days

            # 计算总利息(每1单位面值)
            total_interest = coupon_rate * days_total / basis_days

            # 计算到期价值(本金 + 总利息)
            maturity_value = 1.0 + total_interest

            # 计算贴现因子
            yield_rate = float(Yield)
            discount_factor = 1 + yield_rate * days_to_maturity / basis_days

            # 计算全价(每1单位面值)
            dirty_price = maturity_value / discount_factor

            # 计算净价(全价 - 应计利息)
            clean_price = dirty_price - accrued_interest

            # 返回每100单位面值的净价和应计利息
            return round(clean_price * 100, 4), round(accrued_interest * 100, 4)
        except Exception as e:
            raise RuntimeError(f"计算失败: {str(e)}")


    # ======== 测试用例 ========
    if __name__ == "__main__":
        try:
            price, accr_int = certificate_deposit_price(Yield=0.0525, Settle='2002-01-02', Maturity='2002-03-31', IssueDate='2001-10-01', CouponRate=0.05)
            print(f"价格: {price} , 应计利息: {accr_int} \n")
            # 结果: 价格: 99.9233 , 应计利息: 1.2917
        except Exception as e:
            print(f"测试案例1失败: {e}\n")
    
    
    定期存单的到期收益率

    Yield = cdyield(Price,CouponRate,Settle,Maturity,IssueDate)计算给定净价的定期存单的到期收益率.

    Price  —— 每100元面值的存款证净价,

    CouponRate —— 息票率, 用于确定债券应付息票的年百分比率, 小数

    Settle —— 债券结算日期, 日期时间数组|字符串数组|日期字符向量

    Maturity——债券到期日, 日期时间数组|字符串数组|日期字符向量

    IssueDate —— 存单签发日期

    Basis —— 日计数基准, 2(默认)|数值:0、1、2、3、4、6、7、8、9、10、11、12、13

    Yield —— 到期收益率
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    from datetime import datetime

    def parse_date(date_str):
        formats = [
            '%Y-%m-%d', '%d-%b-%Y', '%b-%d-%Y',
            '%Y%m%d', '%m/%d/%Y', '%d/%m/%Y'
        ]
        for fmt in formats:
            try:
                return datetime.strptime(date_str, fmt)
            except ValueError:
                continue
        raise ValueError(f"无法解析日期: {date_str}")


    def days_actual(start_date, end_date):
        return (end_date - start_date).days


    def days_360(start_date, end_date):
        y1, m1, d1 = start_date.year, start_date.month, min(start_date.day, 30)
        y2, m2, d2 = end_date.year, end_date.month, min(end_date.day, 30)

        # 处理起始日期是月末的情况
        if start_date.day == 31:
            d1 = 30
        # 处理结束日期是月末且起始日期>=30的情况
        if end_date.day == 31 and d1 >= 30:
            d2 = 30

        return 360 * (y2 - y1) + 30 * (m2 - m1) + (d2 - d1)


    def certificate_deposit_yield(Price, CouponRate, Settle, Maturity, IssueDate, Basis=2):
        try:
            settle = parse_date(Settle)
            maturity = parse_date(Maturity)
            issue = parse_date(IssueDate)
            price = Price
            coupon = float(CouponRate)
            basis = int(Basis)

            # 根据日计数基准计算天数
            if basis == 0:  # actual/actual
                DIM = days_actual(issue, maturity)
                DSM = days_actual(settle, maturity)
                divisor = 365  # 实际天数,但使用365天年基准
            elif basis == 1:  # 30/360
                DIM = days_360(issue, maturity)
                DSM = days_360(settle, maturity)
                divisor = 360
            elif basis == 2:  # actual/360
                DIM = days_actual(issue, maturity)
                DSM = days_actual(settle, maturity)
                divisor = 360
            elif basis == 3:  # actual/365
                DIM = days_actual(issue, maturity)
                DSM = days_actual(settle, maturity)
                divisor = 365
            else:
                raise ValueError(f"不支持的日计数基准: {basis}")

            if DIM <= 0:
                raise ValueError("到期日必须晚于发行日")
            if DSM <= 0:
                raise ValueError("到期日必须晚于结算日")

            # 核心计算公式
            maturity_value = 100 * (1 + coupon * (DIM / divisor))
            yield_val = ((maturity_value / price) - 1) * (divisor / DSM)

            return round(yield_val, 4)

        except Exception as e:
            raise RuntimeError(f"计算失败: {str(e)}")


    # 测试用例
    if __name__ == "__main__":
        # MATLAB官方测试案例 - 正确实现
        try:
            y = certificate_deposit_yield(Price=101.125, Settle='2002-01-02', Maturity='2002-03-31', IssueDate='2001-10-01', CouponRate=0.05)
            print(f"测试用例1计算结果: {y}")
            # 结果: 0.0562

        except Exception as e:
            print(e)

        # 另一个测试案例
        try:
            y = certificate_deposit_yield(Price=99.99, CouponRate=0.06, Settle='1997-09-15', Maturity='1997-11-13', IssueDate='1997-09-11', Basis=2)
            print(f"测试用例2计算结果: {y}")
            # 结果: 0.0647
        except Exception as e:
            print(e)
    
    
    向正无穷舍入

    Y = ceil(t) 将 t 的每个元素四舍五入到大于或等于此元素的最接近的数.

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


    def ceil_positive_infinity(input_str):
        """
        对输入进行向上取整操作,支持数值、符号表达式和矩阵。

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

        返回:
        result (sp.Expr, sp.Matrix, or str):
          - 若输入为数值或符号表达式,返回向上取整后的表达式;
          - 若输入为矩阵,返回逐元素向上取整后的矩阵;
          - 若输入无效,返回错误消息。
        """
        try:
            # 修复输入表达式(例如替换特殊符号)
            # 将字符串转换为 SymPy 表达式
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 检查输入
            if expr.free_symbols:
                # 处理含自由符号的表达式
                result = sp.ceiling(expr)
            elif expr.is_number:
                # 处理数值
                z = float(expr)
                result = np.ceil(z)
            else:
                error = True

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

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


    def main():
        """
        主函数,用于演示 ceil_positive_infinity 函数的使用。
        """
        # 示例输入
        test_cases = [
            "3.2",  # 4.0
            "-4.7",  # -4.0
            "x",  # ceiling(x)
            "x + 0.5",  # ceiling(x + 0.5)
            "oo",  # inf
        ]

        # 遍历测试用例并输出结果
        for case in test_cases:
            output = ceil_positive_infinity(case)
            print(f"输入: {case}")
            print(f"输出: {output}")
            print("-" * 40)


    if __name__ == "__main__":
        main()
    
    
    分解连分数

    s = cFrac(n).

    连分数是一种特殊的分数表示方法它可以用一系列的有理数来表示.这些有理数被称为连分数的部分,它们描述了数的分数部分.

    n是浮点数

    s是由有理数组成的连分数.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from sympy.ntheory.continued_fraction import continued_fraction


    def continue_fraction_rational(input_str):
        """
        计算有理数的连分数展开式。

        参数:
        input_str (str): 输入的字符串,表示一个有理数(如整数、分数或有限小数)。

        返回:
        result (list or str):
          - 若输入有效,返回连分数展开式的系数列表;
          - 若输入无效,返回错误消息。

        错误处理:
        - 输入为非数值(如矩阵、符号表达式)时返回输入错误。
        - 输入为无理数或无法转换为有理数的值时返回错误。
        """
        try:
            # 将输入字符串转换为 SymPy 表达式
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 检查输入是否为元组(不支持元组输入)
            if isinstance(expr, tuple):
                error = True
            # 检查输入是否为数值类型(整数、有理数、浮点数)
            elif expr.is_number:
                # 将输入转换为精确有理数(例如 3.2 → 16/5)
                rational_num = sp.Rational(expr)
                # 计算连分数展开式
                result = list(continued_fraction(rational_num))
            else:
                error = True

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

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


    def main():
        """
        主函数,用于演示 `continue_fraction_rational` 函数的使用。
        """
        # 示例输入
        test_cases = [
            "3/2",  # [1, 2]
            "5",  # [5]
            "2.5",  # [2, 2]
            "0.3333",  # [0, 3, 3332, 1, 674191559, 1, 61, 7, 6]
        ]

        # 遍历测试用例并输出结果
        for case in test_cases:
            output = continue_fraction_rational(case)
            print(f"输入: {case}")
            print(f"输出: {output}")
            print("-" * 40)


    if __name__ == "__main__":
        main()
    
    
    置换积分

    G=changeIntegrationVariable(F,old,new)通过替换对F中的积分进行积分,其中old被new替换.

    旧的必须依赖于F中积分的前一个积分变量,新的必须依赖新的积分变量.

    在F中指定积分时,您可以通过使用int函数并将“Hold”选项设置为true来返回未求值的积分形式. 然后,您可以使用changeIntegrationVariable显示通过替换进行集成的步骤.

    F —— 包含积分的表达式, 表达式向量, 表达式矩阵

    old--要替换的子表达式

    new--新的子表达式
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    from sympy import Integral, solve, diff, symbols, Function
    from sympy.core.basic import Basic
    import sympy as sp


    def change_integration_variable(F, old, new):
        """
        将积分中的变量替换应用于表达式 \( F \),用新变量替换旧变量。
        返回变换后的表达式。
        """

        def replace_integral(expr, old, new):
            if isinstance(expr, Integral):
                integrand = expr.function
                limits = list(expr.limits)
                substituted = False

                for i in range(len(limits)):
                    if substituted:
                        break

                    limit = limits[i]
                    var = limit[0]  # 积分变量(如x)
                    a = limit[1] if len(limit) > 1 else None  # 下限
                    b = limit[2] if len(limit) > 2 else None  # 上限

                    # 只处理包含旧变量的积分变量
                    if not old.has(var):
                        continue

                    # 提取新变量t(如t必须是新引入的符号)
                    t = new.free_symbols - old.free_symbols
                    if len(t) != 1:
                        raise ValueError("必须指定一个新变量")
                    t = t.pop()

                    # 步骤1:解方程 old = new 得到 var = g(t)
                    solutions = solve(old - new, var)
                    if not solutions:
                        raise ValueError(f"无法解方程 {old} = {new}")

                    # 步骤2:计算新积分限(用old的表达式在原始积分限处的值)
                    t_a_val = old.subs(var, a) if a is not None else None
                    t_b_val = old.subs(var, b) if b is not None else None

                    # 步骤3:验证解是否满足原始积分限
                    valid_solution = None
                    for sol in solutions:
                        # 检查当t等于新积分限时,解是否还原回原始积分限
                        valid_a = True
                        valid_b = True

                        if t_a_val is not None:
                            x_at_ta = sol.subs(t, t_a_val)
                            valid_a = x_at_ta.equals(a)

                        if t_b_val is not None:
                            x_at_tb = sol.subs(t, t_b_val)
                            valid_b = x_at_tb.equals(b)

                        if valid_a and valid_b:
                            valid_solution = sol
                            break

                    if not valid_solution:
                        raise ValueError("无法找到满足积分限的解")

                    # 步骤4:计算雅可比行列式并替换变量
                    dvar_dt = diff(valid_solution, t)
                    new_integrand = integrand.subs(var, valid_solution) * dvar_dt

                    # 构造新积分限
                    new_limits = [(t, t_a_val, t_b_val) if a is not None and b is not None else (t,)]
                    substituted = True

                # 替换积分并返回
                return Integral(new_integrand, *new_limits)
            elif isinstance(expr, Basic):
                return expr.func(*[replace_integral(arg) for arg in expr.args])
            else:
                return expr

        return replace_integral(F, old, new)


    x, a, b, c, t = symbols('x a b c t')
    f = Function('f')(x + c)
    F = Integral(f, (x, a, b))
    G = change_integration_variable(F, x + c, t)
    print(G)
    # Integral(f(t), (t, a + c, b + c))

    F = Integral(x ** 2, (x, 0, 1))
    G = change_integration_variable(F, x ** 2, t)
    print(G)
    # Integral(sqrt(t)/2, (t, 0, 1))

    f = Function('f')(sp.exp(sp.sqrt(sp.sin(x))))
    F = Integral(f, (x, 0, 1))
    G = change_integration_variable(F, sp.sqrt(sp.sin(x)), t)
    print(G)
    # Integral(2*t*f(exp(sqrt(t**2)))/sqrt(1 - t**4), (t, 0, sqrt(sin(1))))
    
    
    字符的ASCII数字值

    Y = char(Z) 如果Z是字符,转成相应的ASCII数字值. 如果Z是数字, 转成相应的字符.

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


    def char_to_ascii(input_str):
        """
        将字符转换为 ASCII 码或将 ASCII 码转换为字符。

        参数:
        input_str (str): 输入的字符串,可以是字符、ASCII 码或符号表达式。

        返回:
        res (int, str, or str):
          - 若输入为字符,返回其 ASCII 码;
          - 若输入为 ASCII 码,返回对应的字符;
          - 若输入为符号表达式,返回其字符串形式的 ASCII 码;
          - 若输入无效,返回错误消息。
        """
        try:
            # 将输入字符串转换为 SymPy 表达式
            expr = sp.sympify(input_str)
            error = False
            res = None

            # 检查输入是否为数值类型(ASCII 码)
            if expr.is_integer:
                # 将数值转换为字符
                res = chr(int(expr))
            # 检查输入是否为符号表达式
            elif expr.free_symbols:
                # 将符号表达式转换为字符串并取第一个字符的 ASCII 码
                res = ord(str(expr)[0])
            else:
                error = True

            if error:
                return f"输入错误: {input_str} 必须是单个字符或 ASCII 码。"
            else:
                return res

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


    def main():
        """
        主函数,用于演示 `char_to_ascii` 函数的使用。
        """
        # 示例输入
        test_cases = [
            "A",  # 65
            "65",  # A
            "x",  # 120
            "Hello",  # 72
        ]

        # 遍历测试用例并输出结果
        for case in test_cases:
            output = char_to_ascii(case)
            print(f"输入: {case}")
            print(f"输出: {output}")
            print("-" * 40)


    if __name__ == "__main__":
        main()
    
    
    切比雪夫谱微分矩阵

    A = chebspec(n,k) 返回一个大小为 n×n 的切比雪夫谱微分矩阵. 参量 k 可以取值 0(默认值)或 1,它决定输出矩阵的字符.

    对于 k = 0(无边界条件), A 是幂零矩阵, 这意味着存在满足 A^c = 0 的正整数 c, 矩阵 A 具有空向量 ones(n,1).

    对于 k = 1, A 是非奇异且条件设置良好的矩阵, 其特征值具有负实部

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


    def chebspec_matrix(input_str):
        """
        生成Chebyshev谱微分矩阵。输入应为字符串形式,如"3"(一阶3阶矩阵)或"(4,2)"(二阶4阶矩阵)。

        参数:
        input_str: 字符串形式的输入,如"3"或"(4,2)"。

        返回:
        SymPy矩阵对象或错误信息字符串。
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            def eval_chebspec_matrix(n, k=1):
                """内部函数:计算n阶k次导数的Chebyshev微分矩阵。"""
                # 生成Chebyshev节点(在区间[-1,1]上的极值点)
                x = np.cos(np.pi * np.arange(n) / (n - 1))

                # 初始化微分矩阵
                D = np.zeros((n, n))
                c = np.ones(n)
                c[0], c[-1] = 2, 2  # 首尾节点缩放因子

                # 填充非对角线元素
                for i in range(n):
                    for j in range(n):
                        if i != j:
                            D[i, j] = (c[i] / c[j]) * (-1) ** (i + j) / (x[i] - x[j])
                    # 对角线元素为行和的相反数
                    D[i, i] = -np.sum(D[i, :])

                # 计算k次导数矩阵(矩阵的k次幂)
                return np.linalg.matrix_power(D, k) if k > 1 else D

            # 解析输入参数:支持格式如 "3" 或 "(4, 2)"
            if isinstance(expr, tuple) and len(expr) == 2:
                if all(e.is_number for e in expr):
                    params = tuple(int(e.evalf()) for e in expr)
                    result = eval_chebspec_matrix(*params)
                else:
                    error = True
            elif expr.is_number:
                result = eval_chebspec_matrix(n=int(expr))
            else:
                error = True

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


    if __name__ == "__main__":
        # 示例1:生成3阶一阶微分矩阵
        print("示例1:3阶Chebyshev微分矩阵:")
        print(chebspec_matrix("3"))
        # Matrix([[1.50000000000000, -2.00000000000000, 0.500000000000000],
        #         [0.500000000000000, -1.11022302462516e-16, -0.500000000000000],
        #         [-0.500000000000000, 2.00000000000000, -1.50000000000000]])


        # 示例2:生成4阶二阶微分矩阵
        print("\n示例2:4阶二阶Chebyshev微分矩阵:")
        print(chebspec_matrix("(4,2)"))
        # Matrix([[5.33333333333334, -9.33333333333334, 6.66666666666667, -2.66666666666667],
        #         [3.33333333333333, -5.33333333333334, 2.66666666666667, -0.666666666666666],
        #         [-0.666666666666666, 2.66666666666667, -5.33333333333333, 3.33333333333333],
        #         [-2.66666666666667, 6.66666666666666, -9.33333333333333, 5.33333333333333]])
    
    
    切比雪夫多项式的类范德蒙类矩阵

    A = chebvand(x) 基于由点 x 组成的向量生成原始切比雪夫范德蒙矩阵, 这些点定义计算切比雪夫多项式的位置. 参量x是长度为 n 的向量,

    A 的大小为 n×n. A 中的项满足 A(i,j) = Ti – 1(x(j)), 其中 Ti – 1 是 i - 1 次第一类切比雪夫多项式. 如果 x 为标量,则将使用区间 [0,1] 上的 x 个等间距点计算A

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


    def chebvand_matrix(input_str):
        """
        生成Chebyshev-Vandermonde矩阵。

        参数:
        input_str: 输入的字符串,表示节点列表(例如 "[0, 1, 2]")。

        返回:
        如果输入有效,返回对应的SymPy矩阵对象;否则返回错误信息。
        """
        try:
            # 预处理输入字符串,替换常见中文符号
            input_str = input_str.strip().replace(',', ',').replace('【', '[').replace('】', ']')
            expr = sp.sympify(input_str)
            error = False
            result = None

            def evaluation_chebvand_matrix(x):
                """
                根据节点x生成Chebyshev-Vandermonde矩阵。

                参数:
                x: 节点列表(NumPy数组)。

                返回:
                Chebyshev-Vandermonde矩阵(NumPy数组)。
                """
                n = len(x)
                V = np.zeros((n, n))

                # 用Chebyshev多项式T_j(x_i)填充矩阵
                for i in range(n):
                    for j in range(n):
                        V[i, j] = np.cos(j * np.arccos(x[i]))

                return V

            if isinstance(expr, tuple):
                error = True
            elif isinstance(expr, list):
                x = np.array(expr, dtype=float)
                result = evaluation_chebvand_matrix(x=x)
                result = sp.Matrix(result)
            else:
                error = True

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

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


    if __name__ == "__main__":
        # 定义测试用例
        test_cases = [
            "[0.5, 0, -0.5]",
            # Matrix([[1.00000000000000, 0.500000000000000, -0.500000000000000],
            #        [1.00000000000000, 6.12323399573677e-17, -1.00000000000000],
            #        [1.00000000000000, -0.500000000000000, -0.500000000000000]])

            "[1, 0.5, 0]",
            # Matrix([[1.00000000000000, 1.00000000000000, 1.00000000000000],
            #         [1.00000000000000, 0.500000000000000, -0.500000000000000],
            #         [1.00000000000000, 6.12323399573677e-17, -1.00000000000000]])

            "[0, 1, 2]",
            # Matrix([[1.00000000000000, 6.12323399573677e-17, -1.00000000000000],
            #         [1.00000000000000, 1.00000000000000, 1.00000000000000],
            #         [nan, nan, nan]])
        ]

        # 遍历测试用例
        for case in test_cases:
            print(f"测试输入:{case}")
            matrix = chebvand_matrix(case)
            print("结果:")
            if isinstance(matrix, sp.Matrix):
                print(matrix)  # 使用SymPy的漂亮打印输出矩阵
            else:
                print(matrix)
            print("\n" + "=" * 50 + "\n")
    
    
    切比雪夫窗

    w = chebwin(L,at,sym=1) 返回一个长度为L个点, 衰减为at的修正的矩形窗 默认sym=1

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

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


    def chebyshev_window(input_str):
        """
        根据输入的参数生成切比雪夫窗口系数。

        参数:
            input_str (str): 格式为'(m, at)'或'(m, at, sym)'的字符串,其中
                - m (int): 窗口长度(必须为正整数)
                - at (float): 主瓣衰减系数(单位:分贝)
                - sym (int, 可选): 对称性标志(0表示非对称,1表示对称,默认为1)

        返回:
            list | str: 成功返回窗口系数列表,失败返回错误描述字符串
        """
        try:
            # 将输入字符串解析为SymPy表达式
            expr = sp.sympify(input_str)

            # 检查是否为元组格式输入
            if not isinstance(expr, tuple):
                return f"输入格式错误:需为元组格式,如'(11, 50)'"

            # 参数数量检查
            if len(expr) < 2:
                return "参数不足:至少需要窗口长度和衰减系数两个参数"

            # 解析基础参数
            m = int(expr[0])
            at = float(expr[1])

            # 处理对称性参数(默认对称)
            sym = True
            if len(expr) >= 3:
                if expr[2] == 0:  # 第三个参数为0时设为非对称
                    sym = False

            # 参数有效性检查
            if m <= 0:
                return "窗口长度必须为正整数"
            if at <= 0:
                return "衰减系数必须为正数"

            # 生成切比雪夫窗口
            window = signal.windows.chebwin(m, at, sym)
            return list(window)

        except Exception as e:
            return f"处理过程中发生错误:{str(e)}"


    if __name__ == "__main__":
        # 测试用例
        test_cases = [
            "(7, 50)",
            # 前5个系数:[0.11169109836363081, 0.419629989244334, 0.8137735925687217, 1.0, 0.8137735925687217]

            "(8, 40.5, 0)",
            # 前5个系数:[0.1261675884188586, 0.3449958474928207, 0.639797528234691, 0.897289854502741, 1.0]

            "(9, 60, 1)",
            # 前5个系数:[0.05186856359432399, 0.22712393362332237, 0.5379172015600897, 0.8604844373949189, 1.0]

            "(5, 50, 3)",
            # [0.20549421633071246, 0.70104634453696, 1.0, 0.70104634453696, 0.20549421633071246]
        ]

        # 执行测试
        for case in test_cases:
            print(f"输入:{case}")
            result = chebyshev_window(case)

            if isinstance(result, list):
                print(f"生成成功!窗口长度:{len(result)}")
                print(f"前5个系数:{result[:5]}") if len(result) >= 5 else print(f"系数:{result}")
            else:
                print(f"错误信息:{result}")
    
    
    第一类切比雪夫多项式

    ChebyshevT(n,x)表示在点x处的第一类第n次Chebyshev多项式

    n是多项式的次数, 标量,向量,数组,矩阵.

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


    def chebyshevt_polynomial(input_str):
        """
        计算切比雪夫多项式,支持标量和矩阵输入

        参数:
            input_str (str): 输入表达式字符串,格式为"(n, x)",其中
                n: 多项式阶数(整数或整数矩阵)
                x: 变量值或变量矩阵

        返回:
            sp.Expr 或 sp.Matrix 或 str: 计算结果,错误时返回错误描述字符串

        功能说明:
            1. 支持标量计算:如输入"(3, 0.5)"返回T3(0.5)的值
            2. 支持矩阵计算:当n或x为矩阵时,进行逐元素计算
            3. 输入验证:检查阶数有效性、矩阵形状匹配等
        """
        try:
            # 符号化输入表达式
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 输入验证
            if isinstance(expr, tuple) and len(expr) == 2:
                """计算单个元素的切比雪夫多项式值"""
                if all(e.is_number for e in expr):
                    n, x = expr
                    n_raw = float(n)
                    x_raw = complex(x)
                    result = eval_chebyt(n_raw, x_raw)
                elif any(e.free_symbols for e in expr):
                    result = sp.expand_func(sp.chebyshevt(*expr))
                else:
                    error = True
            else:
                error = True

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


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


    if __name__ == "__main__":
        # 测试用例
        test_cases = [
            "(3, 0.5)",  # (-1+0j)
            "(4,x)",  # 8*x**4 - 8*x**2 + 1
        ]

        # 执行测试
        for case in test_cases:
            print(f"输入:{case}")
            result = chebyshevt_polynomial(case)

            if isinstance(result, (sp.Expr, sp.Matrix)):
                print("计算结果:")
                print(result)
            else:
                print(f"错误信息:{result}")

            print("-" * 60)
    
    
    第二类切比雪夫多项式

    ChebyshevU(n,x)表示在点x处的第二类第n次Chebyshev多项式

    n是多项式的次数, 标量,向量,数组,矩阵.

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


    def chebyshevu_polynomial(input_str):
        """
        计算切比雪夫多项式,支持标量和矩阵输入

        参数:
            input_str (str): 输入表达式字符串,格式为"(n, x)",其中
                n: 多项式阶数(整数或整数矩阵)
                x: 变量值或变量矩阵

        返回:
            sp.Expr 或 sp.Matrix 或 str: 计算结果,错误时返回错误描述字符串

        功能说明:
            1. 支持标量计算:如输入"(3, 0.5)"返回T3(0.5)的值
            2. 支持矩阵计算:当n或x为矩阵时,进行逐元素计算
            3. 输入验证:检查阶数有效性、矩阵形状匹配等
        """
        try:
            # 符号化输入表达式
            expr = sp.sympify(input_str)
            error = False
            result = None
            # 输入验证
            if isinstance(expr, tuple) and len(expr) == 2:
                """计算单个元素的切比雪夫多项式值"""
                if all(e.is_number for e in expr):
                    n, x = expr
                    n_raw = float(n)
                    x_raw = complex(x)
                    result = eval_chebyu(n_raw, x_raw)
                elif any(e.free_symbols for e in expr):
                    result = sp.expand_func(sp.chebyshevu(*expr))
                else:
                    error = True
            else:
                error = True

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

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


    if __name__ == "__main__":
        # 测试用例
        test_cases = [
            "(3, 0.5)",  # (-1+0j)
            "(4,x)",  # 16*x**4 - 12*x**2 + 1
        ]

        # 执行测试
        for case in test_cases:
            print(f"输入:{case}")
            result = chebyshevu_polynomial(case)

            if isinstance(result, (sp.Expr, sp.Matrix)):
                print("计算结果:")
                print(result)
            else:
                print(f"错误信息:{result}")

            print("-" * 60)
    
    
    符号表达的子表达或术语

    subexpr = children(expr)返回一个无值单元格数组,其中包含符号表达式expr的子表达式.例如,求和的子表达式就是它的项.

    subexr = children(A)返回一个嵌套单元格数组,其中包含符号矩阵A中每个表达式的子表达式.

    expr —— 输入表达式,符号数,符号变量,符号函数,符号表达式

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


    def child_symbolic_expression(input_str):
        """
        处理符号表达式或矩阵,返回其子表达式

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

        返回:
            子表达式结构 或 错误信息字符串

        处理逻辑:
            1. 尝试将输入字符串转换为SymPy表达式
            2. 如果是矩阵,递归处理每个元素
            3. 如果是符号表达式,提取其子表达式
            4. 数值表达式返回错误信息
        """
        try:
            expr = sp.sympify(input_str, evaluate=False)
            error = False
            result = None

            # 普通符号表达式处理
            if expr.free_symbols:
                result = expr.args
            # 数值表达式或无法处理的情况
            else:
                error = True

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

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


    def main():
        """测试用例主函数"""
        # 测试: 普通符号表达式
        print("测试: 普通符号表达式")
        input_str = "x + sin(y)*z"
        print("输入字符串:", input_str)
        print("解析结果:", child_symbolic_expression(input_str), "\n")
        # 解析结果: (x, z*sin(y))


    if __name__ == "__main__":
        main()
    
    
    卡方分布的累积分布函数

    p=ChiSquareCDF(x,k)返回具有自由度k的卡方分布的累积分布函数(cdf),以x中的值进行评估.

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

    k是自由度,正标量值,正标量值数组.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from sympy.stats import ChiSquared, cdf
    from scipy.stats import chi2


    def chi_squared_cdf(input_str):
        """
        计算卡方分布的累积分布函数 (CDF)

        参数:
            input_str: 输入字符串,格式应为包含x值和自由度k的元组,例如 "(x, 2)" 或 "([1,2], 3)"

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

        处理逻辑:
            1. 将输入字符串转换为SymPy表达式
            2. 解析出x值(标量/矩阵)和自由度k
            3. 对每个x值计算Chi-Squared(k)的CDF
        """
        try:
            # 将输入字符串转换为SymPy表达式
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 检查输入是否为元组 (x, k)
            if isinstance(expr, tuple) and len(expr) == 2:

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

                    # 验证k是否为正整数
                    if not (expr[1].is_Integer and expr[1] > 0):
                        return f"错误: 自由度k必须为正整数,当前k={expr[1]}"

                    """用SciPy计算卡方分布在标量x处的CDF值"""
                    result = chi2.cdf(float(expr[0]), df=int(expr[1]))

                elif any(e.free_symbols for e in expr):
                    """计算单个值的卡方分布CDF"""
                    # 创建卡方分布对象
                    chi_dist = ChiSquared('Chi', expr[1])
                    # 计算CDF并转换为浮点数
                    result = cdf(chi_dist)(expr[0])
                else:
                    error = True
            else:
                error = True

            return result if not error else f"输入格式错误: 需要(x, k)元组,当前输入{input_str}"

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


    def main():
        """测试用例主函数"""
        # 测试1: 标量数值输入
        print("测试1: 标量数值输入")
        print(chi_squared_cdf("(2, 3)"))  # 应输出数值结果
        # 0.42759329552912023

        print(chi_squared_cdf("(5.5, 2)"), "\n")  # 应输出数值结果
        # 0.9360721387932924

        # 测试2: 符号输入
        print("测试3: 符号输入")
        x = sp.symbols('x')
        print(chi_squared_cdf(f"({x}, 3)"), "\n")  # 应输出符号表达式
        # Piecewise((-sqrt(2)*sqrt(x)*exp(-x/2)/sqrt(pi) + erf(sqrt(2)*sqrt(x)/2), x >= 0), (0, True))


    if __name__ == "__main__":
        main()
    
    
    卡方分布的概率密度函数

    y=ChiSquarePDF(x,k)返回具有k个自由度的卡方分布的概率密度函数(pdf),以x中的值进行评估.

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

    k是自由度,正标量值,正标量值数组
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from sympy.stats import ChiSquared, density
    from scipy.stats import chi2


    def chi_squared_pdf(input_str):
        """
        计算卡方分布的概率密度函数 (PDF)

        参数:
            input_str: 输入字符串,格式应为包含x值和自由度k的元组,例如 "(x, 2)" 或 "([1,2], 3)"

        返回:
            PDF计算结果 (数值/矩阵/符号表达式) 或 错误信息字符串

        处理逻辑:
            1. 将输入字符串转换为SymPy表达式
            2. 解析出x值(标量/矩阵)和自由度k
            3. 对每个x值计算Chi-Squared(k)的PDF
        """
        try:
            # 将输入字符串转换为SymPy表达式
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 检查输入是否为元组 (x, k)
            if isinstance(expr, tuple) and len(expr) == 2:

                if all(e.is_number for e in expr):
                    # 验证k是否为正整数
                    if not (expr[1].is_integer and expr[1] > 0):
                        return f"错误: 自由度k必须为正整数,当前k={expr[1]}"

                    """用SciPy计算卡方分布在标量x处的PDF值"""
                    result = chi2.pdf(float(expr[0]), df=int(expr[1]))

                elif any(e.free_symbols for e in expr):
                    """计算单个值的卡方分布PDF"""
                    # 创建卡方分布对象
                    chi_dist = ChiSquared('Chi', expr[1])
                    # 计算PDF并转换为浮点数或符号表达式
                    result = density(chi_dist)(expr[0])
                else:
                    error = True
            else:
                error = True

            return result if not error else f"输入格式错误: 需要(x, k)元组,当前输入{input_str}"

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


    def main():
        """测试用例主函数"""
        # 测试1: 标量数值输入
        print("测试1: 标量数值输入")
        print(chi_squared_pdf("(2, 3)"))
        # 0.2075537487102974

        print(chi_squared_pdf("(5.5, 2)"), "\n")  # 应输出0.026995
        # 0.031963930603353785

        # 测试2: 符号输入
        print("测试3: 符号输入")
        x = sp.symbols('x')
        print(chi_squared_pdf(f"({x}, 3)"), "\n")  # 应输出符号表达式
        # sqrt(2)*sqrt(x)*exp(-x/2)/(2*sqrt(pi))

    if __name__ == "__main__":
        main()
    
    
    卡方分布的随机抽样

    r=ChiSquareRND(k,sz)从卡方分布生成随机数的数组,其中向量sz指定大小(r).

    k是自由度,正标量值,正标量值数组.

    sz是每个维度的大小(作为行向量),整数的行向量
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from scipy.stats import chi2


    def chi_squared_rnd(input_str):
        """
        生成卡方分布的随机数矩阵

        参数:
            input_str: 输入字符串,格式应为(k, [m,n])元组,例如 "(3, [2,3])"

        返回:
            sp.Matrix 或 错误信息字符串

        处理逻辑:
            1. 验证输入格式为(k, 矩阵尺寸)
            2. 检查k为正整数
            3. 生成指定尺寸的卡方分布随机数矩阵
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 检查输入是否为(k, 尺寸)元组
            if isinstance(expr, tuple) and len(expr) == 2:
                k, sz = expr[0], expr[1]

                # 验证k参数
                if not (k.is_integer and k > 0):
                    return f"错误: 自由度k必须为正整数,当前k={k}"

                # 验证尺寸参数
                if isinstance(sz, list) and len(sz) == 2:
                    size = tuple(int(e.evalf()) for e in sz)
                    """用SciPy生成卡方分布的随机数(标量输出)"""
                    result = chi2.rvs(df=int(k), size=size)
                    '''
                    此处是sympy实现
                    chi_squared = sp.stats.ChiSquared('ChiSquared', k_val)
                    iterator = sp.stats.sample_iter(chi_squared, numsamples=1)
                    return list(iterator)[0]
                    '''
                else:
                    error = True
            else:
                error = True

            return result if not error else f"输入格式错误: 需要(k, [m,n])元组,当前输入{input_str}"

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


    def main():
        """测试用例主函数"""
        # 测试1: 有效输入
        print("测试1: 2x3矩阵")
        print(chi_squared_rnd("(3, [2,3])"), "\n")  # 应输出2x3随机矩阵
        # [[4.03513455 1.70488102 1.05668236]
        #  [5.22645923 3.76494573 8.59081048]]

        # 测试2: 边界情况测试
        print("测试2: 1x1矩阵")
        print(chi_squared_rnd("(1, [1,1])"), "\n")  # 应输出1x1矩阵
        # [[0.03386891]]

    if __name__ == "__main__":
        main()
    
    
    乔列斯基分解

    chol(A) A是输入矩阵,可以使用满存储或稀疏存储,但必须为方阵和对称正定矩阵.

    chol 假设A是对称实矩阵,或者是Hermitian对称复矩阵.chol仅使用A的上三角或下三角执行计算,具体取决于triangle的值.

    将正定对称矩阵分解为一个下三角矩阵及其转置的上三角矩阵乘积.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np
    from scipy.linalg import cholesky


    def cholesky_matrix(input_str):
        """
        执行矩阵的Cholesky分解

        参数:
            input_str: 输入矩阵的字符串表示,可以是符号矩阵或数值矩阵

        返回:
            sp.Matrix 或 str: 成功返回下三角矩阵,失败返回错误信息

        处理逻辑:
            1. 将输入转换为SymPy矩阵
            2. 检查矩阵是否对称正定
            3. 符号矩阵使用SymPy分解
            4. 数值矩阵使用NumPy分解(更高效)
        """
        try:
            expr = sp.sympify(input_str)
            result = None

            # 转换为SymPy矩阵
            if isinstance(expr, list):
                A = sp.Matrix(expr)
            else:
                return f"输入错误: 无法转换为矩阵 - {input_str}"

            # 检查矩阵是否为方阵
            if A.rows != A.cols:
                return f"错误: 矩阵必须是方阵,当前尺寸为{A.rows}x{A.cols}"

            # 检查是否包含符号变量
            contains_symbols = any((element.has(sp.I) or element.free_symbols) for element in A)
            if contains_symbols:
                result = A.cholesky()
            else:
                N_A = np.array(A, dtype=float)
                c = cholesky(N_A)
                result = sp.Matrix(c)

            return result

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


    def main():
        """测试用例主函数"""
        # 测试1: 有效数值矩阵
        print("测试1: 4x4数值矩阵")
        print(cholesky_matrix("[[4,12,-16],[12,37,-43],[-16,-43,98]]"), "\n")
        # Matrix([[2.00000000000000, 6.00000000000000, -8.00000000000000],
        #         [0, 1.00000000000000, 5.00000000000000],
        #         [0, 0, 3.00000000000000]])


        # 测试2: 符号矩阵
        print("测试2: 复数矩阵分解")
        print(cholesky_matrix(f"[[9, 3j],[-3j,5]]"), "\n")
        # Matrix([[3, 0], [-I, 2]])


    if __name__ == "__main__":
        main()
    
    
    乔列斯基分解的秩1更新

    R1 = cholupdate(R,x)(其中 R = chol(A) 是A的原始乔列斯基分解)返回 A + x*x' 的上三角乔列斯基因子,其中x是具有合适长度的一个列向量.cholupdate仅使用R的对角线和上三角.R 的下三角将被忽略.

    R1 = cholupdate(R,x,'+') 与 R1 = cholupdate(R,x) 相同.

    R1 = cholupdate(R,x,'-') 返回 A - x*x' 的乔列斯基因子.当R不是有效的乔列斯基因子或旧矩阵不是正定矩阵时,将会报告一条错误消息,这样将没有乔列斯基分解

    cholupdate 仅适用于满矩阵.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np


    def cholesky_update_rank(input_str):
        """
        执行 Cholesky 分解的秩-1 更新或降级。

        参数:
            input_str (str): 输入字符串,格式为表示元组的字符串。
                示例: "([[4,0], [0,9]], [2,3], '+')" 表示:
                    - L: 下三角矩阵 [[4,0], [0,9]]
                    - x: 向量 [2,3]
                    - sign: '+' 表示更新

        返回:
            sp.Matrix 或 str: 成功返回更新后的矩阵,失败返回错误信息。
        """
        try:
            # 解析输入字符串为Python对象(如元组、列表)
            expr = sp.sympify(input_str)
            error = False
            result = None

            def evaluation_cholupdate(L, x, sign='+'):
                """
                内部函数:执行 Cholesky 秩-1 更新/降级算法。

                参数:
                    L (np.ndarray): 下三角矩阵
                    x (np.ndarray): 更新向量
                    sign (str): 操作符 '+' 或 '-'

                返回:
                    np.ndarray: 更新后的下三角矩阵
                """
                p = len(x)
                x = x.copy()  # 避免修改原向量

                for k in range(p):
                    if sign == '+':
                        r = np.sqrt(L[k, k] ** 2 + x[k] ** 2)
                    elif sign == '-':
                        r = np.sqrt(L[k, k] ** 2 - x[k] ** 2)
                    else:
                        raise ValueError("Invalid sign")
                    c = r / L[k, k]
                    s = x[k] / L[k, k]
                    L[k, k] = r
                    if k + 1 < p:
                        L[k, k + 1:p] = (L[k, k + 1:p] + s * x[k + 1:p]) / c
                        x[k + 1:p] = c * x[k + 1:p] - s * L[k, k + 1:p]
                return L

            # 检查输入结构是否为元组
            if isinstance(expr, tuple):
                # 处理两种输入形式:(L, x) 或 (L, x, sign)
                if len(expr) == 2:
                    L, x = expr[0], expr[1]
                    sign = '+'  # 默认符号为+
                elif len(expr) == 3:
                    L, x, sign_symbol = expr[0], expr[1], expr[2]
                    if str(sign_symbol) == "plus":
                        sign = '+'  # 默认符号为+
                    elif str(sign_symbol) == "minus":
                        sign = '-'  # 默认符号为+
                    else:
                        error = True
                else:
                    error = True

                # 转换为 SymPy 矩阵
                L_matrix = sp.Matrix(L)
                x_matrix = sp.Matrix(x)

                # 检查矩阵有效性
                if not error and L_matrix is not None and x_matrix is not None:
                    # 转换为 NumPy 数组
                    np_L = np.array(L_matrix.tolist(), dtype=float)
                    np_x = np.ravel(np.array(x_matrix.tolist(), dtype=float))

                    # 执行 Cholesky 更新
                    try:
                        result = evaluation_cholupdate(np_L.T, np_x, sign)
                    except ValueError as e:
                        error = True
                        return f"计算错误: {e}"
                else:
                    error = True
            else:
                error = True

            # 返回结果或错误
            if not error and result is not None:
                return sp.Matrix(result.tolist())
            else:
                return f"输入错误: {input_str}"

        except (SyntaxError, ValueError, TypeError) as e:
            return f"解析错误: {e}"
        except Exception as e:
            return f"未知错误: {e}"


    def main():
        # 示例1: 正确输入(秩-1更新)
        input_str1 = "[[4.0, 0.0], [0.0, 9.0]],[2.0, 3.0],plus"
        print("示例1 输入:", input_str1)
        result1 = cholesky_update_rank(input_str1)
        print("更新结果:\n", result1 if isinstance(result1, sp.Matrix) else result1)
        # Matrix([[4.47213595499958, 1.34164078649987],
        #         [0, 9.39148550549912]])

        # 示例2: 正确输入(秩-1降级)
        input_str2 = "([[2.0, 0.0], [0.0, 3.0]], [1.0, 1.0], minus)"
        print("\n示例2 输入:", input_str2)
        result2 = cholesky_update_rank(input_str2)
        print("降级结果:\n", result2 if isinstance(result2, sp.Matrix) else result2)
        # Matrix([[1.73205080756888, 0.577350269189626],
        #         [0, 2.94392028877595]])


    if __name__ == "__main__":
        main()
    
    
    奇异的托普利茨下黑森贝格矩阵

    A = chow(n,alpha,delta) 返回一个阶数为 n 的 Chow 矩阵,它是 n×n 的下黑森贝格矩阵,  alpha 和 delta 使用默认值 1 和 0.

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


    def chow_matrix(input_str, locals_dict=None):
        """
        根据输入字符串生成 Chow 矩阵。

        参数:
        input_str: 输入的字符串,可以是以下形式:
                   - 单个正整数 (如 "5")
                   - 元组格式,包含1-3个参数 (如 "(3, 2)", "(4, 1, 0.5)")
                   元组参数意义:(矩阵维度n, 对角线元素alpha=1, 下三角元素delta=0)
        locals_dict: 用于符号解析的本地变量字典,默认为 None

        返回:
        生成的 SymPy 矩阵,若输入错误则返回错误信息字符串
        """
        try:
            # 解析输入字符串
            expr = sp.sympify(input_str)
            error = False
            result = None

            def generate_chow(n, alpha=1, delta=0):
                """生成 n x n 的 Chow 矩阵"""
                # 输入验证
                if not isinstance(n, int) or n <= 0:
                    raise ValueError("矩阵维度n必须是正整数")

                # 使用 SymPy 创建矩阵
                C = sp.Matrix.zeros(n, n)
                for i in range(n):
                    for j in range(n):
                        if i == j:
                            C[i, j] = alpha
                        elif i > j:
                            C[i, j] = delta
                        else:
                            C[i, j] = 1
                return C

            # 处理不同输入类型
            if isinstance(expr, tuple):
                # 元组输入 (n, alpha, delta)
                params = list(expr)
                if len(params) < 1 or len(params) > 3:
                    error = True
                else:
                    try:
                        n = int(params[0]) if params[0].is_integer else params[0]
                        alpha = params[1] if len(params) >= 2 else 1
                        delta = params[2] if len(params) >= 3 else 0
                        result = generate_chow(n, alpha, delta)
                    except (TypeError, ValueError):
                        error = True
            elif expr.is_number and expr.is_integer:
                # 单个整数输入
                n = int(expr)
                result = generate_chow(n)
            else:
                error = True

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


    def main():
        # 示例1: 3x3 默认参数矩阵
        input1 = "3"
        print(f"输入: {input1}\n输出:\n{chow_matrix(input1)}\n")
        # Matrix([[1, 1, 1], [0, 1, 1], [0, 0, 1]])

        # 示例2: 2x2 带alpha参数的矩阵
        input2 = "(2, 5)"
        print(f"输入: {input2}\n输出:\n{chow_matrix(input2)}\n")
        # Matrix([[5, 1], [0, 5]])

        # 示例3: 4x4 完整参数矩阵
        input3 = "(4, 1, 0.5)"
        print(f"输入: {input3}\n输出:\n{chow_matrix(input3)}\n")
        #Matrix([[1, 1, 1, 1],
        #        [0.500000000000000, 1, 1, 1],
        #        [0.500000000000000, 0.500000000000000, 1, 1],
        #        [0.500000000000000, 0.500000000000000, 0.500000000000000, 1]])

    if __name__ == "__main__":
        main()
    
    
    循环矩阵

    A = circul(v) 返回一个n×n循环矩阵, 其第一行是长度为n的向量v. 循环矩阵是一种特殊的托普利茨矩阵,其中每行都通过周期性地将上一行中的各元向右移一位来获得.

    如果v是标量,则 A = circul(1:v)。

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


    def circul_matrix(input_str, locals_dict=None):
        """
        根据输入生成循环矩阵

        参数:
        input_str - 输入字符串,支持以下格式:
                    1. 单个正整数 (如 "3" 生成向量[1,2,3]的循环矩阵)
                    2. 列表形式 (如 "[1, 2, 3]" 或 "Matrix([a, b, c])")
                    3. 符号表达式 (需通过locals_dict提供符号定义)
        locals_dict - 符号解析字典,默认为None

        返回:
        SymPy矩阵对象 或 错误信息字符串
        """
        try:
            # 解析输入表达式
            expr = sp.sympify(input_str)
            error = False
            result = None

            def generate_circulant(vector):
                """生成循环矩阵的核心函数"""
                n = len(vector)
                # 使用SymPy矩阵代替numpy
                C = sp.Matrix.zeros(n, n)
                for i in range(n):
                    # 实现循环右移操作
                    for j in range(n):
                        C[i, j] = vector[(j - i) % n]
                return C

            # 处理不同输入类型
            if isinstance(expr, sp.Matrix):
                # 直接处理矩阵输入
                if expr.rows == 1 or expr.cols == 1:
                    vector = list(expr)
                    result = generate_circulant(vector)
                else:
                    error = True
            elif isinstance(expr, list):
                # 处理列表输入
                # 尝试转换为数值或符号列表
                vector = [sp.sympify(e) for e in expr]
                result = generate_circulant(vector)
            elif expr.is_integer and expr > 0:
                # 生成1到n的序列
                v = list(range(1, int(expr) + 1))
                n_v = np.array(v, dtype=float)
                result = generate_circulant(vector=n_v)
            else:
                error = True

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

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


    def main():
        # 示例1: 数值列表输入
        input1 = "[1, 2, 3]"
        print(f"输入: {input1}\n输出:\n{circul_matrix(input1)}\n")
        # Matrix([[1, 2, 3], [3, 1, 2], [2, 3, 1]])

        # 示例2: 符号输入
        a, b, c = sp.symbols('a b c')
        input2 = "Matrix([a, b, c])"
        print(f"输入: {input2}\n输出:\n{circul_matrix(input2, locals_dict={'a': a, 'b': b, 'c': c})}\n")
        # Matrix([[a, b, c], [c, a, b], [b, c, a]])

        # 示例3: 数值简写输入
        input3 = "3"
        print(f"输入: {input3}\n输出:\n{circul_matrix(input3)}\n")
        # Matrix([[1.00000000000000, 2.00000000000000, 3.00000000000000],
        #         [3.00000000000000, 1.00000000000000, 2.00000000000000],
        #         [2.00000000000000, 3.00000000000000, 1.00000000000000]])

        # 示例4: 三角函数表达式
        x = sp.symbols('x')
        input4 = "[sin(x), cos(x), 2*sin(x)]"
        print(f"输入: {input4}\n输出:\n{circul_matrix(input4, {'x': x})}\n")
        # Matrix([[sin(x), cos(x), 2*sin(x)],
        #         [2*sin(x), sin(x), cos(x)],
        #         [cos(x), 2*sin(x), sin(x)]])


    if __name__ == "__main__":
        main()
    
    
    具有零值对角线元的Clement三对角矩阵

    A = clement(n,k) 返回一个主对角线元为0的n×n三对角矩阵. 对于 k = 0(默认值),A 是非对称的.对于 k = 1,A 是对称的.

    A = clement(n,k,1) 在对角线方面类似于 clement('clement',n,0),其中存在一个具有相同大小的对角线矩阵 D 满足 B = inv(D)*A*D.

    如果n是奇数, 则A是奇异矩阵.

    A 的特征值是显式可知的, 其中包括正负数字 n-1、n-3、n-5、...、1 或 0.

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


    def clement_matrix(input_str, locals_dict=None):
        """
        生成 Clement 三对角矩阵 (对称或非对称版本)

        参数:
        input_str - 输入字符串,支持格式:
                    1. 单个正整数 n (如 "4")
                    2. 元组 (n, k) (如 "(4, 1)")
                    k=0: 非对称矩阵 (默认)
                    k=1: 对称矩阵
        locals_dict - 符号解析字典,默认为None

        返回:
        SymPy矩阵对象 或 错误信息字符串
        """
        try:
            # 解析输入表达式
            expr = sp.sympify(input_str)
            error = False
            result = None

            def generate_clement(n, k=0):
                """生成 Clement 矩阵核心函数"""
                # 输入验证
                if not isinstance(n, int) or n < 2:
                    raise ValueError("矩阵维度n必须是≥2的整数")
                if k not in (0, 1):
                    raise ValueError("参数k只能是0或1")

                # 使用SymPy创建矩阵
                A = sp.Matrix.zeros(n, n)
                for i in range(n - 1):
                    val = sp.sqrt((n - i - 1) * (i + 1))
                    A[i, i + 1] = val
                    A[i + 1, i] = val if k == 1 else -val
                return A

            # 处理不同输入类型
            if isinstance(expr, tuple):
                # 元组输入 (n, k)
                if len(expr) != 2:
                    error = True
                else:
                    try:
                        n = int(expr[0]) if expr[0].is_integer else expr[0]
                        k = int(expr[1]) if expr[1].is_number else expr[1]
                        result = generate_clement(n, k)
                    except (TypeError, ValueError):
                        error = True
            elif expr.is_integer and expr >= 2:
                # 单个整数输入
                n = int(expr)
                result = generate_clement(n)
            else:
                error = True

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

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


    def main():
        # 示例1: 4阶非对称矩阵 (默认k=0)
        input1 = "4"
        print(f"输入: {input1}\n输出:\n{clement_matrix(input1)}\n")
        # Matrix([[0, sqrt(3), 0, 0],
        #         [-sqrt(3), 0, 2, 0],
        #         [0, -2, 0, sqrt(3)],
        #         [0, 0, -sqrt(3), 0]])

        # 示例2: 3阶对称矩阵
        input2 = "(3, 1)"
        print(f"输入: {input2}\n输出:\n{clement_matrix(input2)}\n")
        # Matrix([[0, sqrt(2), 0],
        #         [sqrt(2), 0, sqrt(2)],
        #         [0, sqrt(2), 0]])

    if __name__ == "__main__":
        main()
    
    
    余弦积分

    cosint(X)返回X的余弦积分函数

    根据其参数,余弦返回浮点或精确的符号结果.

    X是符号变量,符号表达式,函数,向量或矩阵
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from sympy.functions.special.error_functions import Ci
    from scipy.special import sici


    def ci_cosine_integral(input_str):
        """
        计算输入的余弦积分Ci(x),支持矩阵、数值和符号表达式

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

        返回:
        计算结果。如果输入为矩阵,返回对应元素的Ci积分矩阵;
        如果输入为数值或符号,返回Ci积分值。
        无法处理时返回错误信息字符串
        """
        try:
            # 表达式转换
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 元组类型直接视为错误
            if isinstance(expr, tuple):
                error = True
            # 处理标量数值和符号表达式
            elif expr.is_number:
                z = complex(expr)
                """计算余弦积分 Ci(x)"""
                result = sici(z)[1]  # 取返回值的第二个元素,即 Ci(x)

            elif expr.free_symbols:
                # 处理符号变量表达式
                result = Ci(expr)
            else:
                error = True

            return result if not error else f"输入错误: {input_str}"
        except sp.SympifyError as e:
            return f"表达式解析错误: {e}"
        except Exception as e:
            return f"运行时错误: {str(e)}"


    def main():
        """
        主函数测试用例
        """
        test_cases = [
            "0",  # (-inf+nan*j)
            "x",  # Ci(x)
            "3.14",  # (0.07417499776126246+0j)
            "cos(2)"  # (-0.3424847875188666+3.141592653589793j)
        ]

        for case in test_cases:
            print(f"测试输入: {case}")
            result = ci_cosine_integral(case)
            print("返回结果:")

            # 统一输出格式
            if isinstance(result, sp.Matrix):
                sp.pprint(result)
            elif isinstance(result, sp.Expr):
                print(sp.pretty(result))
            else:
                print(result)
            print("-" * 50)


    if __name__ == "__main__":
        main()
    
    
    多项式系数

    C=coeffs(p)返回多项式p关于由symvar在p中确定的所有变量的系数.

    C=coeffs(p,var)返回多项式p相对于变量var的系数.

    C=coeffs(p,vars)返回多元多项式p相对于变量vars的系数.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp


    def coefficients_of_polynomial(input_str, locals_dict=None):
        """
        提取多项式的系数列表

        参数:
        input_str - 输入字符串,支持格式:
                    1. 纯多项式表达式 (如 "x**2 + 2*x + 1")
                    2. 元组格式 (表达式, 变量) (如 "(x**2 + y, x)")
                    3. 元组格式 (表达式, [变量1, 变量2,...]) (如 "(x**2 + x*y, [x, y])")
        locals_dict - 符号解析字典,默认为None

        返回:
        系数列表 (单变量) 或嵌套系数列表 (多变量)
        错误时返回描述性错误信息
        """
        try:
            # 解析输入表达式
            expr = sp.sympify(input_str)
            result = []

            # 处理不同输入格式
            if isinstance(expr, tuple):
                if len(expr) != 2:
                    raise ValueError("元组输入必须为 (表达式, 变量) 格式")

                poly_expr, variables = expr

                # 处理多变量情况
                if isinstance(variables, list):
                    for var in variables:
                        if not var.free_symbols:
                            raise ValueError(f"无效变量: {var}")
                        poly = sp.poly(poly_expr, var)
                        result.append(poly.coeffs())
                # 处理单变量情况
                else:
                    if not variables.free_symbols:
                        raise ValueError(f"无效变量: {variables}")
                    poly = sp.poly(poly_expr, variables)
                    result = poly.coeffs()

            # 处理单表达式情况
            else:
                poly = sp.poly(expr)
                result = poly.coeffs()

            return result

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


    def main():
        # 示例1: 单变量多项式
        input1 = "x**3 + 2*x**2 - 5*x + 7"
        print(f"输入: {input1}")
        print("输出:", coefficients_of_polynomial(input1), end="\n\n")
        # 输出: [1, 2, -5, 7]

        # 示例2: 指定变量
        x, y = sp.symbols('x y')
        input2 = "(x**2 + 2*x*y + y**2, x)"
        print(f"输入: {input2}")
        print("输出:", coefficients_of_polynomial(input2, {'x': x, 'y': y}), end="\n\n")
        # 输出: [1, 2*y, y**2]:

        # 示例3: 多变量分析
        input3 = "(x**3 + 2*y*x**2 - 5*z*x, [x, y, z])"
        print(f"输入: {input3}")
        print("输出:", coefficients_of_polynomial(input3, {'x': x, 'y': y, 'z': sp.symbols('z')}), end="\n\n")
        # 输出: [[1, 2*y, -5*z], [2*x**2, x**3 - 5*x*z], [-5*x, x**3 + 2*x**2*y]]

        # 示例4: 符号多项式
        a, b = sp.symbols('a b')
        input4 = "(a*x**2 + b*x + c, x)"
        print(f"输入: {input4}")
        print("输出:", coefficients_of_polynomial(input4, {'a': a, 'b': b, 'c': sp.symbols('c'), 'x': x}), end="\n\n")
        # 输出: [a, b, c]


    if __name__ == "__main__":
        main()
    
    
    收集系数

    collect(P)收集P的默认变量的幂的P中的系数.默认变量由symvar找到.

    collect(P,expr) 如果P是一个向量或矩阵,则collect对P进行元素运算.如果expr是一个矢量,那么collect根据expr中的所有表达式查找系数.

    P是符号表达式,符号函数,符号向量,符号矩阵.

    expr是收集系数的表达式,指定为符号数,符号变量,符号表达式,符号函数,符号向量,字符向量或字符矢量的单元数组.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp


    def collect_power_expression(input_str, locals_dict=None):
        """
        实现类似 MATLAB collect 函数的功能,收集表达式中的项。

        参数:
        input_str: 输入的字符串,可以是矩阵、表达式或元组(表达式和符号)。
        locals_dict: 用于 sympify 的本地符号字典,默认为 None。

        返回:
        收集后的表达式或矩阵,错误时返回错误信息字符串。
        """
        try:
            # 定义 SymPy 函数和符号以用于解析字符串
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 处理输入为元组的情况(表达式和符号)
            if isinstance(expr, tuple):
                if len(expr) != 2:
                    return f"输入错误: 元组长度必须为2,当前为{len(expr)}"
                expr_part, sym_part = expr
                if expr_part.free_symbols:
                    # 对普通表达式收集符号
                    result = sp.collect(expr_part, sym_part)
                else:
                    error = True
            elif expr.free_symbols:
                # 收集普通表达式的所有符号
                result = sp.collect(expr, list(expr.free_symbols))
            else:
                error = True

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


    def main():
        # 定义符号
        x, y = sp.symbols('x y')

        # 示例1: 收集表达式中的 cos(y) 项
        input_str1 = "4*sin(x)*cos(y)^3+4*cos(x)*sin(y)*cos(y)^2+(-3*sin(x))*cos(y)-cos(x)*sin(y),sin(x)"
        result1 = collect_power_expression(input_str1, {'x': x, 'y': y})
        print("示例1 输入:", input_str1)
        print("结果1:\n", result1)
        #  (4*cos(y)**3 - 3*cos(y))*sin(x) + 4*sin(y)*cos(x)*cos(y)**2 - sin(y)*cos(x)

        # 示例2: 收集普通表达式的符号
        input_str2 = "x**3 + x**2*y + x*y**2 + y**3"
        result2 = collect_power_expression(input_str2, {'x': x, 'y': y})
        print("\n示例3 输入:", input_str2)
        print("结果3:", result2)
        # x**3 + x**2*y + x*y**2 + y**3


    if __name__ == "__main__":
        main()
    
    
    生成数组的所有元素组合

    T=组合(A1,…,An)生成输入阵列A1,…的所有元素组合,其中输出表T的每一行都是一个组合.这些组合与n组元素的笛卡尔乘积相同.

    T中的行数是每个输入数组中元素数的乘积.行数与组合数相同.

    T中变量的数量与输入数组的数量相同.

    T中每个变量的数据类型与相应输入数组的数据类型相同.

    A1,...An —— 输入数组(作为单独的参数),标量,向量,矩阵
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import itertools
    import numpy as np


    def combinations_all_element_arrays(input_str):
        """
        生成输入中所有数组元素的笛卡尔积组合。

        参数:
        input_str: 输入的字符串表达式,应为元组形式,例如 "([1,2], [3,4])"

        返回:
        如果输入有效,返回包含所有组合的 SymPy 矩阵;否则返回错误信息。
        """
        try:
            # 将输入字符串转换为 SymPy 表达式
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 仅处理元组类型的输入
            if isinstance(expr, tuple):
                expr_tuple = ()
                for element in expr:
                    current_elements = []
                    # 处理列表类型元素
                    if isinstance(element, list):
                        # 使用 numpy 展平多维列表
                        current_elements = np.ravel(element).tolist()
                    expr_tuple += (current_elements,)

                # 生成所有可能的组合
                combinations = list(itertools.product(*expr_tuple))
                # 转换为 SymPy 矩阵
                C = np.array(combinations)
                result = sp.Matrix(C)
            else:
                error = True

            return result if not error else f"输入错误: {input_str} 应为元组形式,例如 '([1,2], [3,4])'"
        except Exception as e:
            return f"错误: {e}"


    def main():
        """示例主函数,演示不同输入情况下的输出"""
        test_cases = [
            "([1,2], [3,4])",
            # Matrix([[1, 3],
            #         [1, 4],
            #         [2, 3],
            #         [2, 4]])

            "( [ [1,2], [3] ], [5,6] )",
            # Matrix([[[1, 2], 5], [[1, 2], 6], [[3], 5], [[3], 6]])
        ]

        for case in test_cases:
            print(f"测试输入: {case}")
            result = combinations_all_element_arrays(case)
            print("输出结果:")
            print(result)
            print("-" * 50)


    if __name__ == "__main__":
        main()
    
    
    简化表达式

    Y=combine(S)将表达式S中的幂的乘积重写为单个幂。.

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


    def combine_expression(input_str):
        """
        对标MATLAB的combine函数,合并表达式中的乘积为单个幂或合并特定函数的多次调用。

        参数:
        input_str (str): 输入的表达式字符串。
        target (sympy.Function, 可选): 目标函数,用于指定合并的规则。默认为None,自动处理。

        返回:
        sympy.Expr 或 sympy.Matrix 或 str: 合并后的表达式/矩阵,出错则返回错误信息字符串。
        """
        try:
            expr = sp.sympify(input_str)
        except Exception as e:
            return f"表达式转换错误: {e}"

        try:
            # 检查是否是矩阵
            if isinstance(expr, list):
                matrix = sp.Matrix(expr)
                return matrix.applyfunc(sp.simplify)
            else:
                # 普通表达式处理
                return sp.simplify(expr)
        except Exception as e:
            return f"合并错误: {e}"


    if __name__ == "__main__":
        # 示例1: 合并 atan 表达式 (需符号假设)

        input_str1 = "exp(2) * exp(3)"
        result1 = combine_expression(input_str1)
        print("示例1 结果:")
        print(result1)
        # 输出 exp(5)

        # 示例2: 合并 log 表达式
        b = sp.symbols('b')
        input_str2 = "log(a) + log(b)"
        result2 = combine_expression(input_str2)
        print("\n示例2 结果:")
        print(result2)
        # 输出 log(a) + log(b)

        # 示例3: 自动合并矩阵元素
        x, y = sp.symbols('x y', positive=True)
        input_str3 = "[[log(x) + log(y), atan(x) + atan(1/x)], [exp(x)*exp(y), 2**3*2**4]]"
        result3 = combine_expression(input_str3)
        print("\n示例3 结果:")
        print(result3)
        # Matrix([[log(x) + log(y), atan(1/x) + atan(x)], [exp(x + y), 128]])

        # 示例4: 指定目标函数合并矩阵
        input_str4 = "[[atan(x)+atan(1/x), log(a)+log(b)]]"
        result4 = combine_expression(input_str4)
        print("\n示例4 结果:")
        print(result4)
        # Matrix([[atan(1/x) + atan(x), log(a) + log(b)]])
    
    
    伴随矩阵

    A = compan(u) 返回第一行为 -u(2:n)/u(1) 的对应伴随矩阵,其中u是多项式系数向量.

    compan(u) 的特征值是多项式的根.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np


    def companion_matrix(input_str):
        """
        根据输入生成首一多项式(最高次项系数为1)的伴随矩阵

        参数:
        input_str: 输入可以是以下形式:
                   - 系数列表字符串(如 "[1, 2, 3]")
                   - SymPy矩阵字符串(如 "Matrix([1, 2, 3])")
                   - 多项式表达式字符串(如 "x**2 + 2*x + 3")

        返回:
        成功时返回SymPy矩阵,失败时返回错误信息字符串

        特点:
        1. 自动处理三种输入类型:列表、矩阵、多项式表达式
        2. 强制首一多项式规范,自动进行系数归一化
        3. 完善的错误处理机制
        """
        try:
            # 符号变量用于多项式解析
            x = sp.symbols('x')
            # 将输入字符串转换为SymPy对象
            expr = sp.sympify(input_str)
            coeffs = []

            # 输入类型分派处理
            if isinstance(expr, list):  # 处理Python列表输入
                coeffs = expr.copy()
            elif isinstance(expr, sp.Matrix):  # 处理矩阵输入
                coeffs = list(expr.flat())
            elif isinstance(expr, sp.Expr):  # 处理多项式表达式
                expr_symbol = tuple(expr.free_symbols)[0]
                poly = sp.Poly(expr, expr_symbol)
                raw_coeffs = poly.all_coeffs()

                # 归一化处理:使首项系数为1
                if raw_coeffs[0] == 0:
                    return "错误:零首项的多项式无效"
                leading_coeff = raw_coeffs[0]
                coeffs = [c / leading_coeff for c in raw_coeffs[1:]]
            else:
                return f"错误:不支持的类型 {type(expr)}"

            # 有效性检查
            if len(coeffs) < 1:
                return "错误:多项式次数必须至少为1"
            if isinstance(expr, (list, sp.Matrix)) and expr[0] != 1:
                return f"错误:列表/矩阵输入的首项必须为1,实际为 {expr[0]}"

            # 创建伴随矩阵
            n = len(coeffs)
            matrix = np.zeros((n, n), dtype=object)

            # 填充次对角线
            for i in range(n - 1):
                matrix[i + 1, i] = 1

            # 填充首行负系数
            matrix[0, :] = [-c for c in coeffs]

            return sp.Matrix(matrix)

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


    def main():
        """示例主函数,演示不同输入情况"""
        test_cases = [
            "[1, 2, 3]",
            # Matrix([[-1, -2, -3],
            #         [1, 0, 0],
            #         [0, 1, 0]])

            "Matrix([1, 5, 6])",
            # Matrix([[-1, -5, -6],
            #         [1, 0, 0],
            #         [0, 1, 0]])

            "4*x - x + 7",
            # Matrix([[-7/3]])
        ]

        for case in test_cases:
            print(f"测试输入: {case}")
            result = companion_matrix(case)
            print("输出结果:")
            print(result)
            print("=" * 50)


    if __name__ == "__main__":
        main()
    
    
    比较矩阵

    A = compar(B,k) 返回 B 的比较矩阵.

    对于 k = 0(默认值), 如果 i == j, 则 A(i,j) = abs(B(i,j)), 否则 A(i,j) = -abs(B(i,j)).

    对于 k = 1, A 将 B 的每个对角线元素替换为其绝对值, 并将每个非对角线元素替换为同一行中非对角线元素的最大绝对值的负值.

    如果 B 是三角矩阵,则 A = compar(B,1) 也是三角矩阵。

    B - 输入, 矩阵

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


    def compare_matrix(input_str):
        """
        生成比较矩阵,支持两种比较模式

        参数:
        input_str: 输入字符串,可以是以下形式:
                   - 矩阵字符串(如 "Matrix([[1, -2], [3, 4]])")
                   - 带参数的元组字符串(如 "(Matrix([[1,2],[3,4]]), 1)")

        返回:
        成功时返回SymPy矩阵,失败时返回错误信息字符串

        比较模式:
        - k=0: 对角线为绝对值,非对角线为负绝对值
        - k=1: 对角线为绝对值,非对角线为行最大负绝对值
        """
        try:
            expr = sp.sympify(input_str)

            def generate_comparison_matrix(B, k=0):
                """
                核心矩阵生成逻辑

                参数:
                B: 输入矩阵的NumPy数组形式
                k: 比较模式选择(0或1)
                """
                n, m = B.shape
                A = np.zeros_like(B, dtype=float)

                if k == 0:
                    # 模式0:直接绝对值处理
                    for i in range(n):
                        for j in range(m):
                            A[i, j] = abs(B[i, j]) if i == j else -abs(B[i, j])
                elif k == 1:
                    # 模式1:行最大绝对值处理
                    for i in range(n):
                        row = B[i]
                        # 获取当前行非对角线元素的最大绝对值
                        off_diag = np.delete(row, i) if i < len(row) else row
                        max_val = np.max(np.abs(off_diag))
                        for j in range(m):
                            A[i, j] = abs(row[j]) if i == j else -max_val
                else:
                    raise ValueError("参数k必须是0或1")
                return A

            # 输入类型处理
            if isinstance(expr, tuple) and len(expr) == 2:
                # 处理元组输入 (矩阵, k值)
                mat, k = expr
                sp_matrix = sp.Matrix(mat)
                if sp_matrix is None or not k.is_number:
                    return "错误:元组输入格式应为(矩阵, 数字)"
                np_matrix = np.array(sp_matrix, dtype=float)
                k_value = int(k.evalf())
                result = generate_comparison_matrix(np_matrix, k_value)
            else:
                # 处理单个矩阵输入(默认k=0)
                sp_matrix = sp.Matrix(expr)
                if sp_matrix is None:
                    return "错误:无法解析为有效矩阵"
                np_matrix = np.array(sp_matrix, dtype=float)
                result = generate_comparison_matrix(np_matrix)

            return sp.Matrix(result)

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


    def main():
        """示例主函数,演示不同输入情况"""
        test_cases = [
            "Matrix([[1, -2], [3, 4]])",
            # Matrix([[1.00000000000000, -2.00000000000000],
            #         [-3.00000000000000, 4.00000000000000]])

            "(Matrix([[2, -3], [5, 1]]), 0)",
            # Matrix([[2.00000000000000, -3.00000000000000],
            #         [-5.00000000000000, 1.00000000000000]])

            "(Matrix([[4, -1], [2, -5]]), 1)",
            # Matrix([[4.00000000000000, -1.00000000000000],
            #         [-2.00000000000000, 5.00000000000000]])

            "[1, 2, 3]",
            # Matrix([[1.00000000000000], [-2.00000000000000],
            #         [-3.00000000000000]])
        ]

        for case in test_cases:
            print(f"测试输入: {case}")
            result = compare_matrix(case)
            print("输出结果:")
            print(result)
            print("=" * 50)


    if __name__ == "__main__":
        main()
    
    
    复数列表图

    ComplexListPlot(list1,list2,...)将复数绘制在复平面(也称为阿干特图或高斯平面)上。在复平面中,x轴代表实部,y轴代表虚部。

    1. 信号处理 - 频域分析

    实际意义:在信号处理中,复数常用于表示不同频率成分的幅度和相位。这个图可以帮助工程师可视化信号的频谱特性。

    ComplexListPlot([1+2@i,-0.5+1@i,0.3-0.8@i,-1-1@i])

    2. 电路分析 - 阻抗计算

    实际意义:在电路分析中,阻抗是一个复数,实部代表电阻,虚部代表电抗。这个图可以显示电路在不同频率下的阻抗变化。

    ComplexListPlot([50,45+15@i,30+25@i,20+30@i,10+35@i])

    3. 控制系统 - 极点/零点分析

    实际意义:在控制系统中,极点和零点的位置决定了系统的稳定性和响应特性。这个图可以帮助工程师分析系统性能。

    ComplexListPlot([-2-2@i,-2+2@i,-1-1@i,-1+1@i],[0,1+1@i])

    4. 量子力学 - 波函数可视化

    实际意义:在量子力学中,波函数是复数函数,其模的平方表示概率密度。这个图可以直观显示量子态的概率分布。

    ComplexListPlot([0.7,0.5+0.5@i,-0.7@i,-0.5-0.5@i,-0.7])

    5. 数学变换 - 傅里叶系数

    实际意义:傅里叶变换将信号从时域转换到频域,产生复数系数。这个图可以帮助分析信号的频率成分。

    ComplexListPlot([3,1-2@i,-0.5+1@i,0.3+0.8@i,-0.2-0.5@i])
    
    复变函数绘图

    ComplexPlot(f(x)) 色相环复变函数图形是一种复变函数图形的呈现方式. 将色相表示函数值的辐角,明度表示函数值的绝对值来表达复变函数的定义域着色方法.

    通过复变函数图,抽象的复数运算转化为直观的几何模式, 在二维平面上呈现四维信息(输入实部、输入虚部、输出实部、输出虚部).

    x -- 复数域范围

        流体力学 - 理想流体绕圆柱流动:

        ComplexPlot(2*(1+1/x),x=[-4-4@i,4+4@i])

        调频信号分析:

        ComplexPlot(exp(1@i*0.8*x^2),x=[-3-3@i,3+3@i])

        量子隧穿效应:

        ComplexPlot(exp(-x^2/2),x=[-4-4@i,4+4@i])

        电磁场分布:

        ComplexPlot(1/x+1/(x-2),x=[-3-3@i,5+3@i])

        保角映射演示:

        ComplexPlot(log(x),x=[0.1-3@i,+3@i]

        电磁场分析(麦克斯韦方程):

        ComplexPlot(1/(x-1)+1/(x+1),x=[-3-3@i,3+3@i])

        流体动力学(纳维-斯托克斯方程)

        ComplexPlot(x+1/x,x=[-3-3@i,3+3@i])

        信号处理(傅里叶分析):

        ComplexPlot(exp(1@i*3x)*exp((-x^2)/2),x=[-4-4@i,4+4@i])

        先进可视化技术(3D混合呈现)

        ComplexPlot(abs(sin(x)),x=[-3-3@i,3+3@i])

    叠加复变函数图

    ComplexPlot(f1(x),f2(x)) 揭示函数间的关联性、对称性及系统级特性。

        量子纠缠态分析: 谐振子基态与第一激发态

        ComplexPlot(exp((-x^2)/2), x*exp((-x^2)/2),x=[-4-4@i,4+4@i])

        电磁波极化干涉: 正交偏振分量

        ComplexPlot(sin(2x),cos(2x),x=[-3-3@i,3+3@i])

        金融风险耦合模型: 市场波动率 + 黑天鹅事件概率

        ComplexPlot(log(x+2), exp(-x^2),x=[-2.5-2@i,2.5+2@i])

        声学驻波场合成: 基波+谐波+合成波

        ComplexPlot(sin(2x), cos(3x), sin(2x)+cos(3x),x=[-@pi-@pi*@i,@pi+@pi*@i])

        黎曼曲面研究: 不同分支平方根

        ComplexPlot(sqrt(x),x^0.5,x=[-2-2@i,2+2@i])

        非线性系统混沌预警: 迭代复杂度升级

        ComplexPlot(x, 2exp(x), 2exp(exp(x)),x=[-1-1@i,1+1@i])
    
    复变函数三维图

    ComplexPlot3D(f(x)) 色相环复变函数图形是一种复变函数图形的呈现方式. 将色相表示函数值的辐角,明度表示函数值的绝对值来表达复变函数的定义域着色方法.

    通过复变函数图,抽象的复数运算转化为直观的几何模式, 在二维平面上呈现四维信息(输入实部、输入虚部、输出实部、输出虚部).

    x -- 复数域范围

        流体力学 - 理想流体绕圆柱流动:

        ComplexPlot3D(2*(1+1/x),x=[-4-4@i,4+4@i])

        调频信号分析:

        ComplexPlot3D(exp(1@i*0.8*x^2),x=[-3-3@i,3+3@i])

        量子隧穿效应:

        ComplexPlot3D(exp(-x^2/2),x=[-4-4@i,4+4@i])

        电磁场分布:

        ComplexPlot3D(1/x+1/(x-2),x=[-3-3@i,5+3@i])

        保角映射演示:

        ComplexPlot3D(log(x),x=[0.1-3@i,+3@i]

        电磁场分析(麦克斯韦方程):

        ComplexPlot3D(1/(x-1)+1/(x+1),x=[-3-3@i,3+3@i])

        流体动力学(纳维-斯托克斯方程)

        ComplexPlot3D(x+1/x,x=[-3-3@i,3+3@i])

        信号处理(傅里叶分析):

        ComplexPlot3D(exp(1@i*3x)*exp((-x^2)/2),x=[-4-4@i,4+4@i])

        先进可视化技术(3D混合呈现)

        ComplexPlot3D(abs(sin(x)),x=[-3-3@i,3+3@i])

    叠加复变函数三维图

    ComplexPlot(f1(x),f2(x)) 揭示函数间的关联性、对称性及系统级特性。

        量子纠缠态分析: 谐振子基态与第一激发态

        ComplexPlot3D(exp((-x^2)/2), x*exp((-x^2)/2),x=[-4-4@i,4+4@i])

        电磁波极化干涉: 正交偏振分量

        ComplexPlot3D(sin(2x),cos(2x),x=[-3-3@i,3+3@i])

        金融风险耦合模型: 市场波动率 + 黑天鹅事件概率

        ComplexPlot3D(log(x+2), exp(-x^2),x=[-2.5-2@i,2.5+2@i])

        声学驻波场合成: 基波+谐波+合成波

        ComplexPlot3D(sin(2x), cos(3x), sin(2x)+cos(3x),x=[-@pi-@pi*@i,@pi+@pi*@i])

        黎曼曲面研究: 不同分支平方根

        ComplexPlot3D(sqrt(x),x^0.5,x=[-2-2@i,2+2@i])

        非线性系统混沌预警: 迭代复杂度升级

        ComplexPlot3D(x, 2exp(x), 2exp(exp(x)),x=[-1-1@i,1+1@i])
    
    复变函数的向量密度图

    ComplexVectorDensityPlot(f(z))

    箭头 (Arrows):表示函数 f(z) 本身的向量值,即物理场的向量属性(如速度、力场的方向和大小)。

    颜色/色相 (Color/Hue):表示从 f(z) 衍生出的某个标量函数 S(x, y) 的值,即物理场的标量属性(如势能、能量密度、压力等)。

    1:绕圆柱流动 (升级版)

    向量场图(箭头):流体的速度场。

    密度图(颜色):用颜色表示速度的模|f'(z)|。

    物理意义:这张图生动地展示了伯努利原理。

    高级应用:根据伯努利方程 P + 1/2 ρ v² = constant,流速快(亮黄色)的地方压力小,流速慢(深蓝色)的地方压力大。

    这张图因此也间接描绘了圆柱表面的压力分布,这对于计算物体所受的阻力(压差阻力)至关重要。

    ComplexVectorDensityPlot(10*(z+4/z),z=[-5-5@i,5+5@i])

    2 :电偶极子

    向量场图(箭头):电场强度 E 的方向。

    密度图(颜色):用颜色表示电场强度的模 |E| = |f'(z)|。

    物理意义:直观显示电场强度的衰减和集中情况。

    图中解读:

    在靠近原点(两个电荷非常接近的位置)的区域,颜色非常明亮,甚至发白,表示场强极其巨大。

    随着距离原点越远,颜色迅速变暗为蓝色,表示场强按距离的平方反比快速衰减。

    高级应用:可以非常清晰地看到哪些区域的电场可能强到足以击穿空气(发生放电现象),或者对带电粒子产生显著作用。

    ComplexVectorDensityPlot(1/z,z=[-5-5@i,5+5@i])

    3 :复杂势阱/势垒

    向量场图(箭头):代表了“力”的方向,粒子会沿着这个方向被推动。

    密度图(颜色):用颜色表示势函数 φ(x, y) = Re(z^2) = x² - y² 的值。

    物理意义:这可以模拟一个鞍点状的势能面。

    图中解读:

    沿着 y=0 (x轴) 方向,颜色梯度变化大,表示这是一个不稳定平衡点的路径:小球在原点处于平衡,但稍一扰动就会沿x轴加速滚下“势能山”。

    沿着 x=0 (y轴) 方向,颜色梯度变化也大,但方向相反,这表示这是一个稳定平衡点的路径:小球偏离原点后,会受到恢复力而被拉回。

    高级应用:在理论物理和化学中,这种图用于分析分子反应路径的过渡态。在机器学习中,它可以可视化损失函数的鞍点,帮助理解优化算法的困境。

    ComplexVectorDensityPlot(z^2,z=[-5-5@i,5+5@i])
    
    复变函数的向量场图

    ComplexVectorPlot(expression)将抽象的复数运算转化为直观的几何图形。

    1:恒等函数

    向量场图特征:在整个复平面上,每个点 z 上的向量就是 z 本身。这意味着向量从原点呈放射状向外,离原点越远,向量越长。

    物理意义:这可以解释为一个源(Source) 的流场。

    流体力学:想象复平面是一个水池,原点处有一个水龙头在不断注水。水从原点均匀地流向四面八方。每个点的向量代表了水流的速度和方向。

    静电学:原点处有一个正点电荷,向量代表正试探电荷在该点所受电场力的方向和大小。

    ComplexVectorPlot(z,z=[-5-5@i,5+5@i])

    2 :倒数函数

    向量场图特征:

    靠近原点:当 z 的模很小(接近原点)时,1/z 的模会非常大,向量又长又乱,原点是一个奇点。

    远离原点:当 z 的模很大时,1/z 的模很小,向量很短,指向原点。

    整体来看:场看起来像是从原点流出的流(源)和流入原点的流(汇)的结合。

    物理意义:这描述了一个源汇偶极子(Source-Sink Dipole) 的流场,但更标准的解释是:

    电磁学:它完美地描述了一个无限长直导线载有恒定电流时产生的磁场。导线垂直于复平面穿过原点,磁场线是围绕原点的同心圆。

           向量场图显示的就是磁感应强度的方向和大小。原点(奇点)就是导线所在的位置。

    ComplexVectorPlot(1/z,z=[-5-5@i,5+5@i])

    3 :平方函数

    向量场图特征:图像呈现出对称且复杂的模式。你会注意到在实轴和虚轴上,向量行为不同。

    物理意义:它可以近似地描述一种拐角流动。

    流体力学:想象流体在一个直角拐角处的流动。例如,河流冲过一个堤岸的直角拐弯,z^2 的向量场可以描述拐角附近流体的速度场。

    ComplexVectorPlot(z^2,z=[-5-5@i,5+5@i])

    4 :指数函数

    向量场图特征:沿着垂直的线(x 为常数),所有向量的长度都相同。沿着水平的线(y 为常数),所有向量的方向都相同。图像呈现明显的周期性(沿垂直方向)。

    物理意义:这可以描述一种周期性源或平面波。

    波动物理:它可以表示一个沿水平方向传播的波,其振幅随 x 增大(或减小)而指数增长(或衰减)。

    ComplexVectorPlot(exp(z),z=[-5-5@i,5+5@i])

    5 :理想流体绕圆柱体的流动

    这是流体力学中的一个经典模型,描述了风或水流绕过桥墩、圆柱形建筑等障碍物的流动情况。

    这里,10 代表远处来流的速度 U₀ = 10 m/s。

    4 是圆柱半径 R 的平方,即 R = 2 m。

    向量场图意义:

    这个向量场图表示的是流体的速度场。

    在远离原点 (|z| 很大) 的区域,向量是几乎水平向右的,大小为 10,代表均匀的来流。

    在圆柱表面 (|z| = 2) 附近,向量方向发生改变,与圆柱表面相切,这符合流体不能穿透固体的边界条件。

    在圆柱的正上方和正下方,流速会加快;在圆柱的前后驻点,流速会降为 0。

    物理应用:

    用于计算桥梁墩柱、潜艇潜望镜、烟囱等结构所受的流体作用力。

    ComplexVectorPlot(10*(z+4/z),z=[-5-5@i,5+5@i])

    6 :电偶极子的电场

    这个函数是电偶极子场的一种简化表示(更精确的表达式是 f(z) = p / z,其中 p 是偶极矩)。这里的常数 1 隐含了偶极矩的强度。

    向量场图意义:

    这个向量场图表示的是电场强度向量场。

    向量从正电荷(可理解为位于原点左侧很近的位置)出发,指向负电荷(位于原点右侧很近的位置)。

    场图呈现出典型的偶极子特征:在原点附近场强最大,随着距离增加而衰减;场线从正电荷发出,汇聚于负电荷。

    物理应用:

    分析分子(如水分子)的极性、无线电天线辐射、以及任何涉及分离正负电荷的系统。

    ComplexVectorPlot(1/z,z=[-5-5@i,5+5@i])

    7 :点涡与点汇的叠加流动 (浴缸排水)

    这个例子模拟了一个更真实的场景:流体在旋转中流向一个排水口。

    -2 * Ln(z):代表一个汇(排水口),强度为 2 m³/s。负号表示流体是流入的。

    -5i * Ln(z):代表一个点涡,强度为 5 m²/s。-i 决定了旋转方向为顺时针。

    向量场图意义:

    这个向量场是上述两个场的线性叠加,表示流体的速度场。

    向量场呈现出螺旋状的轨迹,流体一边绕原点顺时针旋转,一边流向中心被排出。

    越靠近中心(排水口),流速越大,旋转的角速度也越大。

    物理应用:

    直观地模拟和解释浴缸或水槽排水时形成的漩涡、大气中的气旋或龙卷风(虽然是非常简化的模型)的核心流动特征。

    ComplexVectorPlot((-2-5@i)*ln(z),z=[-5-5@i,5+5@i])

    8 :均匀流绕过圆柱并有环量(产生升力)

    它解释了飞机机翼产生升力的原理(库塔-茹科夫斯基定理)

    8 * (z + 4/z):是速度为 8 m/s 的均匀流绕过半径为 2 m (R²=4) 的圆柱。

    + (15i / (2*π)) * Ln(z):这是在流场上叠加了一个点涡,环量强度为 15 m²/s。这个环量使得圆柱上下表面的流速不对称。

    向量场图意义:

    向量场图显示了叠加环量后的流体速度场。

    由于环量的加入,圆柱上表面的流速显著大于下表面的流速。

    根据伯努利原理,上表面压力小,下表面压力大,从而产生一个向上的净力,即升力。

    物理应用:

    这是空气动力学的基础。通过这个模型,可以理解为什么机翼的上表面要做成弯曲的(相当于增加了环量),从而产生使飞机上升的力。该理论直接应用于机翼和涡轮叶片的设计。

    ComplexVectorPlot(8*(z+4/z)+(15@i/(2@pi))*ln(z),z=[-5-5@i,5+5@i])
    
    合并函数

    compose(f,g)返回f(g(y)),其中f=f(x)和g=g(y).这里x是由symvar定义的f的符号变量,y是由symfar定义的g的符号变量.

    compose(f,g,z)返回f(g(z)),其中f=f(x),g=g(y),x和y是symvar定义的f和g的符号变量.

    compose(f,g,x,z)返回f(g(z)),并使x成为f的自变量.也就是说,如果f=cos(x/t),则compose(f,g,x,z)返回cos(g(z)/t),而compose(f,g,t,z)则返回cos(x/g(z)).

    compose(f,g,x,y,z)返回f(g(z)),并使x成为f的自变量,使y成为g的自变量.对于f=cos(x/t)和g=sin(y/u),compose(f,g,x,y,z)返回cos(sin(z/u)/t)而compose(f,g,x,u,z)则返回cos(sin/z)/t.

    f —— 输入,符号功能,符号表达

    g —— 输入,符号功能,符号表达

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


    def composition_function(input_str):
        """
        函数组合工具,支持多种组合方式

        参数:
        input_str: 输入字符串,支持以下形式:
                   - 二元组: (f, g) → f∘g
                   - 三元组: (f, g, t) → f∘g(t)
                   - 四元组: (h, g, x, z) → h(x, g(z))
                   - 五元组: (h, p, x, y, z) → h(p(x,z), z)

        返回:
        成功时返回组合后的表达式,失败时返回错误信息

        特点:
        - 自动符号检测
        - 动态参数处理
        - 增强的错误处理
        """
        try:
            expr = sp.sympify(input_str, evaluate=False)

            def validate_symbols(*symbols):
                """验证符号是否有效"""
                return all(s.free_symbols for s in symbols)

            def compose_basic(f, g):
                """
                基本函数组合 f(g)

                参数:
                f: 外部函数
                g: 内部函数

                逻辑:
                1. 获取f的第一个自由变量
                2. 用g替换该变量
                """
                f_vars = list(f.free_symbols)
                if not f_vars:
                    raise ValueError("函数f没有自由变量")
                return f.subs(f_vars[0], g)

            def compose_with_param(f, g, t):
                """
                带参数的函数组合 f(g(t))

                参数:
                t: 新引入的参数符号
                """
                g_vars = list(g.free_symbols)
                if not g_vars:
                    raise ValueError("函数g没有自由变量")
                substituted_g = g.subs(g_vars[0], t)
                return compose_basic(f, substituted_g)

            def compose_multivar(h, g, x, z):
                """
                多变量函数组合 h(x, g(z))

                参数:
                x: 保留的变量
                z: 新变量
                """
                g_vars = list(g.free_symbols)
                if not g_vars:
                    raise ValueError("函数g没有自由变量")
                substituted_g = g.subs(g_vars[0], z)
                return h.subs(x, substituted_g)

            def compose_nested(h, p, x, y, z):
                """
                嵌套组合 h(p(x,z), z)

                参数:
                y: 需要替换的变量
                """
                substituted_p = p.subs(y, z)
                return h.subs(x, substituted_p)

            # 输入分派逻辑
            if isinstance(expr, tuple):
                params = expr
                if len(params) == 2:
                    if not validate_symbols(*params):
                        raise TypeError("参数必须包含符号变量")
                    return compose_basic(*params)

                elif len(params) == 3:
                    if not validate_symbols(params[0], params[1]) or not params[2].is_Symbol:
                        raise TypeError("第三个参数必须是符号")
                    return compose_with_param(*params)

                elif len(params) == 4:
                    if not all(s.is_Symbol for s in params[2:]):
                        raise TypeError("后两个参数必须是符号")
                    return compose_multivar(*params)

                elif len(params) == 5:
                    if not all(s.is_Symbol for s in params[2:]):
                        raise TypeError("后三个参数必须是符号")
                    return compose_nested(*params)

                else:
                    raise ValueError("不支持的参数数量,应为2-5个")

            raise TypeError("输入必须是元组形式")

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


    def main():
        """示例主函数"""
        # 定义常用符号
        x, y, z, t = symbols('x y z t')

        test_cases = [
            # 基础组合测试
            "(1/(1+x^2),sin(y))",
            # 1/(sin(y)**2 + 1)

            "(x**2, cos(y), t)",
            # cos(t)**2

            # 多变量组合测试
            "(x+y, y**2, y, z)",
            # x + z**2

            # 嵌套组合测试
            "(x+y*z, y+z, x, y, z)",
            # y*z + 2*z
        ]

        for case in test_cases:
            print(f"测试输入: {case}")
            result = composition_function(case)
            print("输出结果:")
            print(result)
            print("=" * 50)


    if __name__ == "__main__":
        main()
    
    
    逆运算的条件数

    C = cond(A) 返回 2-范数逆运算的条件数,等于A的最大奇异值与最小奇异值之比.

    C = cond(A,p) 返回 p-范数条件数,其中p可以是1,2,In 或'fro'.

    A是输入矩阵

    p — 范数类型:2(默认),1,'fro',Inf
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np


    def condition_number_of_matrix(input_str):
        """
        计算矩阵的条件数,支持指定范数类型

        参数:
        input_str: 输入字符串,可以是以下形式:
           - 矩阵列表:例如 '[[1, 2], [3, 4]]'
           - 包含矩阵和范数的元组:例如 '([[1, 2], [3, 4]], 1)'
             (支持的范数:1, 2, np.inf等,符号无穷大用'oo'表示)

        返回:
        计算结果字符串或错误信息
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 处理包含矩阵和范数的元组输入(例如'([[1,2],[3,4]], 1)')
            if isinstance(expr, tuple) and len(expr) == 2:
                matrix_part = expr[0]
                p_part = expr[1]

                # 转换矩阵部分
                sym_matrix = sp.Matrix(matrix_part)
                if sym_matrix is None:
                    return f"错误:无法解析矩阵部分 {matrix_part}"

                # 转换范数参数
                try:
                    if p_part.is_integer:
                        p = int(p_part)
                    else:
                        p = float(p_part.evalf())
                except Exception as e:
                    return f"错误:无效的范数参数 {p_part} ({e})"

                # 计算条件数
                try:
                    A = np.array(sym_matrix, dtype=float)
                    result = np.linalg.cond(A, p=p)
                except Exception as e:
                    return f"数值计算错误: {e}"

            # 处理普通矩阵输入
            elif isinstance(expr, list):
                sym_matrix = sp.Matrix(expr)
                if sym_matrix is not None:
                    try:
                        A = np.array(sym_matrix, dtype=float)
                        result = np.linalg.cond(A)
                    except Exception as e:
                        return f"数值计算错误: {e}"
                else:
                    error = True

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

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


    def main():
        """主函数,提供测试案例"""
        test_cases = [
            "[[1, 0],[0,1]]",
            # 结果: 1.0

            "([[1, 2], [3, 4]], 1)",
            # 结果: 20.999999999999993

            "([[1, 2], [3, 4]], oo)",
            # 结果: 20.999999999999993

            "[[2, 0], [0, 0.5]]",
            # 结果: 4.0

            "[1, 2, 3]",
            # 结果: 1.0

            "([[1, 2]], 2)",
            # 结果: 1.0
        ]

        for case in test_cases:
            print(f"测试案例: {case}")
            result = condition_number_of_matrix(case)
            print(f"结果: {result}\n{'-' * 40}")


    if __name__ == "__main__":
        main()
    
    
    与特征值有关的条件数

    c = condeig(A) 返回由A的特征值的条件数构成的向量. 这些条件数是左特征向量和右特征向量之间角度的余弦的倒数.

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


    def condeig(A):
        """
        计算矩阵特征值的条件数(基于左右特征向量夹角)

        参数:
        A: numpy数组形式的方阵

        返回:
        cond_numbers: 各特征值的条件数数组

        算法说明:
        1. 计算左右特征向量
        2. 归一化特征向量
        3. 计算左右特征向量夹角的余弦值
        4. 条件数为余弦值的倒数
        """
        # 检查是否为方阵
        if A.shape[0] != A.shape[1]:
            raise ValueError("输入矩阵必须是方阵")

        # 计算左右特征向量
        w, vl, vr = eig(A, left=True, right=True)

        # 归一化处理 (按列向量归一化)
        vl_norm = np.linalg.norm(vl, axis=0)
        vr_norm = np.linalg.norm(vr, axis=0)

        # 计算余弦值并避免除以零
        with np.errstate(divide='ignore', invalid='ignore'):
            cosines = np.abs(np.sum(vl * vr, axis=0) / (vl_norm * vr_norm))
            cosines = np.where(cosines < 1e-12, np.nan, cosines)  # 处理极小值

        # 计算条件数
        cond_numbers = 1.0 / cosines
        return cond_numbers


    def condition_number_eigenvalues(input_str):
        """
        计算矩阵特征值条件数的入口函数

        参数:
        input_str: 字符串形式的矩阵输入,例如:
                   - "[[1, 2], [3, 4]]"
                   - "[[1, 0], [0, 1]]"

        返回:
        计算结果字符串或错误信息
        """
        try:
            expr = sp.sympify(input_str)

            # 处理元组输入(本函数不支持参数)
            if isinstance(expr, tuple):
                return "错误:不支持带参数的输入格式"

            # 转换为矩阵
            sym_matrix = sp.Matrix(expr)
            if sym_matrix is None:
                return f"错误:无法解析矩阵 {input_str}"

            # 检查矩阵维度
            if sym_matrix.shape[1] == 1:
                return "错误:输入是向量不是矩阵"
            if not sym_matrix.is_square:
                return "错误:矩阵必须是方阵"

            # 转换为numpy数组
            try:
                A = np.array(sym_matrix, dtype=float)
            except TypeError as e:
                return f"类型错误:矩阵包含非数值元素 ({e})"

            # 计算条件数
            try:
                cond_numbers = condeig(A)
                return cond_numbers
            except Exception as e:
                return f"计算错误:{str(e)}"

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


    def main():
        """测试案例主函数"""
        test_cases = [
            "[[1, 0], [0, 1]]",
            # 特征值条件数: [1. 1.]

            "[[2, 1], [1, 2]]",
            # 特征值条件数: [1. 1.]

            "[[1, 2], [3, 4]]",
            # 特征值条件数: [1.015 1.015]
        ]

        for case in test_cases:
            print(f"测试案例: {case}")
            result = condition_number_eigenvalues(case)
            if isinstance(result, np.ndarray):
                print("特征值条件数:", np.round(result, 4))
            else:
                print("结果:", result)
            print("-" * 60)


    if __name__ == "__main__":
        main()
    
    
    1-范数条件数估计

    c = condest(A) 计算方阵 A 的 1-范数条件数的下限 c.

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


    def condition_one_normest(input_str):
        """
        估算矩阵的 1-范数条件数 (κ₁(A) = ||A||₁ * ||A⁻¹||₁)

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

        返回:
        数值类型的条件数估计值,或包含错误信息的字符串
        """
        try:
            # 将字符串转换为 SymPy 表达式
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 排除元组类型输入
            if isinstance(expr, tuple):
                error = True
            # 检查是否为有效矩阵
            elif isinstance(expr, list):
                # 将 SymPy 矩阵转换为 NumPy 数组
                a = sp.Matrix(expr)
                # 验证矩阵是否为方阵
                if not a.is_square:
                    raise ValueError("矩阵必须是方阵")

                A = np.array(expr, dtype=float)

                # 计算矩阵的 1-范数
                norm_A = onenormest(A)

                # 计算矩阵的逆
                A_inv = inv(A)

                # 计算逆矩阵的 1-范数
                norm_inv_A = onenormest(A_inv)

                # 计算条件数
                result = norm_A * norm_inv_A
            else:
                error = True

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

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


    def main():
        """主函数用于演示条件数计算功能"""
        test_cases = [
            ("[[1, 2], [3, 4]]", "2x2 矩阵"),
            # 结果: 20.999999999999993

            ("[[1, 0], [0, 1]]", "单位矩阵"),
            # 结果: 1.0
        ]

        for input_str, description in test_cases:
            print(f"测试案例: {description}")
            print(f"输入: {input_str}")
            output = condition_one_normest(input_str)
            print(f"结果: {output}\n{'-' * 40}")


    if __name__ == "__main__":
        main()
    
    
    矩阵条件数估计量的反例

    A = condex(n,k) 返回条件数估计量的反例矩阵. 它采用标量参数alpha(默认值为 100), 并返回大小为 n×n 的矩阵.

    k = 1, 4×4, LINPACK 的 RCOND 的反例

    k = 2, 3×3, LINPACK 的 RCOND 的反例

    k = 3, 任意, LINPACK 的 RCOND 的反例(独立于 alpha)

    k = 4, n>=4, LINPACK 的 RCOND 的反例(它是作为反例的该矩阵的逆矩阵)

    如果 n 不等于该矩阵的实际大小,则为该矩阵补上单位矩阵以构成 n 阶

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


    def condex_matrix(input_str):
        """
        根据输入的字符串生成特定类型的矩阵,用于条件数估计示例。

        参数:
        input_str:输入的字符串,可以是单个整数n,或元组(n, k),其中k指定矩阵类型。

        返回:
        sympy矩阵对象,或错误信息字符串。

        支持的k值:
        1 - 对称对角线主导矩阵
        2 - 三对角矩阵
        3 - 随机对称矩阵
        4 - 稀疏矩阵
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            def evaluation_condex_matrix(n, k, alpha=100):
                """
                根据参数生成特定类型的矩阵。

                参数:
                n:矩阵的维度(正整数)
                k:矩阵类型(1-4)
                alpha:某些矩阵类型的参数,默认为100

                返回:
                生成的numpy数组

                异常:
                当n <= 0或k不在1-4时抛出ValueError
                """
                # 检查参数有效性
                if n <= 0:
                    raise ValueError("n必须是正整数")
                if k not in [1, 2, 3, 4]:
                    raise ValueError("k必须是1, 2, 3, 或4")

                # 根据k值生成不同类型的矩阵
                if k == 1:
                    # 生成对称对角线主导矩阵
                    A = np.eye(n) + alpha * np.random.randn(n, n)
                    A = (A + A.T) / 2  # 确保对称性

                elif k == 2:
                    # 生成三对角矩阵
                    A = np.zeros((n, n))
                    for i in range(n):
                        A[i, i] = alpha  # 对角线元素
                        if i > 0:
                            A[i, i - 1] = -1  # 下对角线
                        if i < n - 1:
                            A[i, i + 1] = -1  # 上对角线

                elif k == 3:
                    # 生成随机对称矩阵
                    A = np.random.randn(n, n)
                    A = (A + A.T) / 2  # 确保对称性

                elif k == 4:
                    # 生成稀疏矩阵(对角线+随机稀疏非对角元素)
                    A = np.zeros((n, n))
                    for i in range(n):
                        A[i, i] = alpha  # 对角线元素
                    # 添加随机稀疏非对角元素
                    num_nonzero = n // 2  # 非零元素数量
                    for _ in range(num_nonzero):
                        i, j = np.random.randint(0, n, 2)
                        if i != j:
                            A[i, j] = np.random.randn()

                return A

            # 解析输入并生成矩阵
            if isinstance(expr, tuple) and len(expr) == 2:
                # 处理元组输入 (n, k)
                n_arg, k_arg = expr
                if n_arg.is_integer and k_arg.is_integer:
                    n = int(n_arg)
                    k = int(k_arg)
                    result = evaluation_condex_matrix(n, k)
                else:
                    error = True
            elif expr.is_integer:
                # 处理单个整数输入n(默认k=4)
                n = int(expr)
                result = evaluation_condex_matrix(n, k=4)
            else:
                error = True

            # 返回结果或错误信息
            if not error and result is not None:
                return sp.Matrix(result)
            else:
                return f"输入错误: {input_str}。请输入有效参数,例如'(3,1)'或'4'。"

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


    def main():
        """主函数,用于演示condex_matrix的使用"""
        test_cases = [
            "(3, 1)",
            # 生成的矩阵:
            # Matrix([[-34.1231710201152, -63.4008303741496, -123.327367608754],
            #         [-63.4008303741496, 52.2264963291183, 45.3067107040908],
            #         [-123.327367608754, 45.3067107040908, -191.364761590595]])


            "4",
            # Matrix([[100.000000000000, 0, -0.798603421207217, 0],
            #         [0, 100.000000000000, 0, 0],
            #         [0, -0.0429322800916667, 100.000000000000, 0],
            #         [0, 0, 0, 100.000000000000]])

            "(2, 2)",
            # Matrix([[100.000000000000, -1.00000000000000],
            #         [-1.00000000000000, 100.000000000000]])
        ]

        for case in test_cases:
            print(f"输入:{case}")
            result = condex_matrix(case)
            if isinstance(result, sp.Matrix):
                print("生成的矩阵:")
                print(result)
            else:
                print(f"结果:{result}")
            print("-" * 40)


    if __name__ == "__main__":
        main()
    
    
    复共轭

    Zc = conj(Z) 返回 Z 中每个元素的复共轭.

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


    def conjugate_number(input_str):
        """
        计算输入表达式的复共轭。
        支持单个数值复数和非符号矩阵的复共轭计算。

        参数:
        input_str (str): 输入的表达式字符串

        返回:
        sp.Expr 或 str: 如果输入有效,返回复共轭结果;否则返回错误信息。
        """
        try:
            # 修正输入表达式
            # 将输入字符串转换为 SymPy 表达式
            expr = sp.sympify(input_str)
            error = False
            result = None

            if expr.free_symbols:
                result = sp.conjugate(expr)
            # 检查输入是否为单个数值
            elif expr.is_number:
                # 计算单个数值的复共轭
                z = complex(expr)
                result = np.conj(z)
            else:
                # 其他情况标记为错误
                error = True

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

        except Exception as e:
            # 捕获异常并返回错误信息
            return f"错误: {e}"


    def main():
        """
        入口函数,包含示范代码。
        """
        # 示范 1: 单个复数的复共轭
        input_str1 = "3 + 4j"
        result1 = conjugate_number(input_str1)
        print(f"示范 1 输入: {input_str1}")
        print(f"示范 1 结果: {result1}")
        # (3-4j)

        # 示范 2: 非符号矩阵的复共轭
        input_str2 = "x+y"
        result2 = conjugate_number(input_str2)
        print(f"示范 2 输入: {input_str2}")
        print(f"示范 2 结果: {result2}")
        # conjugate(x) + conjugate(y)

        # 示范 3: 错误输入(符号矩阵)
        x, y = sp.symbols('x y')
        input_str3 = f"Matrix([[x + y*I, 1], [2, 3]])"
        result3 = conjugate_number(input_str3)
        print(f"示范 3 输入: {input_str3}")
        print(f"示范 3 结果: {result3}")
        # Matrix([[conjugate(x) - I*conjugate(y), 1],
        #         [2, 3]])


    if __name__ == "__main__":
        main()
    
    
    等值线图

    ContourPlot(expression1)把三维曲面(z = f(x, y))投影到二维平面(x-y 平面)上的可视化方法。

    通过等值线及其疏密程度来揭示函数值(高度、压力、温度、浓度、损失值等)在二维区域上的分布模式、变化趋势、极值位置和梯度信息。它是在众多领域分析空间数据的强大工具。

    1. 电磁场强度(偶极子天线)

    物理意义: 模拟偶极子天线的辐射场分布

    等值线特征: 同心圆环(距离衰减)叠加辐射状花瓣(角度调制),零值线呈十字形。

    ContourPlot(cos(theta)*sin(2@pi*r)/(r^2),theta=[0,2@pi],r=[0.1,5])

    2. 飓风气压场

    物理意义:

    第一项:背景气压

    第二项:飓风中心低压(随距离衰减)

    第三项:不对称性(模拟移动方向的影响)

    等值线特征: 偏心闭合圆环,低压中心附近等压线密集。

    ContourPlot(1013-100/(1+(r/50)^2)+0.2*r*cos(theta-0.25*@pi),theta=[0,2@pi],r=[0,500])

    3. 量子力学概率密度(2p轨道)

    物理意义: 氢原子2pₓ轨道的电子概率密度

    等值线特征: 双泪滴状结构,沿x轴对称,节线(零值)在y轴。

    ContourPlot(r*cos(theta)*exp(-r/2),theta=[0,2@pi],r=[0,10])

    4. 地震应力波干涉

    物理意义:

    第一项:断层方向性应力(矩形波干涉)

    第二项:震源发出的球面波

    等值线特征: 网格状条纹叠加同心圆环,交点处形成应力集中区。

    ContourPlot(sin(2x)*cos(3y)+0.5*sin(5*sqrt(x^2+y^2)),x=[-5,5],y=[-5,5])

    5. 海面温度分布(厄尔尼诺现象)

    等值线特征: 带状分布(纬度效应)叠加波浪形扰动(经度效应)。

    ContourPlot(25+5*cos(2@pi*lambd)-2*exp(-(phi/30)^2)+3*sin(4*phi)*cos(6*@pi*lambd),phi=[-60,60],lambd=[0,1])

    6. 化学反应浓度场

    物理意义:

    第一项:反应物扩散(中心浓度最高)

    第二项:对流扰动(沿x方向周期性输运)

    等值线特征: 中心圆形等值线被正弦波状条纹扭曲,形成"靶心+波纹"图案。

    ContourPlot(1/(1+x^2+y^2)+0.3*sin(3x)*exp(-y^2),x=[-4,4],y=[-4,4])

    7. 引力透镜效应

    物理意义:

    分母:爱因斯坦环附近的光强增强

    cos(4theta): 非对称透镜(如椭圆星系)造成的四重像

    等值线特征:四个高亮弧区对称分布,临界半径处等值线密集。

    ContourPlot((1/abs(1-(2/r)^2))*cos(4*theta),theta=[0,2@pi],r=[2.1,10])

    8. 绘制拉压分界线 (σ_θθ == 0)

    这条线是环向应力从拉伸(正)变为压缩(负)的边界

    物理意义与解读: 这条 σ_θθ == 0 的线会出现在 θ=0° 和 180° 附近的一个特定半径上。

    它清晰地告诉我们,在孔的侧方,压应力区仅限于孔边附近的一个小范围内,超出这个边界,环向应力又变回拉应力。

    ContourPlot(50*((1+25/r^2)-(1+1875/r^4)*cos(2theta))==0,theta=[0,2@pi],r=[5,15])

    9. 波动物理学:二维驻波模式

    cos(x) + cos(y) == 1/2 的等值线:这条线标识出了在这个二维驻波场中,振幅(或能量)恰好等于特定值(1/2)的所有位置。

    ContourPlot(cos(x)+cos(y)==1/2,x=[0,4@pi],y=[0,4@pi])

    叠加等值线图

    ContourPlot(expression1,expression2)揭示两个变量函数在同一参数空间中的关系、相互作用或权衡。

    示例 1:无线通信的信号优化

    场景:设计天线阵列时需同时最小化干扰能量 f(x,y)f(x,y) 和最大化信号强度 g(x,y)g(x,y)。

    ContourPlot(5*(cos(x)-0.2*sin(y))^2+5*(-0.2*cos(x)+sin(y))^2,cos((x^2+y^2))*exp(-(x^2+y^2)/10),x=[0,2@pi],y=[0,2@pi])

    示例 2:化学反应器的温度-压力控制

    场景:优化反应条件使副产物生成(ff)最小化,同时主产物产率(gg)最大化。

    ContourPlot(5.2*(cos(x)^2+sin(y)^2)-4*cos(x)*sin(y),cos((x^2+y^2))*exp(-(x^2+y^2)/10),x=[0,2@pi],y=[0,2@pi])

    示例 3:地形分析与水资源规划

    高程谷底(f1低值区)与集水高峰(f2高值区)在(±1.2, ±0.8)重叠 → 理想坝

    ContourPlot(1000*exp(-(x^2+y^2)/5)+500*sin(2x)*cos(y),50*(1+0.7*cos(1.5x)*sin(1.2y))*sech((x^2+y^2)/4),x=[-3,3],y=[-3,3])"

    示例 4:金融投资组合优化

    # 组合波动率 (风险)
    risk: sqrt(0.2x^2+0.5y^2-0.3x*y

    # 预期收益率
    return: 0.08x+0.12y-0.02x*y

    risk等值线呈椭圆状,return为斜直线

    切点(x≈0.4,y≈0.3)是有效前沿上的最优解

    ContourPlot(sqrt(0.2x^2+0.5y^2-0.3x*y),0.08x+0.12y-0.02x*y,x=[0,1],y=[0,1])

    示例 5:材料科学 - 合金性能

    # 硬度函数:在(0,0)处有尖峰
    600*exp(-2*(x^2+y^2))+200*abs(sin(3x)*cos(2y))

    # 延展性函数:在角落处较高
    25-5x^2-7y^2+3*sin(@pi*x*y)

    ContourPlot(600*exp(-2*(x^2+y^2))+200*abs(sin(3x)*cos(2y)),25-5x^2-7y^2+3*sin(@pi*x*y),x=[-1.5,1.5],y=[-1.5,1.5])

    示例 6:光学透镜设计

    # 像差函数:离轴误差
    5*(x^2+1.5*y^2)+2*x*y*cos(4*sqrt(x^2+y^2))

    # 聚焦强度:中心峰值
    exp(-(x^2+y^2)/2)*sinc(3x)*sinc(3y)

    ContourPlot(5*(x^2+1.5*y^2)+2*x*y*cos(4*sqrt(x^2+y^2)),exp(-(x^2+y^2)/2)*sinc(3x)*sinc(3y),x=[-1,1],y=[-1,1])

    示例 7:生态位竞争模型

    # 物种A适应性:偏好负x区域
    8-(x+1)^2-0.5*y^2

    # 物种B适应性:偏好正y区域
    7-0.8*x^2-(y-1)^2

    ContourPlot(8-(x+1)^2-0.5*y^2,7-0.8*x^2-(y-1)^2,x=[-3,3],y=[-2,2])

    示例 8:化学反应优化

    # 主产物产率:振荡响应曲面
    (0.7+0.3*cos(2*@pi*x))*(0.6+0.4*sin(2*@pi*y))

    # 副产物生成率:高温高压促进
    0.2x+0.3y+0.1x*y

    ContourPlot((0.7+0.3*cos(2*@pi*x))*(0.6+0.4*sin(2*@pi*y)),0.2x+0.3y+0.1x*y,x=[0,1],y=[0,1])

    示例 9:无线通信调度

    # 信道干扰函数
    1.5+0.5*cos(4x)+0.5*sin(4y)

    # 信号质量函数
    exp(-((x-1)^2+(y-1)^2)/2)+0.3*exp(-((x+1)^2+(y+1)^2)/2)

    ContourPlot(1.5+0.5*cos(4x)+0.5*sin(4y),exp(-((x-1)^2+(y-1)^2)/2)+0.3*exp(-((x+1)^2+(y+1)^2)/2),x=[-2,2],y=[-2,2])

    示例 10: 分析房间或音乐厅中的声学驻波模式(简正模式)

    在矩形房间中,|sin(x)sin(y)| = 0.5 可能对应固定边界下的声压分布,而 |cos(x)cos(y)| = 0.5 可能对应自由边界下的分布。

    这有助于优化扬声器和麦克风的放置,以避免驻波导致的音质问题或找到最佳听音位置。

    ContourPlot(abs(cos(x)*cos(y))==0.5,abs(sin(x)*sin(y))==0.5,x=[-3,3],y=[-3,3])
    
    极坐标等值线图

    ContourPolarPlot(expression1)把三维曲面(z = f(x, y))投影到二维平面(x-y 平面)上的可视化方法。

    通过等值线及其疏密程度来揭示函数值(高度、压力、温度、浓度、损失值等)在二维区域上的分布模式、变化趋势、极值位置和梯度信息。它是在众多领域分析空间数据的强大工具。

    1. 电磁场强度(偶极子天线)

    物理意义: 模拟偶极子天线的辐射场分布

    等值线特征: 同心圆环(距离衰减)叠加辐射状花瓣(角度调制),零值线呈十字形。

    ContourPolarPlot(cos(theta)*sin(2@pi*r)/(r^2),theta=[0,2@pi],r=[0.1,5])

    2. 飓风气压场

    物理意义:

    第一项:背景气压

    第二项:飓风中心低压(随距离衰减)

    第三项:不对称性(模拟移动方向的影响)

    等值线特征: 偏心闭合圆环,低压中心附近等压线密集。

    ContourPolarPlot(1013-100/(1+(r/50)^2)+0.2*r*cos(theta-0.25*@pi),theta=[0,2@pi],r=[0,500])

    3. 量子力学概率密度(2p轨道)

    物理意义: 氢原子2pₓ轨道的电子概率密度

    等值线特征: 双泪滴状结构,沿x轴对称,节线(零值)在y轴。

    ContourPolarPlot(r*cos(theta)*exp(-r/2),theta=[0,2@pi],r=[0,10])

    4. 地震应力波干涉

    物理意义:

    第一项:断层方向性应力(矩形波干涉)

    第二项:震源发出的球面波

    等值线特征: 网格状条纹叠加同心圆环,交点处形成应力集中区。

    ContourPolarPlot(sin(2x)*cos(3y)+0.5*sin(5*sqrt(x^2+y^2)),x=[-5,5],y=[-5,5])

    5. 海面温度分布(厄尔尼诺现象)

    等值线特征: 带状分布(纬度效应)叠加波浪形扰动(经度效应)。

    ContourPolarPlot(25+5*cos(2@pi*lambd)-2*exp(-(phi/30)^2)+3*sin(4*phi)*cos(6*@pi*lambd),phi=[-60,60],lambd=[0,1])

    6. 化学反应浓度场

    物理意义:

    第一项:反应物扩散(中心浓度最高)

    第二项:对流扰动(沿x方向周期性输运)

    等值线特征: 中心圆形等值线被正弦波状条纹扭曲,形成"靶心+波纹"图案。

    ContourPolarPlot(1/(1+x^2+y^2)+0.3*sin(3x)*exp(-y^2),x=[-4,4],y=[-4,4])

    7. 引力透镜效应

    物理意义:

    分母:爱因斯坦环附近的光强增强

    cos(4theta): 非对称透镜(如椭圆星系)造成的四重像

    等值线特征:四个高亮弧区对称分布,临界半径处等值线密集。

    ContourPolarPlot((1/abs(1-(2/r)^2))*cos(4*theta),theta=[0,2@pi],r=[2.1,10])

    极坐标叠加等值线图

    ContourPolarPlot(expression1,expression2)揭示两个变量函数在同一参数空间中的关系、相互作用或权衡。

    示例 1:无线通信的信号优化

    场景:设计天线阵列时需同时最小化干扰能量 f(x,y)f(x,y) 和最大化信号强度 g(x,y)g(x,y)。

    ContourPolarPlot(5*(cos(x)-0.2*sin(y))^2+5*(-0.2*cos(x)+sin(y))^2,cos((x^2+y^2))*exp(-(x^2+y^2)/10),x=[0,2@pi],y=[0,2@pi])

    示例 2:化学反应器的温度-压力控制

    场景:优化反应条件使副产物生成(ff)最小化,同时主产物产率(gg)最大化。

    ContourPolarPlot(5.2*(cos(x)^2+sin(y)^2)-4*cos(x)*sin(y),cos((x^2+y^2))*exp(-(x^2+y^2)/10),x=[0,2@pi],y=[0,2@pi])

    示例 3:地形分析与水资源规划

    高程谷底(f1低值区)与集水高峰(f2高值区)在(±1.2, ±0.8)重叠 → 理想坝

    ContourPolarPlot(1000*exp(-(x^2+y^2)/5)+500*sin(2x)*cos(y),50*(1+0.7*cos(1.5x)*sin(1.2y))*sech((x^2+y^2)/4),x=[-3,3],y=[-3,3])"

    示例 4:金融投资组合优化

    # 组合波动率 (风险)
    risk: sqrt(0.2x^2+0.5y^2-0.3x*y

    # 预期收益率
    return: 0.08x+0.12y-0.02x*y

    risk等值线呈椭圆状,return为斜直线

    切点(x≈0.4,y≈0.3)是有效前沿上的最优解

    ContourPolarPlot(sqrt(0.2x^2+0.5y^2-0.3x*y),0.08x+0.12y-0.02x*y,x=[0,1],y=[0,1])

    示例 5:材料科学 - 合金性能

    # 硬度函数:在(0,0)处有尖峰
    600*exp(-2*(x^2+y^2))+200*abs(sin(3x)*cos(2y))

    # 延展性函数:在角落处较高
    25-5x^2-7y^2+3*sin(@pi*x*y)

    ContourPolarPlot(600*exp(-2*(x^2+y^2))+200*abs(sin(3x)*cos(2y)),25-5x^2-7y^2+3*sin(@pi*x*y),x=[-1.5,1.5],y=[-1.5,1.5])

    示例 6:光学透镜设计

    # 像差函数:离轴误差
    5*(x^2+1.5*y^2)+2*x*y*cos(4*sqrt(x^2+y^2))

    # 聚焦强度:中心峰值
    exp(-(x^2+y^2)/2)*sinc(3x)*sinc(3y)

    ContourPolarPlot(5*(x^2+1.5*y^2)+2*x*y*cos(4*sqrt(x^2+y^2)),exp(-(x^2+y^2)/2)*sinc(3x)*sinc(3y),x=[-1,1],y=[-1,1])

    示例 7:生态位竞争模型

    # 物种A适应性:偏好负x区域
    8-(x+1)^2-0.5*y^2

    # 物种B适应性:偏好正y区域
    7-0.8*x^2-(y-1)^2

    ContourPolarPlot(8-(x+1)^2-0.5*y^2,7-0.8*x^2-(y-1)^2,x=[-3,3],y=[-2,2])

    示例 8:化学反应优化

    # 主产物产率:振荡响应曲面
    (0.7+0.3*cos(2*@pi*x))*(0.6+0.4*sin(2*@pi*y))

    # 副产物生成率:高温高压促进
    0.2x+0.3y+0.1x*y

    ContourPolarPlot((0.7+0.3*cos(2*@pi*x))*(0.6+0.4*sin(2*@pi*y)),0.2x+0.3y+0.1x*y,x=[0,1],y=[0,1])

    示例 9:无线通信调度

    # 信道干扰函数
    1.5+0.5*cos(4x)+0.5*sin(4y)

    # 信号质量函数
    exp(-((x-1)^2+(y-1)^2)/2)+0.3*exp(-((x+1)^2+(y+1)^2)/2)

    ContourPolarPlot(1.5+0.5*cos(4x)+0.5*sin(4y),exp(-((x-1)^2+(y-1)^2)/2)+0.3*exp(-((x+1)^2+(y+1)^2)/2),x=[-2,2],y=[-2,2])
    
    卷积和多项式乘法

    c = conv(a,b) 返回输入向量a和b的乘积.

    c = conv(a,b,shape) 返回卷积的分段,由 shape 指定

    a,b — 输入向量.

    shape — 卷积的分段.默认full|same|valid

    两个向量a和b的卷积,表示b滑过a时依据这些点确定的重叠部分的面积。从代数方法上讲,卷积就是与将其系数为a和b元素的多项式相乘的运算

    该实现完整覆盖了多项式系数乘法的各种使用场景,同时提供了清晰的错误提示,适合需要多项式运算的数学计算和教学场景。
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np


    def coefficients_polynomial_multiply(input_str):
        """
        计算两个多项式系数数组的卷积(多项式乘法)

        参数:
        input_str - 输入字符串,格式为:
                    "(系数数组1, 系数数组2 [, 模式])"
                    模式可选:'full'(默认), 'valid', 'same'

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

        示例:
        "( [1,2], [3,4] )"          -> 一维卷积(full模式)
        "( [1,2], [3,4], 'same' )"  -> 一维卷积(same模式)
        """
        try:
            expr = sp.sympify(input_str)

            # 参数有效性检查
            if not isinstance(expr, tuple):
                return f"输入格式错误: 需要元组格式,例如'( [1,2], [3,4] )'"

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

            # 转换系数数组到numpy数组
            def parse_coefficients(coeff):
                """将sympy表达式转换为数值数组"""
                return np.array([float(x) for x in coeff], dtype=np.float64)

            u = parse_coefficients(expr[0])
            v = parse_coefficients(expr[1])

            # 解析卷积模式
            mode = 'full'  # 默认模式
            if len(expr) == 3:

                # 处理可能的符号/字符串格式
                mode_str = str(expr[2]).lower().strip("'\"")  # 去除可能存在的引号
                if mode_str not in ['valid', 'full', 'same']:
                    return f"错误: 不支持的卷积模式 '{mode_str}'"
                mode = mode_str

            result = np.convolve(u, v, mode=mode)

            return sp.Matrix(result)

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


    def main():
        """主函数用于演示功能"""
        test_cases = [
            "([1,2],[3,4])",
            # Matrix([[3.00000000000000],
            #         [10.0000000000000],
            #         [8.00000000000000]])

            "( [1, 2], [3, 4], 'same' )",
            # Matrix([[3.00000000000000],
            #         [10.0000000000000]])

            "( [2, 1, 3], [4, 5], 'valid' )",
            # Matrix([[14.0000000000000],
            #         [17.0000000000000]])

            "( [1.5, 2.5], [3], 'full' )",
            # Matrix([[4.50000000000000],
            #         [7.50000000000000]])

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

        for case in test_cases:
            print(f"输入:{case}")
            result = coefficients_polynomial_multiply(case)

            if isinstance(result, sp.Matrix):
                print("计算结果:")
                print(result)
            else:
                print(result)

            print("-" * 40)


    if __name__ == "__main__":
        main()
    
    
    二维卷积

    C = conv2(A,B) 返回矩阵 A 和 B 的二维卷积。

    如果 A 是矩阵,而 B 是行向量(或者 A 是行向量,而 B 是矩阵),则 C 是矩阵的每行与该向量的卷积。

    如果 A 是矩阵,而 B 是列向量(或者 A 是列向量,而 B 是矩阵),则 C 是矩阵的每列与该向量的卷积。

    C = conv2(u,v,A) 首先求 A 的各列与向量 u 的卷积,然后求每行结果与向量 v 的卷积。无论 u 或 v 是行向量还是列向量,此行为都适用。

    C = conv2(___,shape) 根据 shape 返回卷积的子区。例如,C = conv2(A,B,"same") 返回卷积中大小与 A 相同的中心部分。

    A — 输入数组, 向量 | 矩阵

    B — 第二个输入数组, 向量 | 矩阵

    u — 输入向量, 行或列向量

    v — 第二个输入向量, 行或列向量

    shape — 卷积的分段, "full" (默认) | "same" | "valid"

    C — 二维卷积, 向量 | 矩阵
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import numpy as np
    import sympy as sp
    from scipy.signal import convolve2d


    def coefficients_polynomial_multiply_2d(input_str):
        """
        实现类似MATLAB conv2的二维卷积操作

        参数格式:
        - 常规卷积: ( [[a11,a12,...], ... ], [[b11,b12,...], ... ] )
        - 可分离卷积: ( [u1,u2,...], [v1,v2,...], [[a11,a12,...], ... ] )
        - 指定模式: ( [[a...]], [[b...]], "mode" ) ,mode可以是'full'(默认)/'same'/'valid'
        """
        try:
            # 将输入字符串转换为 SymPy 表达式
            expr = sp.sympify(input_str)

            # 检查输入是否为元组,如果不是则返回错误信息
            if not isinstance(expr, tuple):
                return "输入格式错误: 需要元组格式,例如'( [[1,2],[3,4]], [[5,6],[7,8]] )'"

            # 获取输入元组的参数数量
            param_count = len(expr)

            # 检查参数数量是否为 2 或 3,如果不是则返回错误信息
            if param_count not in (2, 3):
                return f"错误: 需要2或3个参数,当前收到{param_count}个"

            def parse_matrix(matrix_expr):
                """将SymPy表达式转换为标准二维numpy数组"""
                try:
                    # 尝试将输入转换为 SymPy 矩阵
                    matrix = sp.Matrix(matrix_expr)
                    if matrix is not None:
                        # 如果矩阵是列向量,将其平铺为一维列表
                        if matrix.shape[1] == 1:
                            py_list = list(matrix.flat())
                        else:
                            # 否则将矩阵转换为嵌套列表
                            py_list = matrix.tolist()
                    # 如果输入是一个数字,将其转换为 1x1 的二维数组
                    elif matrix_expr.is_number:
                        return np.array([[float(matrix_expr)]])  # 标量处理

                    # 如果转换后的列表是嵌套列表,说明是二维数组,将其转换为 numpy 数组
                    if isinstance(py_list[0], list):
                        return np.array(py_list, dtype=float)  # 二维数组
                    # 否则是一维列表,将其转换为二维行向量的 numpy 数组
                    return np.array([py_list], dtype=float)  # 一维转二维行向量
                except Exception as e:
                    # 若解析过程中出现异常,抛出 ValueError 异常
                    raise ValueError(f"矩阵解析错误: {e}")

            if param_count == 2:
                # 当参数数量为 2 时,进行常规的二维卷积,模式为 'full'
                A = parse_matrix(expr[0])
                B = parse_matrix(expr[1])
                result = convolve2d(A, B, mode='full')
            else:
                # 当参数数量为 3 时,进一步判断是否为可分离卷积
                A_part = parse_matrix(expr[0])
                B_part = parse_matrix(expr[1])

                # 定义一个匿名函数,用于判断数组是否为向量(行向量或列向量)
                is_vector = lambda arr: arr.shape[0] == 1 or arr.shape[1] == 1

                if is_vector(A_part) and is_vector(B_part):
                    # 如果 A_part 和 B_part 都是向量,则进行可分离卷积
                    u = A_part.flatten()
                    v = B_part.flatten()
                    A = parse_matrix(expr[2])
                    # 先对 A 的每一列与 u 进行一维卷积
                    col_conv = np.apply_along_axis(lambda c: np.convolve(c, u, 'full'), 0, A)
                    # 再对卷积结果的每一行与 v 进行一维卷积
                    result = np.apply_along_axis(lambda r: np.convolve(r, v, 'full'), 1, col_conv)
                else:
                    # 否则进行指定模式的二维卷积
                    A = A_part
                    B = B_part
                    mode = str(expr[2]).lower()
                    # 检查模式是否为支持的模式,如果不是则返回错误信息
                    if mode not in ['full', 'same', 'valid']:
                        return f"错误: 不支持的卷积模式 '{mode}'"
                    result = convolve2d(A, B, mode=mode)

            # 将卷积结果转换为 SymPy 矩阵并返回
            return sp.Matrix(result)
        except Exception as e:
            return f"错误: {str(e)}"


    # 示范代码
    if __name__ == "__main__":
        # 测试用例
        test_cases = [
            # 基本二维卷积
            ('[[1,2],[3,4]], [[5,6],[7,8]]'),
            #  Matrix([[5.00000000000000, 16.0000000000000, 12.0000000000000],
            #          [22.0000000000000, 60.0000000000000, 40.0000000000000],
            #          [21.0000000000000, 52.0000000000000, 32.0000000000000]])

            # 可分离卷积
            ('[1,2], [3,4], [[5,6],[7,8]]'),
            #  Matrix([[15.0000000000000, 38.0000000000000, 24.0000000000000],
            #          [51.0000000000000, 128.000000000000, 80.0000000000000],
            #          [42.0000000000000, 104.000000000000, 64.0000000000000]])

            # same模式
            ('[[1,2],[3,4]], [[5,6],[7,8]], same'),
            # Matrix([[5.00000000000000, 16.0000000000000], [22.0000000000000, 60.0000000000000]])

            # valid模式
            ('[[1,2,3],[4,5,6],[7,8,9]], [[1,0],[0,1]], valid')
            # Matrix([[6.00000000000000, 8.00000000000000], [12.0000000000000, 14.0000000000000]])
        ]

        for input_str in test_cases:
            print(f"测试输入: {input_str}")
            result = coefficients_polynomial_multiply_2d(input_str)
            print("实际输出:\n", result)
    
    
    N维卷积

    C = convn(A,B) 返回数组 A 和 B 的 N 维卷积。

    C = convn(A,B,shape) 根据 shape 返回卷积的子区。例如,C = convn(A,B,'same') 返回卷积中大小与 A 相同的中心部分。

    A — 输入数组, 向量 | 矩阵 | 多维数组

    B — 第二个输入数组,向量 | 矩阵 | 多维数组

    shape — 卷积的分段, 'full' (默认) | 'same' | 'valid'

    C — N 维卷积, 向量 | 矩阵 | 多维数组
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np
    from scipy.signal import convolve


    def coefficients_polynomial_multiply_ndim(input_str):
        try:
            """
            对标MATLAB的convn函数,执行N维卷积操作

            参数:
                A_str (str): 字符串形式表示的输入数组A(如"[1,2,3]"或"[[1,2],[3,4]]")
                B_str (str): 字符串形式表示的输入数组B
                shape (str): 卷积模式,可选'full'(默认), 'same', 'valid'

            返回:
                numpy.ndarray: 卷积结果数组,出错时返回None
            """
            # 解析输入字符串为SymPy表达式
            expr = sp.sympify(input_str)
            # 初始化错误标志为False
            error = False

            # 检查解析后的表达式是否为元组
            if isinstance(expr, tuple):
                # 若元组长度为3,分别提取两个数组和卷积模式
                if len(expr) == 3:
                    A_str, B_str, shape = expr[0], expr[1], str(expr[2])
                # 若元组长度为2,提取两个数组,默认卷积模式为'full'
                elif len(expr) == 2:
                    A_str, B_str = expr
                    shape = "full"

                # 将提取的数组字符串转换为SymPy数组
                A_array = sp.Array(A_str)
                B_array = sp.Array(B_str)

                # 检查数组转换结果是否为None,或者卷积模式是否合法
                if A_array is None or B_array is None or shape not in ["full", "valid", "same"]:
                    # 若不满足条件,设置错误标志为True
                    error = True
                else:
                    try:
                        # 将SymPy数组转换为numpy数组
                        A_np = np.array(A_array.tolist(), dtype=float)
                        B_np = np.array(B_array.tolist(), dtype=float)
                    except Exception as e:
                        # 若转换过程中出现异常,打印错误信息并返回None
                        print(f"转换为numpy数组时出错: {e}")
                        return None

                    # 执行卷积并处理可能的错误
                    try:
                        # 调用scipy的convolve函数进行卷积操作
                        result = convolve(A_np, B_np, mode=shape)
                    except ValueError as e:
                        # 若卷积计算出现异常,打印错误信息并返回None
                        print(f"卷积计算错误: {e}")
                        return None
            else:
                # 若解析后的表达式不是元组,设置错误标志为True
                error = True

            # 若没有错误,将卷积结果转换为SymPy数组返回;否则返回错误信息字符串
            return sp.Array(result) if not error else f"输入错误: {input_str}"
        except Exception as e:
            print(f"转换错误: {e}")
            return None


    if __name__ == "__main__":
        # 示例1:一维卷积(full模式)
        print("示例1:一维卷积".center(50, '-'))
        A = "[1, 2, 3]"
        B = "[4, 5]"
        result = coefficients_polynomial_multiply_ndim(f"{A}, {B}")
        print("卷积结果(full):\n", result)
        # [4.0, 13.0, 22.0, 15.0]

        # 示例2:二维卷积(same模式)
        print("\n" + "示例2:二维卷积".center(50, '-'))
        A_2d = "[[1, 2], [3, 4]]"
        B_2d = "[[5, 6], [7, 8]]"
        result_same = coefficients_polynomial_multiply_ndim(f"{A_2d}, {B_2d}, same")
        print("卷积结果(same):\n", result_same)
        # [[5.0, 16.0], [22.0, 60.0]]

        # 示例3:三维卷积(valid模式)
        print("\n" + "示例3:三维卷积".center(50, '-'))
        A_3d = "[[[1,0],[2,3]], [[4,5],[6,7]]]"
        B_3d = "[[[0,1],[1,0]]]"
        result_valid = coefficients_polynomial_multiply_ndim(f"{A_3d}, {B_3d}, valid")
        print("卷积结果(valid):", result_valid)
        # [[[2.0]], [[11.0]]]
    
    
    连分数的收敛项

    连分数的收敛性是指连分数在无限项时是否收敛到一个确定的值.

    s = Convergents(vars)

    vars是向量,表示连分数. 每个元素由有理数或者浮点数表示.连分数的收敛性由收敛项组成,这些收敛项是连分数展开过程中的中间结果.

    s是向量,每个元素是有理数.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    from sympy.ntheory.continued_fraction import continued_fraction, continued_fraction_convergents
    import sympy as sp


    def continued_fraction_from_a(input_str):
        """
        处理输入的连分数系数,生成其收敛项列表。

        参数:
        input_str (str): 表示连分数系数列表的字符串,例如 "[1, 2, 3]" 或 "(1, 2, 3)"。

        返回:
        list or str: 收敛项列表(每个元素为 sympy.Rational 类型),或错误信息字符串。
        """
        try:
            # 将输入字符串转换为 SymPy 表达式
            expr = sp.sympify(input_str)
            result = None
            error = False

            # 根据输入类型处理连分数系数
            if isinstance(expr, (tuple, list)):
                # 转换元组或列表为系数列表
                coeffs = list(expr)
                # 生成收敛项的迭代器
                convergents = continued_fraction_convergents(coeffs)
                # 将迭代器转换为列表并直接存储 Rational 对象
                result = list(convergents)
            else:
                error = True

            if error:
                return f"输入错误: 输入必须是列表或元组形式的系数,但得到 {input_str}"
            else:
                return result

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


    def main():
        """主函数,示例用法"""
        # 示例1:列表形式的连分数系数
        input_str1 = "[1, 2, 3]"
        print(f"输入: {input_str1}")
        print("收敛项:", continued_fraction_from_a(input_str1))
        # 收敛项: [1, 3/2, 10/7]

        # 示例2:元组形式的连分数系数
        input_str2 = "(1, 2, 3)"
        print(f"\n输入: {input_str2}")
        print("收敛项:", continued_fraction_from_a(input_str2))
        # 收敛项: [1, 3/2, 10/7]

        # 示例3:无效输入(非整数系数)
        input_str3 = "[1, 2.5, 3]"
        print(f"\n输入: {input_str3}")
        print("结果:", continued_fraction_from_a(input_str3))
        # 结果: [1, 1.40000000000000, 1.35294117647059]


    if __name__ == "__main__":
        main()
    
    
    以弧度为单位的参量的余弦.

    Y = cos(X)返回X的每个元素的余弦.cos函数按元素处理数组.该函数同时接受实数和复数输入.

    对于X的实数值,cos(X)返回区间[-1, 1]内的实数值.

    对于X的复数值,cos(X)返回复数值.

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


    def cosine_trig_function(input_str):
        """
        计算输入表达式或矩阵的余弦值。

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

        返回:
        计算结果(数值、符号表达式或矩阵),若输入不合法则返回错误信息。
        """
        try:
            # 将输入字符串转换为 SymPy 表达式
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 处理数值或符号表达式
            if expr.free_symbols:
                # 计算余弦并数值化(若为符号表达式则保留符号形式)
                result = sp.cos(expr)
            elif expr.is_number:
                z = complex(expr)
                result = np.cos(z)
            # 其他未知类型标记为错误
            else:
                error = True

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


    if __name__ == "__main__":
        # 示例1:数值输入(π)
        input1 = "2"
        print(f"输入:{input1}")
        print("输出:", cosine_trig_function(input1))  # 应输出 -1.0
        # 输出: (-0.4161468365471424-0j)

        # 示例2:符号输入(x)
        input2 = "x"
        print(f"\n输入:{input2}")
        print("输出:", cosine_trig_function(input2))  # 应输出 cos(x)
        # 输出: cos(x)
    
    
    以度为单位的参量的余弦.

    Y = cosd(X)返回X的每个元素的余弦.cosd该函数同时接受实数和复数输入.

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


    def cosd_cosine_degree(input_str):
        """
        计算角度(度数)的余弦值,支持矩阵和符号计算

        参数:
        input_str: 输入字符串,可以是:
                   - 数值(如 "30")
                   - 符号表达式(如 "x")
                   - 矩阵(如 "[[30, 60], [0, 90]]")

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

            # 数值/符号处理分支
            if expr.free_symbols:
                result = sp.cos(expr * sp.pi / 180)
            elif expr.is_number:
                z = complex(expr)
                result = np.cos(z * np.pi / 180)
            # 未知类型标记为错误
            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:", cosd_cosine_degree("30"))
        # (0.8660254037844387-0j)

        # 示例2:符号运算
        print("\n示例3:", cosd_cosine_degree("x"))
        # cos(pi*x/180)
    
    
    双曲余弦函数.

    Y = cosh(X)返回X的每个元素的双曲余弦.cosh该函数同时接受实数和复数输入,所有的角度都以弧度表示.

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


    def cosh_hyperbolic_cosine(input_str):
        """
        计算输入表达式的双曲余弦值,支持矩阵、数值和符号表达式。

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

        返回:
        计算结果。如果输入为矩阵,返回对应元素的cosh矩阵;如果输入为数值或符号,返回cosh值。
        如果输入无法解析或处理,返回错误信息字符串。
        """
        try:
            # 将输入字符串转换为SymPy表达式
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 处理数值或符号表达式
            if expr.free_symbols:
                result = sp.cosh(expr)
            elif expr.is_number:
                z = complex(expr)
                result = np.cosh(z)
            # 其他情况视为错误
            else:
                error = True

            # 根据错误标志返回结果或错误信息
            return result if not error else f"输入错误: {input_str}"

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


    def main():
        """
        主函数,用于测试cosh_hyperbolic_cosine函数的各种用例。
        """
        test_cases = [
            "3",
            # (10.067661995777765+0j)

            "3+2j",
            # (-4.189625690968807+9.109227893755337j)

            "x",
            # cosh(x)

            "cosh(0)",
            # (1.5430806348152437+0j)
        ]

        for case in test_cases:
            print(f"测试输入: {case}")
            result = cosh_hyperbolic_cosine(case)
            print("返回结果:")
            # 统一处理结果的打印格式
            if isinstance(result, sp.Matrix):
                sp.pprint(result)
            else:
                print(f"{result}\n")
            print("-" * 50)


    if __name__ == "__main__":
        main()
    
    
    双曲余弦积分

    如果x是浮点数,则Chi(x)返回浮点结果.

    Y = Chi(x)返回算术表达式

    x是标量,符号变量,表达式,向量,矩阵
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from sympy.functions.special.error_functions import Chi
    from scipy.special import shichi


    def chi_hyper_cosine_integral(input_str):
        """
        计算输入的双曲余弦积分Chi(x),支持矩阵、数值和符号表达式

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

        返回:
        计算结果。如果输入为矩阵,返回对应元素的Chi积分矩阵;
        如果输入为数值或符号,返回Chi积分值。
        无法处理时返回错误信息字符串
        """
        try:
            # 表达式转换
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 处理标量数值和符号表达式
            if expr.free_symbols:
                result = Chi(expr)
            elif expr.is_number:
                z = complex(expr)
                Shi_, Chi_ = shichi(z)  # 解包返回值
                result = Chi_
            else:
                error = True

            return result if not error else f"输入错误: {input_str}"
        except sp.SympifyError as e:
            return f"表达式解析错误: {e}"
        except Exception as e:
            return f"运行时错误: {str(e)}"


    def main():
        """
        主函数测试用例
        """
        test_cases = [
            "0",
            # (-inf+nan*j)

            "2+2j",
            # (0.9629226258960547+2.6677809260012038j)

            "x",
            # Chi(x)

            "Chi(0)",
            # (nan+nan*j)

            "3.14"
            # (5.452860589178992+0j)
        ]

        for case in test_cases:
            print(f"测试输入: {case}")
            result = chi_hyper_cosine_integral(case)
            print("返回结果:")

            # 统一输出格式
            if isinstance(result, sp.Matrix):
                sp.pprint(result)
            elif isinstance(result, sp.Expr):
                print(sp.pretty(result))
            else:
                print(result)
            print("-" * 50)


    if __name__ == "__main__":
        main()
    
    
    准确计算cos(x*pi).

    Y = cospi(X).该函数同时接受实数和复数输入.

    X是标量,向量,数组,矩阵.

    对于奇数,cospi(n/2) 正好为零.

    对于整数,cospi(n) 为+1或-1
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np


    def cos_pi_cosine(input_str):
        """
        计算表达式或矩阵中每个元素的cos(pi * x)

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

        返回:
        计算结果,如果输入无效则返回错误信息字符串
        """
        try:
            # 将输入字符串转换为SymPy表达式
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 检查输入是否为元组(不支持的类型)
            if isinstance(expr, tuple):
                error = True
            # 处理数值或符号表达式
            elif expr.is_number:
                z = complex(expr)
                result = np.cos(z * np.pi)
            elif expr.free_symbols:
                result = sp.cos(expr * sp.pi)
            else:
                # 其他无效类型
                error = True

            # 根据错误标志返回结果或错误信息
            return result if not error else f"输入错误: {input_str}"

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


    def main():
        # 示例测试
        test_cases = [
            "2",  # (1+0j)
            "x",  # cos(pi*x)
        ]

        for case in test_cases:
            print(f"输入: {case}")
            result = cos_pi_cosine(case)
            print("结果:")
            if isinstance(result, sp.Matrix):
                sp.pprint(result)
            else:
                print(result)
            print("\n" + "-" * 50 + "\n")


    if __name__ == "__main__":
        main()
    
    
    角的余切(以弧度为单位)

    Y = cot(X) 返回 X 的各元素的余切。cot 函数按元素处理数组。该函数同时接受实数和复数输入。

    对于 X 的实数值,cot(X) 返回区间 [-∞, ∞] 内的实数值。

    对于 X 的复数值,cot(X) 返回复数值。

    X — 输入角(以弧度为单位)标量 | 向量 | 矩阵

    Y — 输入角的余切. 标量 | 向量 | 矩阵
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from sympy import sympify
    import numpy as np


    def cotangent_of_radians(input_str):
        """
        计算输入表达式(数值或矩阵)的余切值(以弧度为单位)

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

        返回:
        计算结果,若输入有效则返回SymPy表达式或矩阵;否则返回错误信息字符串
        """
        try:
            expr = sympify(input_str)
            error = False
            result = None

            # 元组类型直接判定为无效输入
            if isinstance(expr, tuple):
                error = True
            elif expr.is_number:
                z = complex(expr)
                result = 1 / np.tan(z)
            elif expr.free_symbols:
                # 处理数值或符号表达式
                result = sp.cot(expr)
            else:
                error = True

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


    if __name__ == "__main__":
        # 示例测试
        print("===== 测试1:数值计算 =====")
        test_cases = [
            ("pi/4", "1.0 (cot(pi/4))"),
            # 结果: (1.0000000000000002+0j)

            ("0", "无穷大 (cot(0))"),
            # 结果: (inf+nan*j)

            ("pi/2", "0 (cot(pi/2))")
            # 结果: (6.123233995736766e-17+0j)
        ]
        for inp, desc in test_cases:
            print(f"\n输入: {inp} ({desc})")
            result = cotangent_of_radians(inp)
            print("结果:", result)

        print("\n===== 测试3:符号表达式 =====")
        sym_input = "x"
        print(f"\n输入符号: {sym_input}")
        print("结果:", cotangent_of_radians(sym_input))
    
    
    以度为单位的参量的余切

    Y = cotd(X) 返回 X 的元素的余切(以度为单位)

    X — 以度为单位的角, 标量值 | 向量 | 矩阵

    Y — 角余切, 标量值 | 向量 | 矩阵
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from sympy import sympify
    import numpy as np


    def cotangent_degree_radians(input_str):
        """
        计算输入的角度(度数)的余切值,支持矩阵、数值和符号表达式

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

        返回:
        计算结果(数值、矩阵或符号表达式)或错误信息字符串
        """
        try:
            expr = sympify(input_str)  # 将输入字符串转换为SymPy表达式
            error = False
            result = None

            # 检查输入类型
            if expr.is_number:
                z = complex(expr)
                complex_angle = z * np.pi / 180
                result = 1 / np.tan(complex_angle)
            elif expr.free_symbols:  # 数值或符号处理
                rad_z = sp.rad(expr)  # 更清晰的写法
                result = sp.cot(rad_z)
            else:
                error = True

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


    def main():
        """主函数:演示cotangent_degree_radians的使用"""
        examples = [
            "30",
            # (1.7320508075688776+0j)

            "45",
            # (1.0000000000000002+0j)

            "x",
            # cot(pi*invalid/180)
        ]

        for example in examples:
            print(f"输入: {example}")
            result = cotangent_degree_radians(example)
            print("结果:")
            print(result)  # 使用SymPy的美化打印
            print("\n" + "=" * 50 + "\n")


    if __name__ == "__main__":
        main()
    
    
    双曲余切

    Y=coth(X)返回X元素的双曲正切。coth函数对数组进行元素操作。该函数接受真实和复杂的输入。所有角度均以弧度为单位。

    X —— 以弧度为单位的输入角度,标量|矢量|矩阵
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    from sympy import sympify
    import numpy as np


    def cotangent_hyperbolic_radians(input_str):
        """
        计算输入的双曲余切值(coth),支持数值、符号和矩阵输入

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

        返回:
        计算结果(数值、矩阵或符号表达式)或错误信息
        """
        try:
            expr = sympify(input_str)  # 将输入字符串转换为SymPy表达式
            error = False
            result = None

            # 检查输入类型
            if expr.is_number:
                z = complex(expr)
                result = 1 / np.tanh(z)
            elif expr.free_symbols:  # 数值或符号处理
                result = sp.coth(expr)
            else:
                error = True  # 未知类型标记为错误

            return result if not error else f"输入错误: {input_str}"
        except Exception as e:
            return f"错误: {str(e)}"  # 返回异常信息


    def main():
        """主函数:演示双曲余切函数功能"""
        test_cases = [
            "1",  # (1.3130352854993315+0j)
            "0",  # (inf+nan*j)
            "x",  # coth(x)
        ]

        for case in test_cases:
            print(f"输入: {case}")
            result = cotangent_hyperbolic_radians(case)
            print("结果:")
            print(result)  # 使用SymPy的美化打印
            print("\n" + "=" * 50 + "\n")


    if __name__ == "__main__":
        main()
    
    
    协方差

    C = cov(A) 返回协方差.

    如果 A 是由观测值组成的向量,则 C 为标量值方差.

    如果 A 是其列表示随机变量或行表示观测值的矩阵,则 C 为对应的列方差沿着对角线排列的协方差矩阵.

    C = cov(A,B) 返回两个随机变量 A 和 B 之间的协方差

    如果A和B是长度相同的观测值向量,则cov(A,B)为2×2协方差矩阵

    C = cov(___,w) 为之前的任何语法指定归一化权重.如果 w = 0(默认值),则 C 按观测值数量-1实现归一化. w=1时,按观测值数量对它实现归一化.

    A —— 输入数组 向量|矩阵

    B —— 附加输入数组向量|矩阵

    w —— 归一化权重0(默认值)|1
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np
    from sympy import sympify


    def covariance_array(input_str):
        """
        计算输入数据集的协方差矩阵(仅支持数值矩阵)

        参数格式支持:
        - 单个矩阵:计算该矩阵的协方差(默认归一化方式,ddof=1)
        - 元组格式:
            (A, B, flag): 两个矩阵A和B的协方差,flag为0或1指定归一化方式
            (A, B): 两个矩阵的协方差(默认ddof=1)
            (A, flag): 单个矩阵A的协方差,flag指定归一化方式

        参数说明:
        flag=0: 使用N-1归一化(无偏估计,ddof=1)
        flag=1: 使用N归一化(有偏估计,ddof=0)

        返回:
        NumPy协方差矩阵 或 错误信息字符串
        """
        try:
            expr = sympify(input_str)
            error = False
            result = None

            def validate_and_convert(matrix):
                """验证矩阵是否为纯数值并转换为NumPy数组"""
                if matrix.is_symbolic():
                    raise ValueError("矩阵包含符号,无法转换为数值数组")
                else:
                    return np.array(matrix, dtype=float)

            # 处理元组输入
            if isinstance(expr, tuple):
                if len(expr) > 2:
                    if int(expr[2]) not in [0, 1]:
                        error = True

                    if isinstance(expr[0], list) and isinstance(expr[1], list):
                        A = sp.Matrix(expr[0])
                        B = sp.Matrix(expr[1])
                        if A.shape == B.shape:
                            data_a = validate_and_convert(A)
                            data_b = validate_and_convert(B)
                            result = np.cov(data_a, data_b, rowvar=False, ddof=1 - int(expr[2]))
                    else:
                        error = True
                elif isinstance(expr[0], list) and isinstance(expr[1], list):
                    A = sp.Matrix(expr[0])
                    B = sp.Matrix(expr[1])
                    if A.shape == B.shape:
                        data_a = validate_and_convert(A)
                        data_b = validate_and_convert(B)
                        result = np.cov(data_a, data_b, rowvar=False)
                elif isinstance(expr[0], list) and int(expr[1]) in [0, 1]:
                    A = sp.Matrix(expr[0])
                    data_a = validate_and_convert(A)
                    result = np.cov(data_a, rowvar=False, ddof=1 - int(expr[1]))
            elif isinstance(expr, list):
                A = sp.Matrix(expr)
                data_a = validate_and_convert(A)
                result = np.cov(data_a, rowvar=False)
            else:
                error = True

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

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


    def main():
        """主函数:演示协方差计算功能"""
        test_cases = [
            # 有效输入测试
            "[[1,2], [3,4], [5,6]]",
            # 结果:
            #[[4. 4.]
            # [4. 4.]]

            "[[1,2], [3,4]],[[5,6], [7,8]]",
            # 结果:
            # [[2. 2. 2. 2.]
            #  [2. 2. 2. 2.]
            #  [2. 2. 2. 2.]
            #  [2. 2. 2. 2.]]

            "[[1,2], [3,4]],[[5,6], [7,8]], 0",
            # 结果:
            # [[2. 2. 2. 2.]
            #  [2. 2. 2. 2.]
            #  [2. 2. 2. 2.]
            #  [2. 2. 2. 2.]]


            "[[1,2],[3,4]], 0",
            # 结果:
            # [[2. 2.]
            #  [2. 2.]]
        ]

        for case in test_cases:
            print(f"输入: {case}")
            result = covariance_array(case)
            print("结果:")
            if isinstance(result, str):
                print(result)
            else:
                print(np.round(result, 4))  # 保留4位小数便于观察
            print("\n" + "=" * 50 + "\n")


    if __name__ == "__main__":
        main()
    
    
    将复数排序为复共轭对组

    B = cplxpair(A) 对沿复数数组不同维度的元素排序,并将复共轭对组组合在一起。

    共轭对组按递增实部排序。在对组中,带有负虚部的元素排在前面。在所有复数对组后返回纯实数值。复共轭对组会强制成为精确复共轭。相对于 100*eps 的默认容差 abs(A(i)) 确定哪些数字是实数,哪些元素是成对复共轭。

    如果 A 为向量,cplxpair(A) 返回复共轭对组组合在一起的 A。

    如果 A 是矩阵,则 cplxpair(A) 返回其列已排序且复共轭已配对的 A。

    B = cplxpair(A,tol) 覆盖默认容差。
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import numpy as np
    import sympy as sp


    def complex_conjugate_pairs(input_str):
        """
        实现MATLAB cplxpair函数,将复数数组排序并配对共轭复数

        参数:
        input_str (str): 输入表达式,如 "A, tol"

        返回:
        sp.Matrix: 排序后的矩阵,共轭对相邻

        异常:
        ValueError: 输入不合法或无法配对
        """
        try:
            # 解析输入参数
            expr = sp.sympify(input_str)
            error = False
            result = None
            tol = 1e-6  # 默认容差

            def cplxpair(A, tol=1e-10):
                """
                MATLAB cplxpair函数的NumPy实现

                参数:
                A: 输入数组(向量、矩阵或多维数组)
                tol: 容差,用于判断两个复数是否共轭

                返回:
                按共轭对排序的数组
                """
                A = np.asarray(A)

                # 处理空数组
                if A.size == 0:
                    return A

                # 确定第一个非单一维度
                dim = next((i for i, s in enumerate(A.shape) if s > 1), 0)

                # 对于向量输入,直接处理
                if A.ndim == 1:
                    return _sort_complex_vector(A, tol)

                # 对于多维数组,沿第一个非单一维度处理
                else:
                    # 转置数组,使目标维度成为第一个维度
                    transpose_axes = list(range(A.ndim))
                    transpose_axes.insert(0, dim)
                    transpose_axes.pop(dim + 1)
                    A_transposed = A.transpose(transpose_axes)

                    # 重塑为二维数组(第一个维度为向量,其余维度合并)
                    original_shape = A_transposed.shape
                    A_2d = A_transposed.reshape(original_shape[0], -1)

                    # 对每一列应用排序
                    sorted_2d = np.apply_along_axis(lambda x: _sort_complex_vector(x, tol), 0, A_2d)

                    # 重塑回原始形状(转置后)
                    sorted_transposed = sorted_2d.reshape(original_shape)

                    # 转回原始维度顺序
                    inverse_transpose = [transpose_axes.index(i) for i in range(len(transpose_axes))]
                    sorted_A = sorted_transposed.transpose(inverse_transpose)

                    return sorted_A

            def _sort_complex_vector(c, tol):
                """辅助函数:对复数向量进行共轭对排序"""
                # 分离实部和虚部
                real_part = np.real(c)
                imag_part = np.imag(c)

                # 创建排序索引:先按实部升序,再按虚部绝对值升序
                idx = np.lexsort((np.abs(imag_part), real_part))
                sorted_c = c[idx].copy()  # 复制以避免修改原数组

                # 处理共轭对,确保虚部非负的元素在前
                n = len(sorted_c)
                result = np.zeros(n, dtype=complex)
                i = 0
                j = 0

                while i < n:
                    # 如果是实数值,直接添加
                    if np.abs(sorted_c[i].imag) < tol:
                        result[j] = sorted_c[i]
                        i += 1
                        j += 1
                    else:
                        # 找到共轭对
                        found = False
                        for k in range(i + 1, n):
                            if (np.abs(np.real(sorted_c[k]) - np.real(sorted_c[i])) < tol and
                                    np.abs(np.imag(sorted_c[k]) + np.imag(sorted_c[i])) < tol):
                                # 确保虚部非负的元素在前
                                if sorted_c[i].imag >= 0:
                                    result[j] = sorted_c[i]
                                    result[j + 1] = sorted_c[k]
                                else:
                                    result[j] = sorted_c[k]
                                    result[j + 1] = sorted_c[i]
                                i = k + 1
                                j += 2
                                found = True
                                break
                        if not found:
                            # 没有找到共轭对,单独添加
                            result[j] = sorted_c[i]
                            i += 1
                            j += 1

                return result[:j]  # 裁剪到实际填充的部分

            if isinstance(expr, tuple):
                error = True
            elif isinstance(expr, list):
                A = np.asarray(expr, dtype=complex)
                result = cplxpair(A, tol)
            else:
                error = True

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

        except Exception as e:
            raise ValueError(f"cplxpair错误: {str(e)}")


    # 示范代码
    if __name__ == "__main__":
        # 矩阵示例
        print("\n=== 矩阵示例 ===")
        sorted_matrix = complex_conjugate_pairs("[[3 + 4j, 1 - 2j, 5],[1 + 2j, 3 - 4j, 6j],[7, 8 + 1j, 8 - 1j]]")
        print("排序后矩阵:\n", sorted_matrix)
        #  [[1.+2.j 1.-2.j 0.+6.j]
        #  [3.+4.j 3.-4.j 5.+0.j]
        #  [7.+0.j 8.+1.j 8.-1.j]]

        # 三维数组示例
        print("\n=== 三维数组示例 (2x3x3) ===")
        sorted_3d = complex_conjugate_pairs(
            "[[[3 + 4j, 1 - 2j, 5],[1 + 2j, 3 - 4j, 6j],[7, 8 + 1j, 8 - 1j]],[[4 + 2j, 9, 2 - 3j],[4 - 2j, 10, 2 + 3j],[11, 12 + 5j, 12 - 5j]]]")
        print("排序后三维数组:\n", sorted_3d)
        #  [[[ 3.+4.j  1.-2.j  2.-3.j]
        #   [ 1.+2.j  3.-4.j  0.+6.j]
        #   [ 7.+0.j  8.+1.j  8.-1.j]]
        #
        #  [[ 4.+2.j  9.+0.j  5.+0.j]
        #   [ 4.-2.j 10.+0.j  2.+3.j]
        #   [11.+0.j 12.+5.j 12.-5.j]]]
    
    
    叉积

    C = cross(A,B) 返回A和B的叉积.

    如果A和B为向量,则它们的长度必须为3.

    如果A和B为矩阵,则它们必须具有相同大小.在这种情况下,cross函数将A和B视为三元素向量集合.该函数计算对应向量沿大小等于3的第一个数组维度的叉积.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp


    def cross_vector(input_str):
        """
        计算两个三维向量或矩阵列向量的叉积。

        参数:
        input_str: 字符串形式的输入,应为包含两个矩阵或向量的元组,例如 "([1,2,3], [4,5,6])"

        返回:
        如果输入合法,返回叉积结果矩阵;否则返回错误信息字符串。
        """
        try:
            # 将输入字符串转换为SymPy表达式
            expr = sp.sympify(input_str)
            result = None
            error = False

            # 检查是否为包含两个元素的元组
            if isinstance(expr, tuple) and len(expr) == 2:
                # 转换两个元素为矩阵
                A = sp.Matrix(expr[0]) if isinstance(expr[0], list) else None
                B = sp.Matrix(expr[1]) if isinstance(expr[1], list) else None

                if A is not None and B is not None:
                    # 处理两个3x1列向量的情况
                    if A.shape == (3, 1) and B.shape == (3, 1):
                        result = A.cross(B)
                    # 处理两个3xn矩阵的情况(按列计算叉积)
                    elif A.shape == B.shape and A.shape[0] == 3 and A.shape[1] >= 1:
                        vectors = []
                        for i in range(A.shape[1]):
                            a_col = A.col(i)
                            b_col = B.col(i)
                            vectors.append(a_col.cross(b_col))
                        # 水平拼接所有结果列向量
                        result = sp.Matrix.hstack(*vectors)
                    else:
                        error = True
                else:
                    error = True
            else:
                error = True

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

        except Exception as e:
            return f"计算过程中发生错误: {str(e)}"


    def main():
        """主函数,展示cross_vector函数的使用示例"""
        # 示例1:两个3D向量的叉积
        input1 = "([1, 2, 3], [4, 5, 6])"
        print(f"输入:{input1}")
        print("输出:", cross_vector(input1), "\n")
        # 输出: Matrix([[-3],
        #               [6],
        #               [-3]])

        # 示例2:两个3x2矩阵的列向量叉积
        input2 = "([[1, 2], [3, 4], [5, 6]], [[6, 5], [4, 3], [2, 1]])"
        print(f"输入:{input2}")
        print("输出:\n", cross_vector(input2), "\n")
        # Matrix([[-14, -14],
        #         [28, 28],
        #         [-14, -14]])


    if __name__ == "__main__":
        main()
    
    
    复共轭转置

    B = A' 计算A的复共轭转置.

    B = ctranspose(A) 是执行A'的替代方法,但很少使用.

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


    def conjugation_transpose_matrix(input_str):
        """
        计算输入字符串所表示的矩阵的共轭转置。

        参数:
        input_str: 输入的字符串,可能表示一个矩阵。

        返回:
        如果输入是有效的矩阵,则返回其共轭转置矩阵;否则返回错误信息。
        """
        try:
            # 使用 sympy 的 sympify 函数将输入字符串转换为 SymPy 表达式
            expr = sp.sympify(input_str)
            # 初始化错误标志和结果变量
            error = False
            result = None

            # 检查转换后的表达式是否为元组
            # 如果是元组,说明输入不是有效的矩阵形式,将错误标志设为 True
            if isinstance(expr, tuple):
                error = True

            # 如果是矩阵,则计算其共轭转置
            elif isinstance(expr, list):
                A = sp.Matrix(expr)
                result = A.H
            # 若表达式既不是矩阵也不是可转换为矩阵的形式,将错误标志设为 True
            else:
                error = True

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

        except Exception as e:
            # 若在转换或计算过程中出现异常,返回错误信息
            return f"错误:{e}"


    def main():
        """
        主程序,用于测试 conjugation_transpose_matrix 函数。
        """
        # 定义测试用的输入字符串
        test_inputs = [
            "[[1, 2], [3, 4]]",
            # Matrix([[1, 3],
            #         [2, 4]])
        ]

        # 遍历测试输入,调用 conjugation_transpose_matrix 函数并打印结果
        for input_str in test_inputs:
            result = conjugation_transpose_matrix(input_str)
            print(f"输入: {input_str}")
            print(f"结果: {result}")
            print()


    if __name__ == "__main__":
        # 调用主程序
        main()
    
    
    M = cummax(A) 返回 A 的累积最大元素。

    如果 A 是向量,则 M 是具有相同大小和类型的向量,并且包含 A 的累积最大值。

    如果 A 是矩阵,则 M 是具有相同大小和类型的矩阵,并且包含 A 的每列中的累积最大值。

    M = cummax(A,dim) 返回沿维度 dim 的累积最大值。例如,如果 A 是矩阵,则 cummin(A,2) 沿 A 的各行返回累积最大值。

    M = cummax(___,direction) 可在上述任一语法的基础上指定计算方向。例如,cummin(A,2,"reverse") 通过从尾到头计算 A 的第二个维度返回 A 的累积最大值。

    M = cummax(___,nanflag) 指定忽略还是包括 A 中的 NaN 值。例如,cummin(A,"includenan") 在计算每个最大值时包含 NaN 值。默认情况下,cummin 忽略 NaN 值。

    A — 输入数组, 向量 | 矩阵

    dim — 沿其运算的维度, 正整数标量

    direction — 累积方向, "forward" (默认) | "reverse"

    nanflag — 缺失值条件, "omitmissing" (默认) | "omitnan" | "includemissing" | "includenan"
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import numpy as np
    import sympy as sp


    def cumulative_max_symbolic(input_str):
        """
        处理符号累积和的入口函数,解析输入参数并调用核心计算函数。

        参数:
        input_expr: 输入的表达式,可以是矩阵、列表或包含矩阵及参数的元组

        返回:
        累积和的结果或错误信息
        """
        try:
            input_expr = sp.sympify(input_str)
            result = None

            def cummax(A, dim=None, direction='forward', nanflag='propagate'):
                """
                MATLAB cummax函数的NumPy实现

                参数:
                A: 输入数组
                dim: 计算累积最大值的维度,默认为第一个非单一维度
                direction: 累积方向,'forward'(默认)或'backward'
                nanflag: NaN处理方式,'propagate'(默认)或'omitnan'

                返回:
                与A形状相同的数组,包含累积最大值
                """
                A = np.asarray(A)

                # 处理dim参数(默认行为:选择第一个非单一维度)
                if dim is None:
                    if A.size == 0:
                        dim = 0
                    else:
                        dim = next((i for i, s in enumerate(A.shape) if s > 1), 0)

                # 处理direction参数
                if direction == 'backward':
                    # 对于后向累积,先反转数组,计算前向累积,再反转回来
                    slices = [slice(None)] * A.ndim
                    slices[dim] = slice(None, None, -1)
                    A_reversed = A[tuple(slices)]
                    if nanflag == 'omitnan':
                        # 对每个切片单独处理NaN
                        result = np.apply_along_axis(_cummax_omitnan, dim, A_reversed)
                    else:
                        result = np.maximum.accumulate(A_reversed, axis=dim)
                    # 反转结果恢复原始顺序
                    result = result[tuple(slices)]
                    return result
                else:  # forward
                    if nanflag == 'omitnan':
                        # 对每个切片单独处理NaN
                        return np.apply_along_axis(_cummax_omitnan, dim, A)
                    else:
                        return np.maximum.accumulate(A, axis=dim)

            def _cummax_omitnan(arr):
                """辅助函数:处理包含NaN的数组,忽略NaN计算累积最大值"""
                mask = np.isnan(arr)
                if np.all(mask):
                    return np.full_like(arr, np.nan)
                # 找到第一个非NaN值
                first_valid = next((i for i, x in enumerate(arr) if not np.isnan(x)), 0)
                result = np.full_like(arr, np.nan)
                result[first_valid] = arr[first_valid]
                # 计算剩余位置的累积最大值
                for i in range(first_valid + 1, len(arr)):
                    if not np.isnan(arr[i]):
                        result[i] = max(result[i - 1], arr[i])
                    else:
                        result[i] = result[i - 1]
                return result

            # 解析输入表达式
            if isinstance(input_expr, tuple):

                if not isinstance(input_expr[0], list):
                    raise ValueError(f"输入错误:{input_str}")
                else:
                    A = sp.Array(input_expr[0])

                params = input_expr[1:]
                dim = None  # 默认让函数内部处理
                direction = 'forward'
                nanflag = 'includenan'

                # 解析参数
                for param in params:
                    if isinstance(param, (int, sp.Integer)):
                        dim = int(param) - 1
                    elif str(param).lower() in ['forward', 'reverse']:
                        direction = str(param).lower()
                    elif str(param).lower() in ['includenan', 'omitnan']:
                        nanflag = str(param).lower()

                # 参数校验
                if dim is not None and dim not in [1, 2]:
                    return f"错误: 维度参数 dim 必须为 1 或 2,当前为 {dim}"
                if direction not in ['forward', 'reverse']:
                    return f"错误: 方向参数 direction 必须为 'forward' 或 'reverse',当前为 {direction}"
                if nanflag not in ['includenan', 'omitnan']:
                    return f"错误: nanflag 参数无效,当前为 {nanflag}"

                # 调用核心计算函数
                np_a = np.asarray(A.tolist(), dtype=float)
                result = cummax(np_a, dim=dim, direction=direction, nanflag=nanflag)

            else:
                # 输入为单一矩阵
                if not isinstance(input_expr, list):
                    raise ValueError(f"输入错误:{input_str}")
                else:
                    A = sp.Array(input_expr)
                    np_a = np.asarray(A.tolist(), dtype=float)
                    result = cummax(np_a)

            return result

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


    # 三维数组示范代码
    if __name__ == "__main__":
        # 创建三维示例数组 (2x3x3)
        A_3d = "[[[5, 3, 7],[2, 6, 1],[4, 2, 3]],[[8, 1, 5],[9, 4, 6],[3, nan,2]]]"

        print("\n=== 三维数组示例 (2x3x3) ===")
        print("原始数组:\n", A_3d)

        # 默认参数(处理第一个非单一维度,这里是dim=0)
        print("\n默认参数 (dim=0):\n", cumulative_max_symbolic(f"{A_3d}"))
        #  [[[ 5.  3.  7.]
        #   [ 2.  6.  1.]
        #   [ 4.  2.  3.]]
        #
        #  [[ 8.  3.  7.]
        #   [ 9.  6.  6.]
        #   [ 4. nan  3.]]]

        # 后向累积 (direction='backward')
        print("\n后向累积 (dim=2, direction='backward'):\n",
              cumulative_max_symbolic(f"{A_3d},2,backward"))
        #  [[[ 5.  3.  7.]
        #   [ 5.  6.  7.]
        #   [ 5.  6.  7.]]
        #
        #  [[ 8.  1.  5.]
        #   [ 9.  4.  6.]
        #   [ 9. nan  6.]]]
    
    
    M = cummin(A) 返回 A 的累积最小元素。

    如果 A 是向量,则 M 是具有相同大小和类型的向量,并且包含 A 的累积最小值。

    如果 A 是矩阵,则 M 是具有相同大小和类型的矩阵,并且包含 A 的每列中的累积最小值。

    M = cummin(A,dim) 返回沿维度 dim 的累积最小值。例如,如果 A 是矩阵,则 cummin(A,2) 沿 A 的各行返回累积最小值。

    M = cummin(___,direction) 可在上述任一语法的基础上指定计算方向。例如,cummin(A,2,"reverse") 通过从尾到头计算 A 的第二个维度返回 A 的累积最小值。

    M = cummin(___,nanflag) 指定忽略还是包括 A 中的 NaN 值。例如,cummin(A,"includenan") 在计算每个最小值时包含 NaN 值。默认情况下,cummin 忽略 NaN 值。

    A — 输入数组, 向量 | 矩阵

    dim — 沿其运算的维度, 正整数标量

    direction — 累积方向, "forward" (默认) | "reverse"

    nanflag — 缺失值条件, "omitmissing" (默认) | "omitnan" | "includemissing" | "includenan"
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import numpy as np
    import sympy as sp


    def cumulative_min_symbolic(input_str):
        """
        处理符号累积和的入口函数,解析输入参数并调用核心计算函数。

        参数:
        input_expr: 输入的表达式,可以是矩阵、列表或包含矩阵及参数的元组

        返回:
        累积和的结果或错误信息
        """
        try:
            input_expr = sp.sympify(input_str)
            result = None

            def cummin(A, dim=None, direction='forward', nanflag='propagate'):
                """
                MATLAB cummin函数的NumPy实现

                参数:
                A: 输入数组
                dim: 计算累积最小值的维度,默认为第一个非单一维度
                direction: 累积方向,'forward'(默认)或'backward'
                nanflag: NaN处理方式,'propagate'(默认)或'omitnan'

                返回:
                与A形状相同的数组,包含累积最小值
                """
                A = np.asarray(A)

                # 处理dim参数(默认行为:选择第一个非单一维度)
                if dim is None:
                    if A.size == 0:
                        dim = 0
                    else:
                        dim = next((i for i, s in enumerate(A.shape) if s > 1), 0)

                # 处理direction参数
                if direction == 'backward':
                    # 对于后向累积,先反转数组,计算前向累积,再反转回来
                    slices = [slice(None)] * A.ndim
                    slices[dim] = slice(None, None, -1)
                    A_reversed = A[tuple(slices)]
                    if nanflag == 'omitnan':
                        # 对每个切片单独处理NaN
                        result = np.apply_along_axis(_cummin_omitnan, dim, A_reversed)
                    else:
                        result = np.minimum.accumulate(A_reversed, axis=dim)
                    # 反转结果恢复原始顺序
                    result = result[tuple(slices)]
                    return result
                else:  # forward
                    if nanflag == 'omitnan':
                        # 对每个切片单独处理NaN
                        return np.apply_along_axis(_cummin_omitnan, dim, A)
                    else:
                        return np.minimum.accumulate(A, axis=dim)

            def _cummin_omitnan(arr):
                """辅助函数:处理包含NaN的数组,忽略NaN计算累积最小值"""
                mask = np.isnan(arr)
                if np.all(mask):
                    return np.full_like(arr, np.nan)
                # 找到第一个非NaN值
                first_valid = next((i for i, x in enumerate(arr) if not np.isnan(x)), 0)
                result = np.full_like(arr, np.nan)
                result[first_valid] = arr[first_valid]
                # 计算剩余位置的累积最小值
                for i in range(first_valid + 1, len(arr)):
                    if not np.isnan(arr[i]):
                        result[i] = min(result[i - 1], arr[i])
                    else:
                        result[i] = result[i - 1]
                return result

            # 解析输入表达式
            if isinstance(input_expr, tuple):

                if not isinstance(input_expr[0], list):
                    raise ValueError(f"输入错误:{input_str}")
                else:
                    A = sp.Array(input_expr[0])

                params = input_expr[1:]
                dim = None  # 默认让函数内部处理
                direction = 'forward'
                nanflag = 'includenan'

                # 解析参数
                for param in params:
                    if isinstance(param, (int, sp.Integer)):
                        dim = int(param) - 1
                    elif str(param).lower() in ['forward', 'reverse']:
                        direction = str(param).lower()
                    elif str(param).lower() in ['includenan', 'omitnan']:
                        nanflag = str(param).lower()

                # 参数校验
                if dim is not None and dim not in [1, 2]:
                    return f"错误: 维度参数 dim 必须为 1 或 2,当前为 {dim}"
                if direction not in ['forward', 'reverse']:
                    return f"错误: 方向参数 direction 必须为 'forward' 或 'reverse',当前为 {direction}"
                if nanflag not in ['includenan', 'omitnan']:
                    return f"错误: nanflag 参数无效,当前为 {nanflag}"

                # 调用核心计算函数
                np_a = np.asarray(A.tolist(), dtype=float)
                result = cummin(np_a, dim=dim, direction=direction, nanflag=nanflag)

            else:
                # 输入为单一矩阵
                if not isinstance(input_expr, list):
                    raise ValueError(f"输入错误:{input_str}")
                else:
                    A = sp.Array(input_expr)
                    np_a = np.asarray(A.tolist(), dtype=float)
                    result = cummin(np_a)

            return result

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


    # 示例用法
    if __name__ == "__main__":
        # 创建示例数组
        # 测试不同参数组合
        # 默认参数
        print(cumulative_min_symbolic("[[3,5,2],[1,6,3],[7,8,1]]"))
        # [[3. 5. 2.]
        #  [1. 5. 2.]
        #  [1. 5. 1.]]

        # 指定维度
        print(cumulative_min_symbolic("[[3,5,2],[1,6,3],[7,8,1]],2"))
        # [[3. 3. 2.]
        #  [1. 1. 1.]
        #  [7. 7. 1.]]

        # 后向累积
        print(cumulative_min_symbolic("[[3,5,nan,4],[2,6,2,9],[1,3,0,nan]],backward"))
        # [[ 3.  5. nan  4.]
        #  [ 2.  5. nan  4.]
        #  [ 1.  3. nan nan]]

        # 忽略NaN
        print(cumulative_min_symbolic("[[3,5,nan,4],[2,6,2,9],[1,3,0,nan]],includenan"))
        # [[ 3.  5. nan  4.]
        #  [ 2.  5. nan  4.]
        #  [ 1.  3. nan nan]]

        # 指定维度
        print(cumulative_min_symbolic("[[[5, 3, 7],[2, 6, 1],[4, 2, 3]],[[8, 1, 5],[9, 4, 6],[3, nan, 2]]],2"))
        # [[[ 5.  3.  7.]
        #   [ 2.  3.  1.]
        #   [ 2.  2.  1.]]
        #
        #  [[ 8.  1.  5.]
        #   [ 8.  1.  5.]
        #   [ 3. nan  2.]]]
    
    
    累积乘积

    B = cumprod(A) 返回从 A 中大小不等于 1 的第一个数组维度的开头开始的 A 的累积乘积. 输出 B 的大小与 A 相同.

    如果 A 是向量,则 cumprod(A) 返回一个包含 A 元素累积乘积的向量.

    如果 A 是矩阵,则 cumprod(A) 返回一个包含 A 每一列累积乘积的矩阵.

    B = cumprod(A,dim) 返回沿维度 dim 的累积乘积. 例如如果 A 是矩阵, 则 cumprod(A,2) 返回每行的累积乘积.

    B = cumprod(___,direction) 使用任何先前的语法指定方向. 例如,cumprod(A,2,'reverse') 通过从第二维度的末尾到开头来返回 A 行内的累积乘积.

    B = cumprod(___,nanflag) 指定是否在计算中包含或省略 NaN 值, 适用于任何先前的语法. cumprod(A,'includenan') 在计算中包含所有 NaN 值, 而 cumprod(A,'omitnan') 则忽略它们.

    A — 输入数组,向量,矩阵.

    dim — 沿正整数标量进行运算的维度, 只支持1(默认)或2.

    direction — 累积方向, 'forward'(默认)| 'reverse'

    nanflag — NaN 条件,'includenan'(默认)| 'omitnan'
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np


    def cumulative_product_symbolic(input_str):
        """
        对标MATLAB的cumprod函数,计算多维数组的累积乘积

        参数:
        input_str: 输入的字符串,表示数组或包含参数的元组

        返回:
        累积乘积结果或错误信息
        """
        try:
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 处理输入元组
            if isinstance(expr, tuple):
                elements = list(expr)
                sp_array = sp.Array(elements[0]) if isinstance(elements[0], list) else None
                if sp_array is None:
                    return f"输入错误: 无法解析数组 {elements[0]}"

                params = elements[1:]
                dim = None
                direction = 'forward'
                nanflag = 'includenan'

                # 解析参数
                for param in params:
                    if isinstance(param, (int, sp.Integer)):
                        dim = int(param)
                    elif str(param).lower() in ['forward', 'reverse']:
                        direction = str(param).lower()
                    elif str(param).lower() in ['includenan', 'omitnan']:
                        nanflag = str(param).lower()

                # 将SymPy数组转换为NumPy数组
                np_arr = np.asarray(sp_array, dtype=float)

                # 处理NaN
                if nanflag == 'omitnan':
                    # 对于多维数组,不能直接删除NaN,转为1
                    np_arr = np.nan_to_num(np_arr, nan=1.0)
                # 处理方向参数
                if direction == 'reverse':
                    # 反转数组
                    if dim is not None:
                        # 沿指定维度反转
                        np_arr = np.flip(np_arr, axis=dim - 1)
                    else:
                        # 默认沿第一个非单例维度
                        dim = next((i + 1 for i, s in enumerate(np_arr.shape) if s > 1), 1)
                        np_arr = np.flip(np_arr, axis=dim - 1)

                # 处理维度参数 (MATLAB风格转为Python风格)
                axis = dim - 1 if dim is not None else None

                # 计算累积乘积
                result = np.cumprod(np_arr, axis=axis)

                # 如果是反向累积,需要再反转回来
                if direction == 'reverse':
                    if dim is not None:
                        result = np.flip(result, axis=dim - 1)
                    else:
                        result = np.flip(result, axis=axis)
            else:
                # 处理简单数组输入
                sp_array = sp.Array(expr) if isinstance(expr, list) else None
                if sp_array is None:
                    return f"输入错误: {input_str}"

                np_arr = np.asarray(sp_array, dtype=float)
                result = np.cumprod(np_arr)

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


    # 测试用例
    if __name__ == "__main__":
        # 测试用例1: 一维数组,默认参数
        print("测试1: 一维数组,默认参数")
        input1 = '[1, 2, 3, 4]'
        print(f"输入: {input1}")
        print(f"输出: {cumulative_product_symbolic(input1)}")
        print()
        # 输出: [ 1.  2.  6. 24.]

        # 测试用例2: 二维数组,指定维度2
        print("测试2: 二维数组,指定维度2")
        input2 = '([[1, 2, 3], [4, 5, 6]], 2)'
        print(f"输入: {input2}")
        print(f"输出: {cumulative_product_symbolic(input2)}")
        print()
        # 输出: [[  1.   2.   6.]
        #       [  4.  20. 120.]]

        # 测试用例3: 二维数组,反向累积
        print("测试3: 二维数组,反向累积")
        input3 = '([[1, 2, 3], [4, 5, 6]], "reverse")'
        print(f"输入: {input3}")
        print(f"输出: {cumulative_product_symbolic(input3)}")
        print()
        # 输出: [[ 4. 10. 18.]
        #       [ 4.  5.  6.]]

        # 测试用例4: 二维数组,忽略NaN
        print("测试4: 二维数组,忽略NaN")
        input4 = '([[1, nan, 3], [4, 5, nan]], "omitnan")'
        print(f"输入: {input4}")
        print(f"输出: {cumulative_product_symbolic(input4)}")
        print()
        # 输出: [ 1.  1.  3. 12. 60. 60.]

        # 测试用例5: 三维数组,指定维度3
        print("测试5: 三维数组,指定维度3")
        input5 = '([[[1, 2], [3, 4]], [[5, 6], [7, 8]]], 3)'
        print(f"输入: {input5}")
        print(f"输出: {cumulative_product_symbolic(input5)}")
        print()
        # [[[ 1.  2.]
        #   [ 3. 12.]]
        #
        #  [[ 5. 30.]
        #   [ 7. 56.]]]

        # 测试用例6: 三维数组,反向累积
        print("测试6: 三维数组,反向累积")
        input6 = '([[[1, 2], [3, 4]], [[5, 6], [7, 8]]], 2, "reverse")'
        print(f"输入: {input6}")
        print(f"输出: {cumulative_product_symbolic(input6)}")
        print()
        # [[[ 3.  8.]
        #   [ 3.  4.]]
        #
        #  [[35. 48.]
        #   [ 7.  8.]]]
    
    
    累积和

    B = cumsum(A) 返回从 A 中大小不等于 1 的第一个数组维度的开头开始的 A 的累积和.

    如果 A 是向量, 则 B 是包含 A 累积和的相同大小的向量.

    如果 A 是矩阵, 则 B 是包含 A 每一列累积和的相同大小的矩阵.

    B = cumsum(A,dim) 返回维度 dim 上元素的累积和. 例如如果 A 是矩阵, 则 cumsum(A,2) 返回沿 A 行计算的累积和.

    B = cumsum(___,direction) 指定任何先前语法的方向. 例如, cumsum(A,2,"reverse") 通过从第二维的末尾到开头计算,返回 A 行内的累积和.

    B = cumsum(___,nanflag) 指定是否在 A 中包含或忽略 NaN 值. 例如, cumsum(A,"omitnan") 在计算每个和时忽略 NaN 值. 默认情况下, cumsum 包含 NaN 值.

    A — 输入数组,向量,矩阵.

    dim — 沿正整数标量进行运算的维度, 只支持1(默认)或2.

    direction — 累积方向, 'forward'(默认)| 'reverse'

    nanflag — NaN 条件,"includemissing" (默认) | "includenan" | "omitmissing" | "omitnan"

    “includemissing” 或 “includenan” — 计算累积和时包含 A 中的 NaN 值. 一旦遇到 A 中的第一个 NaN 值, B 中的元素即为 NaN. “includemissing” 和 “includenan” 具有相同的行为.

    “omitmissing” 或 “omitnan” — 计算累积和时忽略 A 中的 NaN 值. 如果 A 具有连续的前导 NaN 值, 则 B 中的相应元素为 0. “omitmissing” 和 “omitnan” 具有相同的行为.
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np


    def cumulative_sum_symbolic(input_str):
        try:
            input_expr = sp.sympify(input_str)
            result = None

            def cumsum_matlike(a, dim=None, direction='forward', nanflag='includenan'):
                arr = np.asarray(a, dtype=float)

                # 处理NaN值
                if nanflag == 'omitnan':
                    arr = np.where(np.isnan(arr), 0, arr)

                # 确定累积维度 (MATLAB默认按列累积,即dim=1)
                if dim is None:
                    # 默认按列累积 (MATLAB行为)
                    axis = 0 if arr.ndim > 1 else 0
                else:
                    # 将MATLAB维度转换为NumPy维度
                    axis = dim - 1

                # 根据方向进行累积求和
                if direction == 'reverse':
                    # 反转数组,进行正向累积,然后反转回原顺序
                    reversed_arr = np.flip(arr, axis=axis)
                    cum_result = np.cumsum(reversed_arr, axis=axis)
                    result = np.flip(cum_result, axis=axis)
                else:  # 'forward'
                    result = np.cumsum(arr, axis=axis)

                return result

            # 解析输入表达式
            if isinstance(input_expr, tuple):
                A = sp.Array(input_expr[0])
                params = input_expr[1:]
                dim = None  # 默认让函数内部处理
                direction = 'forward'
                nanflag = 'includenan'

                # 解析参数
                for param in params:
                    if isinstance(param, (int, sp.Integer)):
                        dim = int(param)
                    elif str(param).lower() in ['forward', 'reverse']:
                        direction = str(param).lower()
                    elif str(param).lower() in ['includenan', 'omitnan']:
                        nanflag = str(param).lower()

                # 参数校验
                if dim is not None and dim not in [1, 2]:
                    return f"错误: 维度参数 dim 必须为 1 或 2,当前为 {dim}"
                if direction not in ['forward', 'reverse']:
                    return f"错误: 方向参数 direction 必须为 'forward' 或 'reverse',当前为 {direction}"
                if nanflag not in ['includenan', 'omitnan']:
                    return f"错误: nanflag 参数无效,当前为 {nanflag}"

                # 调用核心计算函数
                np_a = np.asarray(A.tolist(), dtype=float)
                result = cumsum_matlike(np_a, dim=dim, direction=direction, nanflag=nanflag)

            else:
                # 输入为单一矩阵
                A = sp.Array(input_expr)
                np_a = np.asarray(A.tolist(), dtype=float)
                result = cumsum_matlike(np_a)

            return result  # 转换为列表格式输出
        except Exception as e:
            return f"错误: {e}"


    # 测试修正后的代码
    print(cumulative_sum_symbolic("[[3,5,nan,4],[2,6,nan,9],[1,3,5,nan]],omitnan"))
    # 输出:
    # [[ 3.  5.  0.  4.]
    #  [ 5. 11.  0. 13.]
    #  [ 6. 14.  5. 13.]]
    
    
    符号向量场的旋度

    c = curl(V) 返回向量场 V 相对于由 V 中的符号变量构造的默认向量的旋度.

    通常情况下,向量场的旋度是对给定的函数关于变量 x,y 和 z 的偏导数而得到的,而不是针对特定的数值进行计算的.

    V — 三维符号向量场, 符号标量变量的向量
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import sympy.physics.vector as svt


    def curl_vector_field(input_str):
        """
         计算矢量场的旋度,对标MATLAB的curl函数。

         参数:
             input_str (str): 矢量场的三个分量的字符串表达式,例如 "[x*y, y*z, z*x]"

         返回:
             tuple: 旋度的三个分量的SymPy表达式,或错误信息字符串。
         """
        try:
            F_expr = sp.sympify(input_str)
            # 检查输入是否为三个分量的列表
            if not isinstance(F_expr, tuple) or len(F_expr) != 3:
                return "错误: 输入必须是包含三个分量的列表,例如 '[x*y, y*z, z*x]'"

            # 创建一个参考坐标系

            N = svt.ReferenceFrame('N')

            # 将表达式中的符号变量替换为 N[0]、N[1] 和 N[2]
            F_expr_substituted = [expr.subs({'x': N[0], 'y': N[1], 'z': N[2]}) for expr in F_expr]

            # 将表达式转换为矢量场
            F = F_expr_substituted[0] * N.x + F_expr_substituted[1] * N.y + F_expr_substituted[2] * N.z

            # 计算矢量场的旋度
            result = svt.curl(F, N)
            # 计算每个分量的值
            # 将 result_x 中的 N.x 替换为 x,N.y 替换为 y,N.z 替换为 z
            result = result.subs({N[0]: sp.symbols('x'), N[1]: sp.symbols('y'), N[2]: sp.symbols('z')})

            result_x = result.dot(N.x)
            result_y = result.dot(N.y)
            result_z = result.dot(N.z)
            # 使用 f-string 组成结果字符串并返回

            return result_x, result_y, result_z
        except Exception as e:
            return f"错误: {e}"


    if __name__ == "__main__":
        # 示例输入
        input_str = "(x*y, y*z, z*x)"
        print(f"输入矢量场: {input_str}")

        # 计算旋度
        result = curl_vector_field(input_str)

        # 输出结果
        if isinstance(result, tuple):
            print("\n旋度计算结果:")
            print(f"x分量: {result[0]}")
            print(f"y分量: {result[1]}")
            print(f"z分量: {result[2]}")
            # x分量: -y
            # y分量: -z
            # z分量: -x
        else:
            print(result)

        # 另一个示例:无旋场
        input_str2 = "(y, x, 0)"
        print(f"\n输入矢量场: {input_str2}")
        result2 = curl_vector_field(input_str2)
        if isinstance(result2, tuple):
            print("\n旋度计算结果:")
            print(f"x分量: {result2[0]}")
            print(f"y分量: {result2[1]}")
            print(f"z分量: {result2[2]}")
            # x分量: 0
            # y分量: 0
            # z分量: 0
        else:
            print(result2)
    
    
    输入角的余割(以弧度为单位)

    Y = csc(X) 返回X的元素的余割.csc函数按元素处理数组.该函数同时接受实数和复数输入.

    对于X的实数值,csc(X)返回区间[-∞, - 1] 和 [1, ∞]内的实数值.

    对于X的复数值,csc(X)返回复数值.

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


    def cosine_theta_value(input_str):
        """
        计算输入表达式或矩阵的余割值 (csc)

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

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

            # 处理元组类型输入 (不支持)
            if isinstance(expr, tuple):
                error = True
            # 处理矩阵类型输入
            # 处理数值或符号表达式
            elif expr.is_number:
                z = complex(expr)
                result = 1 / np.sin(z)
            elif expr.free_symbols:
                result = sp.csc(expr).evalf()  # 计算余割并转为浮点数
            else:
                error = True

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

        except Exception as e:
            return f"错误: {e}"  # 返回异常信息


    def main():
        """示例入口程序,演示不同输入情况下的行为"""
        test_inputs = [
            "pi/2",  # (1+0j)
            "2",  # (1.0997501702946164+0j)
            "x",  # csc(x)
        ]

        for inp in test_inputs:
            print(f"输入: {inp}")
            result = cosine_theta_value(inp)
            print(f"结果: {result}\n{'-' * 30}")


    if __name__ == "__main__":
        main()
    
    
    输入角的余割(以度为单位)

    Y = cscd(X) 返回X元素的余割,以度为单位表示.

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


    def cosine_theta_degree(input_str):
        """
        计算输入表达式(矩阵、数值或符号)的余割(csc)值,角度以度数表示。

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

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

            # 处理元组输入(视为无效)
            if isinstance(expr, tuple):
                error = True
            # 处理矩阵输入
            # 处理数值或符号表达式
            elif expr.is_number:
                # 数值处理:将输入转换为NumPy数组(支持标量和向量)
                z = complex(expr)
                # 将角度转换为弧度
                x_rad = z * np.pi / 180
                # 计算正弦值
                sin_values = np.sin(x_rad)

                # 计算余割值(1/sin(x))
                result = 1 / sin_values

            elif expr.free_symbols:
                result = sp.csc(expr * sp.pi / 180)
            # 其他类型视为错误
            else:
                error = True

            # 根据错误标志返回结果或错误信息
            return result if not error else f"输入错误: {input_str}"

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


    if __name__ == '__main__':
        # 示例1:计算30度的余割(应返回2.0)
        input1 = '30'
        result1 = cosine_theta_degree(input1)
        print(f"输入: {input1}\n结果: {result1}\n")
        # 结果: (2.0000000000000004+0j)

        # 示例2:符号计算(返回符号表达式)
        input2 = 'x'
        result2 = cosine_theta_degree(input2)
        print(f"输入: {input2}\n结果: {result2}\n")
        # 结果: csc(pi*x/180)
    
    
    双曲余割

    Y = csch(X) 返回X的元素的双曲余割.csch函数按元素处理数组.该函数同时接受实数和复数输入.所有的角度都以弧度表示.

    X — 角度(度),标量值,向量,矩阵
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp


    def cosine_theta_hyperbolic(input_str):
        """
        对输入的字符串表达式进行处理,计算双曲余割值。

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

        返回:
        如果输入有效,返回计算结果;否则返回错误信息。
        """
        try:
            # 将输入的字符串转换为 SymPy 表达式
            expr = sp.sympify(input_str)
            # 初始化错误标志和结果变量
            error = False
            result = None

            # 检查表达式是否为元组,如果是则标记为错误
            if isinstance(expr, tuple):
                error = True
            # 检查表达式是否为数字或包含自由符号
            elif expr.is_number or expr.free_symbols:
                # 若为数字或包含自由符号,对表达式应用双曲余割函数并求值
                result = sp.csch(expr).evalf()
            else:
                # 其他情况标记为错误
                error = True

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

        except Exception as e:
            # 若处理过程中出现异常,返回错误信息
            return f"错误:{e}"


    def main():
        """
        主程序,用于测试 cosine_theta_hyperbolic 函数。
        """
        # 测试输入:单个数字
        input1 = "2"
        result1 = cosine_theta_hyperbolic(input1)
        print(f"输入: {input1}, 结果: {result1}")
        # 结果: 0.275720564771783

        # 测试输入:包含符号的表达式
        x = sp.Symbol('x')
        input3 = str(x)
        result3 = cosine_theta_hyperbolic(input3)
        print(f"输入: {input3}, 结果: {result3}")
        # 结果: csch(x)


    if __name__ == "__main__":
        main()
    
    
    累积梯形数值积分

    Q = cumtrapz(Y) 通过梯形法按单位间距计算 Y 的近似累积积分. Y 的大小确定求积分所沿用的维度.

    如果 Y 是向量, 则 cumtrapz(Y) 是 Y 的累积积分.

    如果 Y 是矩阵, 则 cumtrapz(Y) 是每一列的累积积分.

    Q = cumtrapz(X,Y) 根据 X 指定的坐标或标量间距对 Y 进行积分.

    如果 X 是坐标向量, 则 length(X) 必须等于 Y 的大小不等于 1 的第一个维度的大小.

    如果 X 是标量间距, 则 cumtrapz(X,Y) 等于 X*cumtrapz(Y).

    Q = cumtrapz(___,dim) 使用上述任意语法沿维度dim求积分. 必须指定Y,也可以指定X. 如果指定X,则它可以是长度等于 size(Y,dim) 的标量或向量. 例如, 如果Y是矩阵, 则 cumtrapz(X,Y,2) 对 Y 的每一行进行累积积分.

    Y — 数值数据, 向量, 矩阵, 符号表达式

    X — 点间距, 1 (默认),均匀的标量间距,坐标向量

    dim — 沿其运算的维度, 正整数标量 (二维矩阵只有列或行,dim值为1或2)
    
    # Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
    # Licensed under the MIT License.
    import sympy as sp
    import numpy as np
    from scipy import integrate


    def cumulative_integrate_trapezoid(input_str):
        """
        对标MATLAB的cumtrapz函数,实现累积梯形积分

        支持以下输入格式:
        1. 单个数组: cumulative_integrate_trapezoid('[1,2,3]')
        2. 元组(x,y): cumulative_integrate_trapezoid('([1,2,3], [4,5,6])')
        3. 元组(x,y,axis): cumulative_integrate_trapezoid('([1,2,3], [[4,5,6],[7,8,9]], 2)')
        4. 符号表达式: cumulative_integrate_trapezoid('([1,2,3], x**2)')

        参数:
        input_str: 表示输入的字符串

        返回:
        积分结果数组或错误信息
        """


        try:
            expr = sp.sympify(input_str)
            error = False
            result = None


            def symbolic_cumtrapz(y_expr, x, x_vals):
                cumulative_integral = [0.0]  # 初始为0
                for i in range(1, len(x_vals)):
                    x0 = x_vals[i - 1]
                    x1 = x_vals[i]
                    y0 = y_expr.subs(x, x0)
                    y1 = y_expr.subs(x, x1)
                    integral_segment = (y0 + y1) * (x1 - x0) / 2
                    current = cumulative_integral[-1] + integral_segment
                    cumulative_integral.append(current)
                return cumulative_integral


            if isinstance(expr, tuple) and len(expr) > 2:
                x = sp.Matrix(expr[0]) if isinstance(expr[0], list) else None
                y = sp.Matrix(expr[1]) if isinstance(expr[1], list) else None
                if x is not None and y is not None and expr[2] in [1, 2]:
                    axis = expr[2] - 1
                    n_x = np.ravel(np.array(x, dtype=float))
                    n_y = np.array(y, dtype=float)
                    result = integrate.cumtrapz(n_y, n_x, axis=axis, initial=0)
                else:
                    error = True
            elif isinstance(expr, tuple) and len(expr) == 2:
                x = sp.Matrix(expr[0]) if isinstance(expr[0], list) else None
                y = sp.Matrix(expr[1]) if isinstance(expr[1], list) else None
                if x is not None and y is not None:
                    n_x = np.ravel(np.array(x, dtype=float))
                    n_y = np.array(y, dtype=float)
                    result = integrate.cumtrapz(n_y, n_x, initial=0)
                elif x is not None and expr[1].free_symbols:
                    y_expr = expr[1]
                    y_symbol = list(y_expr.free_symbols)[0]
                    x_vals = np.ravel(np.array(x, dtype=float))
                    result = symbolic_cumtrapz(y_expr, y_symbol, x_vals)
                else:
                    error = True
            elif isinstance(expr, list):
                x = sp.Matrix(expr)
                n_x = np.ravel(np.array(x, dtype=float))
                result = integrate.cumtrapz(n_x, initial=0)
            else:
                error = True

            if error:
                return f"输入错误: {input_str}"
            else:
                # 转换为SymPy矩阵
                if isinstance(result, np.ndarray):
                    result = result.tolist()
                res_matrix = sp.Matrix(result)
                if res_matrix.shape[1] == 1:
                    return res_matrix.T.tolist()[0]  # 返回向量列表
                else:
                    return res_matrix
        except Exception as e:
            return f"错误: {e}"


    def main():
        """
        主函数,用于演示 cumulative_integrate_trapezoid 函数的使用。
        """
        # 示例 1: 输入为数据点间距为 1 的向量的累积积分
        input_str1 = "[1,4,9,16,25]"
        result1 = cumulative_integrate_trapezoid(input_str1)
        print(f"输入: {input_str1}\n结果: {result1}\n")
        # 结果: [0, 2.50000000000000, 9.00000000000000, 21.5000000000000, 42.0000000000000]

        # 示例 2: 输入为计算数据点间距均匀但不等于 1 的向量的累积积分
        input_str2 = "[0,pi/5,2*pi/5,3*pi/5,4*pi/5,pi],sin(x)"
        result2 = cumulative_integrate_trapezoid(input_str2)
        print(f"输入: {input_str2}\n结果: {result2}\n")
        # 结果: [0, 0.184658183049046, 0.668099582572247, 1.26566601552056, 1.74910741504376, 1.93376559809281]

        # 示例 3: 输入为对具有非均匀数据间距的矩阵的行进行累积积分
        input_str3 = "[1,2.5,7,10],[[5.2,7.7,9.6,13.2],[4.8,7,10.5,14.5],[4.9,6.5,10.2,13.8]],2"
        result3 = cumulative_integrate_trapezoid(input_str3)
        print(f"输入: {input_str3}\n结果: {result3}\n")
        # 结果: Matrix([[0, 9.67500000000000, 48.6000000000000, 82.8000000000000],
        #              [0, 8.85000000000000, 48.2250000000000, 85.7250000000000],
        #              [0, 8.55000000000000, 46.1250000000000, 82.1250000000000]])

    if __name__ == "__main__":
        main()
    
    
    其列周期性重复的矩阵

    A = cycol(n,k)返回具有周期性重复列的 n×n 矩阵,其中一个周期由 randn(n,k) 定义的列构成.因此,矩阵 A 的秩不能超过k, k必须是标量. 参量k是标量, 默认值为 round(n/4),它不需要整除 n.

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


    def cycol_matrix(input_str):
        """
        根据输入的字符串生成循环矩阵。输入应为形如 "(n, k)" 的字符串,
        其中 n 和 k 是正整数,分别表示矩阵的行数和列数。

        参数:
            input_str (str): 格式为 "(n, k)" 的字符串

        返回:
            sp.Matrix: 生成的循环矩阵,或错误信息字符串
        """
        try:
            # 将输入字符串转换为SymPy表达式
            expr = sp.sympify(input_str)
            error = False
            result = None

            # 检查输入是否为包含两个正整数的元组
            if (isinstance(expr, tuple) and  # SymPy元组类型检查
                    len(expr) == 2 and  # 必须包含两个元素
                    all(arg.is_integer for arg in expr) and  # 两个元素都必须是整数
                    int(expr[0]) > 0 and  # n必须为正整数
                    int(expr[1]) > 0):  # k必须为正整数

                n = int(expr[0])
                k = int(expr[1])

                def generate_cycol_matrix(n, k):
                    """
                    生成n行k列的循环矩阵,每列是前一列的循环下移

                    参数:
                        n (int): 行数
                        k (int): 列数

                    返回:
                        np.ndarray: 生成的循环矩阵
                    """
                    base_col = np.arange(1, n + 1)  # 生成基础列 [1, 2, ..., n]
                    # 生成k个循环移位列,i列是基础列下移i次
                    columns = [np.roll(base_col, shift=i) for i in range(k)]
                    return np.column_stack(columns)  # 将列合并为矩阵

                result = generate_cycol_matrix(n, k)
            else:
                error = True

            if error:
                return f"输入错误: 需要两个正整数的元组,例如'(3,4)'。收到:{input_str}"
            else:
                return sp.Matrix(result)  # 转换为SymPy矩阵返回

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


    if __name__ == "__main__":
        # 示例用法
        print("正确输入示例:")
        test_cases = [
            "(3, 4)",
            # Matrix([[1, 3, 2, 1],
            #         [2, 1, 3, 2],
            #         [3, 2, 1, 3]])

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

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

        for case in test_cases:
            print(f"\n输入: {case}")
            print("输出矩阵:")
            print(cycol_matrix(case))
    
    
    圆柱坐标是一种在三维空间中描述点位置的方法,它使用径向距离 rr,极角 θθ,和垂直于极坐标平面的高度 zz.

    这种坐标系统通常用于描述具有柱状对称性的物体,例如圆柱体或柱形物体.

    CylindricalPlot3D(L,r1,r2,options)

    L是具有两个变量的过程或表达式,或三个此类过程或表达式的列表

    r1,r2是表达式变量的范围.

    柱坐标3D图

        1. 基础形状变体:

        角向调制曲面: 锥面叠加3个角向波瓣,形成三叶旋转对称

        CylindricalPlot3D((1+0.5sin(3phi))r,r=[0,1],phi=[0,2@pi])

        径向振荡: 径向5个完整振荡周期,振幅受角向轻微调制

        CylindricalPlot3D(sin(5@pi*r)*(1+0.2*cos(phi)),r=[0,1],phi=[0,2@pi])

        2. 复杂曲面:

        螺旋抛物面: 抛物面基础上叠加螺旋状扭曲,扭曲度随半径增加

        CylindricalPlot3D((2+sin(phi+3r))*(r^2),r=[0,1],phi=[0,2@pi])

        分瓣结构: 四瓣花形结构,瓣叶根部(r=0)高度为0

        CylindricalPlot3D((0.5+0.5*abs(sin(2phi)))*sqrt(r),r=[0,1],phi=[0,2@pi])

        双曲马鞍面: 四个交替起伏的鞍形区域(双曲抛物面)

        CylindricalPlot3D(r*cos(2phi),r=[0,1],phi=[0,2@pi])

        极坐标高斯峰: 中心尖锐峰值,角向形成4个对称波瓣

        CylindricalPlot3D(exp(-10r^2)*cos(4phi),r=[0,1],phi=[0,2@pi])

        3. 动态调制曲面:

        频率耦合波纹: 抛物面叠加径向10波+角向5波的干涉图案

        CylindricalPlot3D((1+0.3*sin(10r)*cos(5phi))*r^2,r=[0,1],phi=[0,2@pi])

        衰减驻波: 角向8个强波瓣,振幅随半径指数衰减

        CylindricalPlot3D(sin(8phi)*exp(-3r),r=[0,1],phi=[0,2@pi])

        相位偏移结构: 径向振荡与角向绝对值函数的耦合

        CylindricalPlot3D(r*abs(cos(phi))*sin(5@pi*r),r=[0,1],phi=[0,2@pi])

        4. 特殊效果:

        分形轮廓: 自相似纹理,同时具有径向和角向高频振荡

        CylindricalPlot3D(r^(0.7)*(1+0.2*sin(16phi)*sin(8@pi*r)),r=[0,1],phi=[0,2@pi])

    多曲面柱坐标3D图

    将多个柱坐标曲面组合在一张图中, 直接观察多个相关曲面的空间关系, 揭示物理场之间的相互作用, 快速评估不同参数配置下的整体效果, 捕获系统在特定时刻的多层状态.

        1. 旋转机械设计(涡轮叶片)

        同时可视化叶片几何形状、表面压力分布和温度场,优化气动冷却设计

        CylindricalPlot3D(r^2*(1+0.2*sin(5phi)), // 压力分布曲面
                          0.8(1+0.1*cos(3phi))r, // 叶片几何表面
                          exp(-2r)*(1+0.3sin(phi)), // 温度场分布
                          r=[0,1],phi=[0,2@pi])

        2. 化学工程(催化反应器)

        同步展示反应物扩散、催化剂表面活性和热分布,优化反应器设计

        CylindricalPlot3D(1-exp(-3r)*(1+0.2*sin(2phi)), // 反应物浓度
                          r^0.5*(0.5+0.1*cos(4phi)),    // 催化剂活性
                          0.3*(1-r)*(1+0.3*sin(3phi)),  // 温度梯度
                          r=[0,1],phi=[0,2@pi])

        3. 地质勘探(油气储层)

        三维集成显示储层物性参数,指导钻井轨迹设计和采收率优化

        CylindricalPlot3D(r*(0.8+0.2*sin(3phi)),         // 岩层孔隙度
                          0.6*exp(-r)*(1+0.4*cos(2phi)), // 渗透率分布
                          0.3*(1-r^2)*(1+0.3*sin(phi)),  // 含油饱和度
                          r=[0,1],phi=[0,2@pi])

        4. 生物医学(血管支架)

        同时显示支架几何、血流动力学特征和药物释放分布

        CylindricalPlot3D((1+0.1*cos(6phi))*(1-(r-0.7)^2),     // 支架几何
                          0.2*r*(1+0.3*sin(2phi)),             // 血流速度
                          exp(-5(r-0.5)^2)*(0.4+0.1*sin(phi)), // 药物浓度
                          r=[0.4,1],phi=[0,2@pi])