Intel Visual Fortran 用の OpenGL モジュールを用いてロジスティック方程式によるカオス図形を描きます。
DEC/Compaq Visual Fortran でも実行可能だと思います。
支那の王朝末期には、飢饉・戦乱で人口が大きく減るようですが、歴代支那の人口をプロットすると、野生動物に見られるようなロジスティック方程式に従う人口変動が見られるかもしれません。
なお WinMain 関数を実行ルーチンに用いているので、リンカーの Subsystem を WinMain にする必要があります。
MODULE mod_draw USE dfopngl CONTAINS INTEGER (KIND=4) FUNCTION drawit() IMPLICIT NONE INTEGER :: i, j REAL (KIND = 4) :: point CALL fglClearColor(0.0, 0.0, 0.0, 0.0) CALL fglClear(GL_COLOR_BUFFER_BIT) point = 1.0 CALL fglPointSize(point) CALL fglColor3f(1.0, 1.0, 0.0) DO i = 0, 500 CALL fglBegin(GL_POINTS) CALL chaos(i) CALL fglEnd END DO CALL fglFlush drawit = 0 ! to suppress warning END FUNCTION drawit !---------------------------------------------------------------- SUBROUTINE chaos(ix) IMPLICIT NONE INTEGER, INTENT(IN) :: ix REAL (KIND = 8), PARAMETER :: rmin = 1.5d0, rmax = 3.0d0, pmin = 0.0d0, pmax = 1.5d0 INTEGER :: i REAL (KIND = 8) :: p, r, x, y x = REAL(ix, KIND = 8) r = (rmax - rmin) * x / 500.0d0 + rmin! windowsize = 500 p = 0.3d0 DO i = 1, 50 p = p + r * p * (1.0d0 - p) END DO DO i = 51, 100 IF (p > pmin .AND. p < pmax) THEN y = ( p - pmin ) * 500.0d0 / ( pmax - pmin ) CALL fglVertex2f(REAL(x, KIND = 4), REAL(y, KIND = 4)) END IF p = p + r * p * (1.0d0 - p) END DO RETURN END SUBROUTINE chaos END MODULE mod_draw !============================================================== INTEGER (KIND = 4) FUNCTION WinMain( hInstance, hPrevInstance, lpszCmdLine, nCmdShow ) !DEC$ ATTRIBUTES STDCALL, DECORATE, ALIAS : 'WinMain' :: WinMain USE dfwin USE mod_draw IMPLICIT NONE INTEGER (KIND = 4) :: hInstance, hPrevInstance,lpszCmdLine, nCmdShow INTEGER (KIND = 4) :: iret ! OpenGL CALL fauxInitDisplayMode(IOR(AUX_SINGLE, AUX_RGBA)) CALL fauxInitPosition(0, 0, 500, 500) iret = fauxInitWindow("OpenGL DEC FORTRAN Chaos"C) CALL fauxMainLoop(loc(drawit)) WinMain = 0 RETURN END FUNCTION WinMain