避免制作太多嵌套循环

时间:2016-12-27 20:06:36

标签: loops fortran

我试图计算这个等式的整数解:

ax + by + cz = d

x, y, z

|ax + by + cz - d| < epsilon

所以我一步一步地尝试解决方案&#34; DO&#34;像这样

DO i1=1,max
DO i2=1,max
DO i=1,max
aux=abs(&
 d(1)*tazasmin(1)*i1+d(2)*tazasmin(2)*i2+&
 d(3)*tazasmin(3)*i3+d(4)*tazasmin(4)*i4+d(5)*tazasmin(5)*i5+&
 d(6)*tazasmin(6)*i6 &
+d(7)*tazasmin(7)*i7+d(8)*tazasmin(8)*i8+d(9)*tazasmin(9)*i9&
+d(10)*tazasmin(10)*i10+d(11)*tazasmin(11)*i11+d(12)*tazasmin(12)*i12 &
+d(13)*tazasmin(13)*i13+d(14)*tazasmin(14)*i14&
+d(15)*tazasmin(15)*i15+d(16)*tazasmin(16)*i16-tse)    
    IF (aux<=epsilon) THEN
       //save the solutions.
    END IF
END DO
END DO
END DO

我知道如何修复长方程部分(使其优雅和美观),但有没有办法避免过度使用DO?

1 个答案:

答案 0 :(得分:1)

我猜你真的想要遍历所有16个值..尝试这样的事情:

  implicit none
  integer,parameter  :: nvar = 4
  integer, parameter :: max = 3
  integer varray(nvar)
  integer c,k
  do c=1,max**nvar
     do k=1,nvar            
        varray(k)=mod((c-1)/max**(nvar-k),max)+1
     enddo
! now your expresion is like:
     aux=abs(total(d*tazasmin*varray))
! assuming d and tazasmin are apporpriately declared arrays        
  enddo
  end

如果max很大

,这个计算显然会变得非常大