【问题标题】:Repeating a step in a Fortran loop在 Fortran 循环中重复一个步骤
【发布时间】:2017-02-07 21:39:32
【问题描述】:

我正在尝试编写一个 Fortran 90 程序来执行 Euler 的方法来使用自适应时间步来求解 ode。

我在do while 循环内有一个if 语句,我在其中检查代码每次迭代的错误是否小于某个容差。但是,如果不小于某个公差,我必须改变某个值(步长)并再次进行计算,以获得新的误差与公差进行比较。

看起来像(原谅我这是我第一次使用这个网站):

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 &lt; 4),其中 i 从 1 开始,并且我的误差不小于我的容差,我将不得不以新的步长再次为 i=1 重复计算。

我希望这对阅读本文的人有意义。如果您需要任何澄清,请告诉我。

【问题讨论】:

    标签: fortran fortran90 ode


    【解决方案1】:

    因为与普通的do i=1,... 循环不同,do while 循环中没有明确的计数器。您可以使用cycle 开始新的迭代。这将与重复当前迭代相同。但条件将被再次评估。如果不应该对其进行评估,您将不得不使用go to 或重组您的代码。

    或者嵌套在主循环中的另一个循环可能会更好,但这可能算作上面提到的重组。取决于条件是什么,如何更改 stepi 以及公差如何取决于 stepi

    【讨论】:

    • 如果它只是一个普通的 do 循环呢?谢谢!
    • 应该是一样的。但你必须考虑柜台。 Cycle 进入下一次迭代并增加计数器。这可能好与不好,这取决于您的使用情况。或者您可以随时使用goto。或者你可以在主循环中再嵌套一个循环。
    • 问题是你说“比如我做了while (i i的,什么时候改的,所以你必须知道该怎么做,我们在您的代码中看不到它。
    • 对不起。真正的代码从 0 到 120。我每一步增加 0.001,但这个数字会根据每一步的错误而变化。如果错误太大,我必须增加一个较小的量来尝试纠正错误。如果误差足够小,我会增加更大的量。这有意义吗?
    • 有点。我会考虑嵌套循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多