二分递归未按预期工作(Python)

2024-10-03 04:38:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经确定了一个要使用的区间(从Python绘制的图中)——我的区间是[4,6]。我已经写了一个程序(没有完全完成),因此1)我取区间的中点(leftintervalwall,rightintervalwall),看看它是否给我0作为输出。2) 否则,该中点现在将成为新的leftintervalwall(RightIntervalWall保持不变)

我已经更新了代码:但是,当我在找到根时计算函数的输出时,得到的值为1.014,这是不正确的。它应该接近于0。所以我不确定代码中的漏洞在哪里。非常感谢

def continousfunction(xpoint):
    output = float(np.power(xpoint, 2) - np.log1p(1 + xpoint) - 30)
    return output;


                        
def processinterval(a, b):
    
        intervalmidpoint = (a + b) / 2
        return intervalmidpoint;
        

   
def findroot(a, b, accuracy):
    if(continousfunction(a) < 0 and continousfunction(b) > 0):
        bisection(a, b, accuracy)
        

        
def bisection(a, b, accuracy):
        
            
                intervalmidpoint = processinterval(a,b)
            
                if(continousfunction(intervalmidpoint) < 0):
                    a = intervalmidpoint
                    return bisection(intervalmidpoint, b, accuracy)
                    
                    
                
                print(continousfunction(intervalmidpoint))
   

def main():
    
    
    
    a = 4
    b = 6
    accuracy = 0.002
    findroot(a, b, accuracy)
    
    
main()     
    

Tags: 代码outputreturnifdefnp区间accuracy
1条回答
网友
1楼 · 发布于 2024-10-03 04:38:25

这里是一个关于如何实现二分法的示例。为了避免递归错误,我添加了一个精度参数。我还对另一个函数test1做了额外的测试

[您的递归打印始终在同一时间间隔内]

def bisection(a, b, accuracy=0.002):
    midpoint = (a+b)/2
    f_m = func(midpoint)

    if abs(f_m) < accuracy:
        return midpoint
    
    # same sign
    if func(a) > 0 and f_m > 0 or func(a) < 0 and f_m < 0:
        return bisection(midpoint, b, accuracy=accuracy)
    if func(b) > 0 and f_m > 0 or func(b) < 0 and f_m < 0:
        return bisection(a, midpoint, accuracy=accuracy)
    # opposite sign
    if func(a) > 0 and f_m < 0 or func(a) < 0 and f_m > 0:
        return bisection(a, midpoint, accuracy=accuracy)
    if func(b) > 0 and f_m < 0 or func(b) < 0 and f_m > 0:
        return bisection(midpoint, b, accuracy=accuracy)


# test 1
def func(x):
    return x**3 -x -2

# initial boundaries of the interval
a, b = 1, 2
accuracy = .002

try:
    print(bisection(a, b, accuracy = .002))
except RecursionError:
    print('No root found with that accuracy limit')

# test 2
def func(x):
    return float(np.power(x, 2) - np.log1p(1 + x) - 30)

# initial boundaries of the interval
a, b = 4, 6
accuracy = .002

try:
    print(bisection(a, b, accuracy = .002))
except RecursionError:
    print('No root found with that accuracy limit')

输出

1.521484375 # for test 1
5.66015625  # for test 2

相关问题 更多 >