2017-02-07 2 views
2

Я пытаюсь написать программу Fortran 90 для выполнения метода Эйлера для решения ode с использованием адаптивного шага времени.Повторение этапа в цикле Фортрана

У меня есть оператор if внутри цикла do while, в котором я проверяю, что ошибка на каждой итерации кода меньше определенного допуска. Однако, если это не меньше определенного допуска, я должен изменить определенное значение (размер шага) и выполнить расчет снова, чтобы получить новую ошибку для сравнения с допуском.

Это выглядит примерно так (и простите меня, это мой первый раз с помощью этого веб-сайта):

do while (some condition) 
    (Get an approximation to the ODE with various subroutine calls) 
    (Calculate the error) 
if (error < tol) 
    step = step/2 
else 
    step = 2*step 
(Something that will return to the top of my do while loop) 
end if 
end do 

Скажем, например, у меня был do while (i < 4), где i начинается на 1, и моя ошибка была не менее моя терпимость, мне пришлось бы снова повторить вычисление для i=1 с новым размером шага.

Надеюсь, это имеет смысл для тех из вас, кто это прочитал. Если вам нужно какое-либо разъяснение, дайте мне знать.

ответ

1

Поскольку в цикле do while нет явного счетчика, в отличие от обычного цикла do i=1,.... вы можете просто использовать cycle, чтобы начать новую итерацию. Это будет то же самое, что и повторение текущей итерации. Но условие будет снова оценено. Если это не должно быть оценено, вам нужно будет использовать go to или перестроить свой код.

Или другой цикл, вложенный внутри основного контура, может быть лучше, но это, вероятно, считается реструктуризацией, упомянутой выше. Зависит от того, какое условие, как вы меняете step и i и как зависит от step и i.

+0

И что, если это был обычный цикл? Благодаря! – Sorey

+0

Было бы одинаково. Но вы должны думать о прилавке. «Цикл» переходит к следующей итерации и увеличивает счетчик. Это может быть хорошо или нет, это зависит от вашего использования. Или вы всегда можете использовать 'goto'. Или вы можете иметь еще один вложенный цикл внутри основного цикла. –

+0

Проблема в том, что вы говорите «например, я делал while (i <4)», но неясно, как вы меняете «i» и когда, поэтому вы должны знать, что делать, мы не видим его в ваш код. –

Смежные вопросы