在while循环中添加约束

时间:2019-03-27 08:39:37

标签: python while-loop

尝试使用while循环以数值方式求解方程。但我需要一个物理解决方案来回答> 0。

试图将x> 0放入循环和while循环的条件中,但我仍然得到否定的结果。这只是类似代码的示例代码,因此可能不会产生负面结果,但我只想知道如何在循环中添加约束。

def f(x):
    xold=x
    tol=0.001
    rel=1
    itr=0
    while (rel>tol):
        itr=itr+1
        xnew=2+1/xold
        rel=abs(xnew-xold)/abs(xold)
        xold=xnew
    return xnew

在网上找不到有关如何将约束放入循环中的任何信息。

1 个答案:

答案 0 :(得分:1)

首先,我认为您的示例代码中存在一些错误。您从xnew(而不是x)创建xold,并且在每次迭代结束时,将xold分配给xnew,而不是相反。结果是您的示例是一个无限循环。

第二,要解决实际问题,让我们举一个更简单的例子:

def f(x):
    xold = x
    while (xold > 0):
        xnew = xold - 1
        #print("old: %s new: %s" % (xold, xnew))
        xold = xnew
    return xnew

result = f(x=3.1)
print(result)

这给出一个负数。要了解原因,请取消注释函数中的print语句,然后检查输出。它给出:

old: 3.1 new: 2.1
old: 2.1 new: 1.1
old: 1.1 new: 0.10000000000000009
old: 0.10000000000000009 new: -0.8999999999999999

问题在于循环创建了一个测试用例,如果该测试用例失败,则循环退出。您正在返回测试用例,包括最后一个成功的用例。将返回值更改为xold即可。

(此外,请注意,如果输入x小于0,则编写的代码将产生错误,因为xnew从未在循环中定义。)

如果while语句中不包含其他条件(通常是某些情况),则可以在break子句中使用if语句来终止循环:

xold = 3.1
while True:
    xnew = xold - 1 
    if xnew <= 0:  # some condition not considered in the while
        break
    xold = xnew

同样,这使xold成为通过附加条件的最后一件事。