Python:二分法

时间:2017-05-18 13:43:40

标签: python function plot bisection

我正在尝试编写一个程序来确定给定函数的零点(f(x):= ln((sin(x **(1/2))** 3)+ 2) - 1,使用二分法方法。值a和b,它们是二分法中使用的初始值,已经插入到程序中。所有它需要做的就是显示图并确定零,但我无法得到它运行(它在第22行停止)。任何人都可以发现错误吗?

import matplotlib.pyplot as plt
import numpy as np
import math

t = np.arange(0.5, 6.0, 0.01)
s = np.log((np.sin(np.sqrt(t)))**3+2)-1
z = len(t)*(0.0,)
plt.plot(t, s, t, z)

plt.xlabel('x')
plt.ylabel('f(x)')
plt.title('A procura do zero')
plt.grid(True)
plt.savefig("test.pdf")
plt.show()


def bisseçao(a,b):
    z=(a+b)/2
    while b-a>10**(-5):
        if (math.log((math.sin(math.sqrt(a)))**3+2)-1)*(math.log((math.sin(math.sqrt(z)))**3+2)-1)<0:
            b=(a+z)/2
        if (math.log((math.sin(math.sqrt(b)))**3+2)-1)*(math.log((math.sin(math.sqrt(z)))**3+2)-1)<0:
            a=(z+b)/2 
    return a

a1=1
b1=2
a2=4
b2=5

print("Os zeros são:",bisseçao(a1,b1),bisseçao(a2,b2))  

1 个答案:

答案 0 :(得分:2)

这是第一个问题:

z=(a+b)/2
while b-a>10**(-5):

您需要在每次迭代中都使用新的z,而不仅仅是在函数的开头。

第二个问题第1部分:

b=(a+z)/2

第二个问题第2部分:

a=(z+b)/2

在下限/上限和中心点之间设置上限/下限不正确。它们应该准确地设置在中心点。

正确实施(为了清晰起见,进行了简单的简化 - 无需输入五次整个功能):

func = lambda x: np.log((np.sin(np.sqrt(x)))**3+2)-1

def bisseçao(a, b):    
    while b-a>10**(-5):
        z = (a + b)/2
        if func(a)*func(z)<0:
            b = z
        if func(b)*func(z)<0:
            a = z
    return a

P.S。如果z恰好落在根目录下,代码将遇到问题。您可能希望明确检查此情况。

P.P.S。如果起始间隔不包含根,则代码也将失败。您可能也想检查这种情况。