尝试为结果低于某个值后停止的函数创建循环

时间:2017-11-04 22:05:34

标签: python function for-loop range

我参加了一个初级蟒蛇课,我们获得的一部分练习就是:

  

具有属性x = sin(x)-ax + 30的点x被称为函数f(x)= sin(x)-ax + 30的固定点。它可以用所谓的固定点计算迭代:x(i + 1)= sin(x(i)) - ax(i)+ 30,其中上标(i)表示迭代计数器。在这里,您可以找到一段Python代码,它执行此

的前200个步骤
x=0.5
a=0.5
for i in range(200):
  x = sin(x) - a*x + 30
print('The result after {num} iterations is {res}.'.format(num=i, res=x))
  

修改代码,使其在| x(i + 1)-x(i)|之后立即停止迭代< 10-8。此外,如果在200次迭代步骤中未满足此条件,则应打印一条消息。使用= 0.5和a = 8

测试代码

我已经尝试过这样做,但我没有随处可见。这就是我到目前为止,我们非常感谢任何帮助。

x = 0.5
a = 8
iterations = 0

for i in range(y):
    x = sin(x) - a*x + 30
    if abs(x**(i+1) - x**i) < 1.e-8:
        break
    elif i > 200:
        iterations += 1

print('The result after {num} iterations is {res}.'.format(num=i, res=x))

if iterations > 0:
    print('The condition was not met within 200 iteration steps.')

1 个答案:

答案 0 :(得分:1)

为了看看迭代过程中发生了什么,我建议在原始代码中(在用所需的缩进校正后)或代码中将print(i, x)添加到循环中。您可以在提交之前将其删除。

原始代码和您的代码缺少from math import sin。发布的代码应该可以运行,包括所需的导入。

您发布的代码忽略了定义y=200,但没有必要为指定的问题添加该代码。在任何情况下,for i in range(y)都会给出值0,1,...,199。您的条件i > 200永远不会成立。如果循环不中断,最简单的方法是使用else:子句。或者,您可以将iterations替换为更具描述性的failure,并更正您的情况。

结合Tom K的评论,可行的代码是

from math import sin

x = 0.5
a = 0.5
for i in range(200):
    x1 = sin(x) - a*x + 30
    print(i, x)  # remove before submitting
    if abs(x1 - x) < 1.e-8:
        break
    x = x1
else:
    print('The condition was not met within 200 iteration steps.')

print('The result after {num} iterations is {res}.'.format(num=i, res=x))

打印a = .5和8:

The result after 59 iterations is 20.649274368307022.

The condition was not met within 200 iteration steps.
The result after 199 iterations is -1.1949487767945635e+181.