牛顿二分的无限循环

时间:2016-10-18 01:46:59

标签: fortran fortran90 gfortran

function setCode() {
    var textbox1 = document.getElementById('textbox1');
    var textbox2 = document.getElementById('textbox2');
    var divResult = document.getElementById('divResult');
    var c = ['azimuth','background','background-attachment',
    'background-color','background-image',
    'background-position','background-repeat',
    'behavior','border','border-bottom',
    'border-bottom-color','border-bottom-style',
    'border-bottom-width','border-collapse',
    'border-color','border-left','border-left-color',
    'border-left-style','border-left-width','border-right',
    'border-right-color','border-right-style',
    'border-right-width','border-spacing','border-style',
    'border-top','border-top-color','border-top-style',];

var code0 = ( function set(C0) {
        return ( C0 +=
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    [Math.floor(Math.random()*10)])
    && (C0.length == 3) ? C0 : set(C0);
    }
)('');
    textbox1.value =  code0;
    divResult.innerHTML = c[textbox1.value];
    var t;
    t = setTimeout('setCode()', 1000);

}

使用这个子程序我试图解决

的零点

program main implicit none double precision x0, a, b x0 = -3 call findzero(x0) contains function f(x) implicit none double precision x,f f = SIN(x) - exp(-x) end function function fprime(x) implicit none double precision fprime, x fprime = COS(x) + exp(-x) end function subroutine findbracket(x0,a,b) implicit none double precision x0, a, b double precision fa, fb double precision dx dx = 0.001d0 a = x0 b = x0 do fa = f(a) fb = f(b) !print*,"bracket[", a, b, "]" a = a - dx if (fa*fb < 0) then exit end if b = b + dx if (fa*fb < 0) then exit end if dx = dx*2 end do end subroutine subroutine findzero(x0) implicit none double precision x0, a, b double precision p, tol while (x0 <11) do x0 = -3 print*, "what is x0", x0 call findbracket(x0,a,b) call newtonbisection (p,a,b,tol) print*, "this is x0, x", x0, p x0 = x0 + 1 end do end subroutine

f(x) = sinx - e^-x

我有子工作x0 = -3, -2, ..., 10findbracket。使用newtonbisection我打算得到[a,b]并使用那些a和b,我想为每个x0找到p。

当我编译时,我的代码陷入无限循环,我试着注释掉

findbracket

所以我认为问题出在call newtonbisection (p,a,b,tol) 。但是,如果我只是使用子程序来查找带有findbracket的{​​{1}},那么它可以工作,但不能在我将它们组合时使用。

为什么我有无限循环?

2 个答案:

答案 0 :(得分:2)

让我们缩小这个循环:

 do while (x0 < 11)
    x0 = -3
    call findbracket(x0, a, b)
    x0 = x0 + 1
end do

只要x0小于11,就会执行此循环。在循环内部,您明确将x0设置为减3,然后调用使用x0的子例程,最后增加x0

我没有看到findbracket例程中x0的值会更改的任何位置,因此在通话结束时它仍然是-3。然后它增加1,所以它现在-2,它仍然小于11,所以循环再次开始。它做的第一件事就是将x0重置为-3,整个spiel再次从同一点开始。

因此条件x0 < 11将始终为真,因为在每次迭代中,x0都会重置为-3。循环永远不会退出。你的程序挂了。

您需要将x0 = -3移到循环之前,如下所示:

x0 = -3
do while (x0 < 11) 
    call findbracket(x0, a, b)
    x0 = x0 + 1
end do

这样,x0在循环的每次迭代中都不会重置为-3,最终会变得大于11,以便循环结束。

答案 1 :(得分:0)

&#34;无限&#34; for循环实现如下:

do

   ** Some executable statements

   if (conditional_statement) exit
end do 

简而言之,重复执行一组语句,直到满足条件语句,即

conditional_statement .eqv. .true.

发生这种情况时,程序控制会跳转到do构造后面的下一个可执行语句。