这是我对上周的寻根作业的解决方案。
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)
以下是对这个问题的一些观察:
现在我们知道了如何在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))
以下是关于此解决方案需要注意的一些事项。