2016-06-23 28 views
0

我必须使用圆方程x² + y² = 1xy-11,在每个步骤中增加0.1创建一个圆形网格。如何在Fortran 90中创建循环网格?

我已经尝试了许多不同的事情,但都失败了,所以我会很高兴如果有人能帮助我。

我的一个尝试是:attempt one

PROGRAM cir 
    IMPLICIT real*8(a-h, o-z) 

    real :: x(20,20), py(20,20), ny(20,20) 

    delx = -1.1 
    dely = -1.1 

    DO i=1,20 
     delx = delx + 0.1 

     DO j=1.20 

      x(i,j) = delx 

      ny(i,j)= -1.0 * SQRT (1.0 - (x(i,j)**2)) 
      py(i,j)= SQRT (1.0 - (x(i,j)**2) ) 

      PRINT*, x(i,j), ny(i,j), py(i,j) 

     END DO 


    END DO 

    STOP 

END PROGRAM cir 

而另:attempt two

PROGRAM circle 

    IMPLICIT real*8(a-h,o-z) 

    real*8 :: x(20,20), y(20,20), z(20,20) 

    delx = -1.0 
    dely = -1.0 

     DO i = 1, 20 
     delx = delx + 0.1 

     DO j = 1 , 20 
      dely = dely + 0.1 
      x(i,j) = delx 
      y(i,j) = dely 


      z(i,j) = x(i,j)**2 + y(i,j)**2 -1.0 


     END DO 
     delx = -1.0 
     dely = -1.0 

     PRINT*, x(i,j), y(i,j) 


    END DO 

    STOP 

END PROGRAM circle 
+0

圆形网格很模糊。你想要什么类型的结果? – innoSPG

+0

作为最终结果你想要什么?一个布尔数组,如果点在线上?他们几乎从不上线,因为你只有一些点。一个布尔数组,如果点在里面?你应该写了x²+y²<1。你想实现什么? –

+2

可能有助于展示你的尝试。 – agentp

回答

2

我们有一个很艰难的时间来了解你想要达到的目标。目前,有两种可能性:

可能性1:你想对应的xy值的网格,-1.01.0告诉我们之间0.1增量此网格点是否是内部还是有一圈外1.半径

下面是这样一个方案可能是什么样子的例子,它的输出:

program my_circle 
    implicit none 
    logical :: cir(-10:10, -10:10) 
    real :: x, y 
    integer :: i, j 

    do i = -10, 10 
     do j = -10, 10 
      x = i/10.0 
      y = j/10.0 
      cir(j, i) = ((x**2 + y**2) <= 1.0) 
     end do 
    end do 

    write(*, '(21A2)') print_cir(cir) 

contains 

    elemental function print_cir(c) 
     ! returns " X" if true, " ." otherwise 
     implicit none 
     logical, intent(in) :: c 
     character(len=2) :: print_cir 

     if (c) then 
      print_cir = " X" 
     else 
      print_cir = " ." 
     end if 
    end function print_cir 

end program my_circle 

输出:

. . . . . . . . . . X . . . . . . . . . . 
. . . . . . X X X X X X X X X . . . . . . 
. . . . X X X X X X X X X X X X X . . . . 
. . . X X X X X X X X X X X X X X X . . . 
. . X X X X X X X X X X X X X X X X X . . 
. . X X X X X X X X X X X X X X X X X . . 
. X X X X X X X X X X X X X X X X X X X . 
. X X X X X X X X X X X X X X X X X X X . 
. X X X X X X X X X X X X X X X X X X X . 
. X X X X X X X X X X X X X X X X X X X . 
X X X X X X X X X X X X X X X X X X X X X 
. X X X X X X X X X X X X X X X X X X X . 
. X X X X X X X X X X X X X X X X X X X . 
. X X X X X X X X X X X X X X X X X X X . 
. X X X X X X X X X X X X X X X X X X X . 
. . X X X X X X X X X X X X X X X X X . . 
. . X X X X X X X X X X X X X X X X X . . 
. . . X X X X X X X X X X X X X X X . . . 
. . . . X X X X X X X X X X X X X . . . . 
. . . . . . X X X X X X X X X . . . . . . 
. . . . . . . . . . X . . . . . . . . . . 

可能性2:您需要描述圆自身的x/y坐标列表。然而,在这种情况下,增量为0.1毫无意义,因为每个象限只有3个点在网格和圆上:(1.0/0.0),(0.8/0.6)和(0.6/0.8 )。

因此,对于这个可能性我已经创建了一个小程序,打印出的点的给定数量(目前36)周围的圆,计算x和y与三角函数:

program my_circle2 
    implicit none 
    integer, parameter :: num_points = 36 
    real, parameter :: pi = 4.0 * ATAN(1.0) ! Best way to calculate PI 

    integer :: i 
    real :: r 
    real, dimension(2, num_points) :: cir 

    do i = 1, num_points 
     r = 2.0 * pi * real(i)/real(num_points) 
     cir(1, i) = sin(r) 
     cir(2, i) = cos(r) 
    end do 

    do i = 1, num_points 
     write(*, '(I5, 3F8.4)') i, cir(:, i), my_dist(cir(:, i)) 
    end do 

contains 

    function my_dist(c) 
     ! Calculates the distance of (c(1)/c(2)) from origin 
     ! for verification 
     implicit none 
     real, dimension(2), intent(in) :: c 
     real :: my_dist 
     my_dist = sqrt(c(1)**2 + c(2)**2) 
    end function my_dist 

end program my_circle2 

输出:

1 0.1736 0.9848 1.0000 
    2 0.3420 0.9397 1.0000 
    3 0.5000 0.8660 1.0000 
    4 0.6428 0.7660 1.0000 
    5 0.7660 0.6428 1.0000 
    6 0.8660 0.5000 1.0000 
    7 0.9397 0.3420 1.0000 
    8 0.9848 0.1736 1.0000 
    9 1.0000 -0.0000 1.0000 
    10 0.9848 -0.1736 1.0000 
    11 0.9397 -0.3420 1.0000 
    12 0.8660 -0.5000 1.0000 
    13 0.7660 -0.6428 1.0000 
    14 0.6428 -0.7660 1.0000 
    15 0.5000 -0.8660 1.0000 
    16 0.3420 -0.9397 1.0000 
    17 0.1736 -0.9848 1.0000 
    18 -0.0000 -1.0000 1.0000 
    19 -0.1736 -0.9848 1.0000 
    20 -0.3420 -0.9397 1.0000 
    21 -0.5000 -0.8660 1.0000 
    22 -0.6428 -0.7660 1.0000 
    23 -0.7660 -0.6428 1.0000 
    24 -0.8660 -0.5000 1.0000 
    25 -0.9397 -0.3420 1.0000 
    26 -0.9848 -0.1736 1.0000 
    27 -1.0000 0.0000 1.0000 
    28 -0.9848 0.1736 1.0000 
    29 -0.9397 0.3420 1.0000 
    30 -0.8660 0.5000 1.0000 
    31 -0.7660 0.6428 1.0000 
    32 -0.6428 0.7660 1.0000 
    33 -0.5000 0.8660 1.0000 
    34 -0.3420 0.9397 1.0000 
    35 -0.1736 0.9848 1.0000 
    36 0.0000 1.0000 1.0000 

是你想要的吗?

+0

这是第二种可能!这正是我想要的。非常感谢你。我试图用圆方程来描绘这些点,但你说的完全正确:我应该使用三角函数。 –