代码之家  ›  专栏  ›  技术社区  ›  user405381

将伪代码翻译成python(割线方法)

  •  0
  • user405381  · 技术社区  · 7 年前

    首先,实现由最接近零的f(x)=exp(x)-sin(x)定义的f函数。

    添加以下内容

    -相对测试:abs(x^k-x ^{k-1})/abs(x ^{k})\leq delta

    在每次迭代中打印出迭代数k、当前根的值和当前f值。打印20位数的浮点数。

    这是我必须完成的代码:

    import numpy as np
    from math import exp, sin
    import matplotlib.pyplot as plt
    
    def f(x: float) -> float:
        return
    
    def secant(x0: float, x1: float, f, epsilon: float, delta: float, iter_max: int) -> float:
        return
    

    input: x_0, x_1, delta, epsilon, iter_max
    fx_0 <- f(x_0); fx_1 <- f(x_1)
    output: 0, x_0, fx_0
    output: 1, x_1, fx_1
    for k = 2 to iter_max do
        if |fx_0| > |fx_1| then
            x_0 <-> x_1; fx_0 <-> fx_1
        end if
        s <- (x_1 - x_0) / (fx_1 - fx_0)
        x_1 <- x_0
        fx_1 <- fx_0
        x_0 <- x_0 - fx_0 * s
        fx_0 <- f(x_0)
    
        output: k, x_0, fx_0
        if |fx_0| < epsilon or |x_1 - x_0| < delta then stop
    end do
    

    这是我自己的尝试:

    def f(x: float) -> float:
        return exp(x) - sin(x) == 0
    
    def secant(x0: float, x1: float, f, epsilon: float, delta: float, iter_max: int) -> float:
        fx0 = f(x0)
        fx1 = f(x1)
        return 0, x0, fx0
        return 1, x1, fx1
    
        for k in range(2, iter_max):
            if abs(fx0) > abs(fx1):
                x0 = x1
                x1 = x0
                fx0 = fx1
                fx1 = fx0
    
                s = (x1 - x0) / (fx1 - fx0)
                x1 = x0
                fx1 = fx0
                x0 = x0 - fx0 * s
                fx0 = f(x0)
    
            return k, x0, fx0
    
            if abs(fx0) < epsilon or abs(x**k - x**(k - 1))/ abs(x**(k))  <= delta:
                break
    

    root = secant(-3.5, -2.5, f, 0.00000000001, 0.000001, 10) 
    print(root) 
    

    我得到:(0,-3.5,False)。所以它实际上没有进行任何迭代。我该怎么修?

    :
    enter image description here

    这里:a=x\u 0,b=x\u 1,M=iter\u max。
    我希望输出如下: enter image description here

    1 回复  |  直到 7 年前
        1
  •  1
  •   eyllanesc RAHUL KUMAR    7 年前

    您的实现存在以下错误:

    • 第二个错误是由于没有阅读算法的目标并理解其过程而导致的,如果它说:


    output: 0, x_0, fx_0
    output: 1, x_1, fx_1
    

    表示iter_max分别为0或1时的结果。

    • 第三,在交换价值的形式是不够的,你必须使用一个数据透视,因为否则会删除相关信息

    • 我不明白的另一件事是,您执行了以下操作: abs(x**k - x**(k - 1))/ abs(x**(k)) 而不是 abs(x1 - x0) .

    def f(x: float) -> float:
        return exp(x) - sin(x)
    
    def secant(x0: float, x1: float, f, epsilon: float, delta: float, iter_max: int) -> float:
        fx0 = f(x0)
        fx1 = f(x1)
        if iter_max == 0:
            return 0, x0, fx0
    
        elif iter_max == 1:
            return 1, x1, fx1
    
        for k in range(2, iter_max):
            if abs(fx0) > abs(fx1):
                tmp =  x0
                x0 = x1
                x1 =tmp
                tmp = fx0
                fx0 = fx1
                fx1 = tmp
    
            s = (x1 - x0) / (fx1 - fx0)
            x1 = x0
            fx1 = fx0
            x0 = x0 - fx0 * s
            fx0 = f(x0)
            if abs(fx0) < epsilon or abs(x1 - x0)  <= delta:
                break
        return k, x0, fx0
    
    
    root = secant(-3.5, -2.5, f, 0.00000000001, 0.000001, 10) 
    
    print(root)
    

    输出:

    (5, -3.183063011933318, 4.7351012000262926e-14)