繁体   English   中英

Python Hw,二分法

[英]Python Hw, bisection Method

A 部分 - 二分法编写一个 function 称为二分法(n,p),要求用户输入数学 function f(x)和两个边界点,以便使用二分法求解 r 使得 f(r)= 0。 当找到解决方案 r 或达到最大迭代次数 n(默认 n = 100)时,以先发生者为准,function 终止。

def bisection(n = 100, p = 0.0001):
  # code goes below

  fx = input("f(x) = ")
  a = float(input("Boundary A: "))
  x = a
  fa = eval(fx)

  b = float(input("Boundary B: "))
  x = b
  fb = eval(fx)

  i = 0

  if (fa * fb >= 0):
    print("Bisection method fails")
    return
  while(i < n):
    m = a + b / 2
    x = m
    fm = eval(fx)


    if(fm * fa < 0):
      a = a
      b = m
    if (fm * fb < 0):
      a = m
      b = b
    i = i + 1
    if (fm == 0):
      return m




  pass

当我输入时: f(x) = x - 1 边界 A:0 边界 B:3

没有打印答案所以我很困惑?!

这段代码有很多问题。 出于某种原因,您定义了 p 并且再也没有通过它,我认为它代表 epsilon。 您将中点定义为

a+b/2

这相当于

一个+(乙/ 2)

但你需要

(a+b)/2

. 陈述

如果(fm == 0):

这个语句可能永远不会运行,因为在几次迭代中很难接近根。

相反,使用

如果(绝对值(fm<p)):

修改代码

def bisection(n = 250, p = 10**-6):
  # code goes below

    fx = input("f(x) = ")
    a = float(input("Boundary A: "))
    x = a
    fa = eval(fx)
    b = float(input("Boundary B: "))
    x = b
    fb = eval(fx)

    for i in range(1, n+1):
        m = (a + b)/2
        x = m
        fm = eval(fx)


        if(fm * fa < 0):
            a = a
            b = m
        elif (fm * fa > 0):
            a = m
            b = b
        elif (abs(fm<p)):
            return m




print(bisection())

Output:

f(x) = x - 1
Boundary A: 0
Boundary B: 3
1.0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM