交错数列函数

    W = AlternatingSeries(a,n)把a解析成交错队列.

    这个函数近似于交替序列中给定的实数.

    结果以列表形式返回,每个元素都是有理数。

    a是实数, n是队列长度.

    1. 数学常数逼近

    π/4 的莱布尼茨公式近似

    AlternatingSeries(@pi/4,8)
    #输出 :[33/32, -1/3, 1/5, -1/7, 1/9, -1/11, 1/13, -1/15]

    ln(2) 的交错级数近似

    AlternatingSeries(ln(2),7)
    #输出: [75/86, -1/3, 1/5, -1/7, 1/9, -1/11, 1/13]

    arctan(1) = π/4

    AlternatingSeries(atan(1),6)
    #输出: [101/97, -1/3, 1/5, -1/7, 1/9, -1/11]

    2. 物理常数近似

    ln(2) 的数值近似

    AlternatingSeries(0.693147, 5)
    #输出: [85/99, -1/3, 1/5, -1/7, 1/9]

    π/4 的数值近似

    AlternatingSeries(0.785398, 6)
    #输出: [101/97, -1/3, 1/5, -1/7, 1/9, -1/11]

    3. 工程应用

    控制系统中的临界阻尼比

    AlternatingSeries(0.5,5)
    #输出: [2/3, -1/3, 1/5, -1/7, 1/9]

    1/√2 近似值(信号处理中常见)

    AlternatingSeries(0.7071,6)
    #输出: [26/27, -1/3, 1/5, -1/7, 1/9, -1/11]

    4. 金融数学

    10%利率的某种表示

    AlternatingSeries(0.1,4)
    #输出: [35/93, -1/3, 1/5, -1/7]

    5%利率的表示

    AlternatingSeries(0.05,5)
    #输出: [20/93, -1/3, 1/5, -1/7, 1/9]

    5. 特殊值测试

    零值

    AlternatingSeries(0,5)
    #输出: [16/97, -1/3, 1/5, -1/7, 1/9]

    单位值

    AlternatingSeries(1,5)
    #输出: [113/97, -1/3, 1/5, -1/7, 1/9]

    负单位值

    AlternatingSeries(-1,5)
    #输出: [-81/97, -1/3, 1/5, -1/7, 1/9]

    6. 边界情况

    接近1的值

    AlternatingSeries(0.999,5)
    #输出: [78/67, -1/3, 1/5, -1/7, 1/9]

    接近0的值

    AlternatingSeries(0.001,5)
    #输出: [1/6, -1/3, 1/5, -1/7, 1/9]

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

    def qikjik_alternating_series(input_str):
        """
        计算交错数列,并将其转换为有理数形式。

        参数:
        input_str: 输入的字符串表达式,可以是一个数或一个元组(起始点,项数)。

        返回:
        如果输入有效,则返回交错数列的有理数形式列表;否则返回错误信息。
        """
        try:
            # 将输入字符串转换为 SymPy 表达式
            expr = sp.sympify(input_str)

            # 如果输入是元组,解析起始点和项数
            if isinstance(expr, tuple):
                starting_point = sp.N(expr[0])  # 起始点
                num_terms = expr[1]  # 项数
            else:
                starting_point = sp.N(expr)  # 默认起始点
                num_terms = 10  # 默认项数

            # 计算莱布尼茨级数的部分和
            leibniz_series = [((-1) ** i) / (2 * i + 1) for i in range(int(num_terms))]
            current_sum = sum(leibniz_series)

            # 调整级数以匹配起始点
            leibniz_series[0] += starting_point - current_sum

            # 将级数中的浮点数转换为分数形式
            fraction_list = [Fraction(str(number)).limit_denominator(100) for number in leibniz_series]

            # 将分数转换为 SymPy 的有理数形式
            rational_list = [sp.Rational(fraction.numerator, fraction.denominator) for fraction in fraction_list]

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


    def main():
        """
        主函数,用于演示 alternating_series_calculate_leibniz 函数的使用。
        """
        # 示范代码
        input_examples = [
            "0",  # 默认起始点,默认项数 #结果: [23/96, -1/3, 1/5, -1/7, 1/9, -1/11, 1/13, -1/15, 1/17, -1/19]
            "(1, 5)",  # 起始点为 1,项数为 5 #结果: [113/97, -1/3, 1/5, -1/7, 1/9]
        ]

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


    if __name__ == "__main__":
        main()