Python: 二分法
Python: bisection method
我正在尝试编写一个程序来确定给定函数的零点 (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))
这是第一个问题:
z=(a+b)/2
while b-a>10**(-5):
您需要在每次迭代中计算一个新的 z
,而不仅仅是在函数的开头。
第二题第 1 部分:
b=(a+z)/2
第二题第2部分:
a=(z+b)/2
设置 upper/lower 边界 在 lower/upper 边界和中心点之间是不正确的。它们应该准确地设置在中心点。
正确的实现(为清晰起见略作简化 - 无需将整个函数输入五遍):
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。如果起始区间不包含根,代码也会失败。您可能也想检查一下这种情况。
我正在尝试编写一个程序来确定给定函数的零点 (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))
这是第一个问题:
z=(a+b)/2
while b-a>10**(-5):
您需要在每次迭代中计算一个新的 z
,而不仅仅是在函数的开头。
第二题第 1 部分:
b=(a+z)/2
第二题第2部分:
a=(z+b)/2
设置 upper/lower 边界 在 lower/upper 边界和中心点之间是不正确的。它们应该准确地设置在中心点。
正确的实现(为清晰起见略作简化 - 无需将整个函数输入五遍):
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。如果起始区间不包含根,代码也会失败。您可能也想检查一下这种情况。