python 二分法求方程的根

Python021

python 二分法求方程的根,第1张

import matplotlib.pyplot as plt

a=3

b=-2

x=(a+b)/2.0 # 中点

def f(x): # 定义方程式

y=x-2**0.5

return(y)

u=max([a,b])

l=min([a,b])

i=0

z=[]

est=[]

# 循环体

while abs(f(x))>10.0**(-15.0): # 计算精度

if f(u)*f(l)>0: # 判断输入假设是否成立

print('Error: Assumption not holds! ')

break

if f(x)*f(u)>0: # 判断零点落入区间

u=x

x=(x+l)/2.0

else:

l=x

x=(x+u)/2.0

i=i+1

z=z+[abs(x-2**0.5)]

est=est+[abs(a-b)/2**i]

plt.semilogy(z)

plt.semilogy(est)

plt.grid('on')

plt.legend(['simu','theo'])

plt.show()

代码有两个地方有问题

1:19行的return缩进有问题,19行的return不应该出现在一个非方法的地方

2: 代码有可能出现死循环,在我输入a:10, b:10, c:10, d:10的时候出现死循环,请检查代码逻辑

我已经调整好了

def f(x):

    s=(a*x)**3+(b*x)**2+(c*x)+d

    return s

a=int(input("a"))

b=int(input("b"))

c=int(input("c"))

d=int(input("d"))

mid = 0

for i in range(-100,100,1):

    x1=int(i)

    x2=int(i+1)

    if f(x1)*f(x2)<0:

        lo,hi=x1,x2

        while hi-lo>0.01:

            mid=(lo+hi)/2

            if f(lo)*f(mid)<0:

                hi=mid

            else:

                lo=mid

    else:

        pass

print mid

第一,用F是为了让你不要搞混,如果错了方便修改

第二 ..{$N+} 是用{}括起来的,在pascal里不进行运行,你用pascal界面打开会发现字的颜色是灰的,这说明了这只起到一个标示作用,去掉也可以

第三 program是用来定义文件名的,在pascal书里有,可以去掉,直接打var