Добавление ограничения в цикл while - PullRequest
0 голосов
/ 27 марта 2019

Попытка решить уравнение численно, используя цикл 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 Ответ

1 голос
/ 27 марта 2019

Во-первых, я думаю, что в вашем примере кода есть некоторые ошибки.Вы создаете 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 никогда не будет определен вloop.)

Если есть дополнительный критерий, не включенный в оператор 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 последним, прошедшим дополнительный критерий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...