2016-12-27 125 views
1

我试图计算这个方程的整数解:与|ax + by + cz - d| < epsilon避免让太多的嵌套循环

所以我想用1 1的解决方案

ax + by + cz = dx, y, z

“DO”like this

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的方法?

+0

我不是Fortran专家,但这只是一个简单的等式而已。 '**'用于电源操作,如果这应该是一个增量循环,则可以简单地定义变量并将它们递增。例如,当'i = max','i = 1'和'i2 = i2 + 1'直到'i2 = max',然后增加'i1'等等。这将全部发生在单个循环中。 [Fortan Operators](https://www.obliquity.com/computer/fortran/operate.html) - 会使这个'd =(A ** x)+(B ** y)+(C ** z )'大致 –

+1

谢谢你,pst作为取信誉的答案! –

+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