首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在while-loop中添加约束

在while-loop中添加约束
EN

Stack Overflow用户
提问于 2019-03-27 16:39:37
回答 1查看 520关注 0票数 0

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

我尝试将x>0同时放在循环中和while循环的条件中,但我仍然得到否定的结果。这只是一个例子代码,我有类似的东西,所以这可能不会给出负的结果,但我只想知道如何在循环中加入约束。

代码语言:javascript
复制
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

我没有在网上找到任何关于如何在循环中放置约束的信息。

EN

回答 1

Stack Overflow用户

发布于 2019-03-27 17:54:57

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

其次,为了解决实际问题,我们来举一个更简单的例子:

代码语言:javascript
复制
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语句的注释,并检查输出。它提供了:

代码语言:javascript
复制
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语句中没有包含额外的条件(通常是一些边缘情况),您可以在if子句中使用break语句来终止循环:

代码语言:javascript
复制
xold = 3.1
while True:
    xnew = xold - 1 
    if xnew <= 0:  # some condition not considered in the while
        break
    xold = xnew

同样,这使得xold成为最后一个通过额外标准的东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55372880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档