我的第一个解根作业

这是我对上周的寻根作业的解决方案。

a = 1 b = 2 pa = a**4-3*a**2 + 2*a-1 pb = b**4-3*b**2 + 2*b-1 while b- a > 0.0001: c = (a + b)/2 pc = c**4-3*c**2 + 2*c-1 if pa < 0 and pc < 0: a = c pa = pc else: b = c pb = pc print(“根在”,a,“ and ”之间,b)

注意,由于我们在这门课上没有见过函数,我不得不计算p(a) p(b)和p(c)的值,而不使用函数。

一个更小的解决方案

我的解和你们很多人在作业中提交的解很相似。

对于任何给定的问题,都可能有许多不同的解决方案。下面是一个更短的替代解决方案。这个解决方案利用了问题的一些特殊特征。

a = 1 b = 2 while b - a > 0.0001: c = (a + b)/2 pc = c**4-3*c**2 + 2*c-1 if pc < 0: a = c else: b = c print(“根在”,a,“ and ”之间,b)

以下是对这个问题的一些观察:

  1. 我们事先知道p(a) < 0 p(b) < 0。
  2. 该算法的目标是使a和b更靠近,同时保持p(a)和p(b)的符号不变。
  3. 当我们计算c和p(c)时,我们把a移到p(a)和p(c)符号相同的地方。因为我们已经知道p(a) < 0,我们只需要检查p(c) < 0。如果是,则设a = c。同样,如果p(c) > 0,则设b = c。

使用函数

现在我们知道了如何在Python中编写函数,很自然地要重写这个程序来使用函数。我还将利用这个机会展示另一种计算a = c还是b = c的方法。

defp (x):返回x**4 - 3*x**2 + 2*x - 1 a = 1 b = 2 while b - a > 0.0001: c = (a + b)/2 if p(a)*p(c) > 0: a = c else: b = c print(“根在”,a,“和”,b之间)

这个解的逻辑利用了这样的观察如果p(a)和p(c)有相同的符号那么它们的乘积将是正的。

将解决方案打包成一个函数

由于我们已经成功地实现了寻找根的算法,最后一步是构造一个函数,将这个解决方案打包起来,以便我们可以在其他程序中使用它作为寻找函数根的方法。

defbisection (f,a,b,tolerance = 0.0001): "““ ”在a和b之间找到x的f(x)的根。注意,a必须小于b, f(a)和f(b)必须有相反的符号才能正确工作。”如果f(a)*f(c) > 0: a = c否则:b = c return (a+b)/2 def p(x): return x**4-3*x**2 + 2*x-1 print(“根是近似的”,bisection(p,1,2))

以下是关于此解决方案需要注意的一些事项。

  1. Python允许将一个函数作为参数传递给另一个函数。二分函数的第一个参数就是我们要求其根的函数。当我们调用平分函数时,我们在第一个参数中将多项式函数p传递给平分函数。
  2. bissection函数中的第四个参数是默认参数的一个示例。当调用该函数时,我们可以选择是否要将第四个参数传递给等分函数。如果我们不传递第四个参数,bissection将默认使用0.0001作为公差值。