2012-03-16 43 views
4

我需要檢查虛部是否非常小,如果它是爲了消除一些浮點錯誤,當它應該爲零時導致非常小的非零虛部,則將其設置爲零。如何將複數的虛數部分設置爲零?

我的代碼如下:

kz2 = SQRT((n2*(2.0*PI*eta))**2 - kxarray(p)**2) 
kz1 = SQRT((n1*(2.0*PI*eta))**2 - kxarray(p)**2) 

if (aimag(kz2) < 0.0005) then 
    kz2 = (REAL(kz2),0.0) 
end if 

if (aimag(kz1) < 0.0005) then 
    kz1 = (REAL(kz1), 0.0) 
end if 

不幸的是,編譯器只是返回:

gaussian1.f90:122.18: 

kz2 = (REAL(kz2),0.0) 
       1 
Error: Expected a right parenthesis in expression at (1) 

gaussian1.f90:126.18: 

kz1 = (REAL(kz1), 0.0) 
       1 
Error: Expected a right parenthesis in expression at (1) 

任何意見,將不勝感激 - 我我甚至要對這個問題的正確方法?

更新:我設法通過使用以避免該問題:

if (aimag(kz2) < 0.0005) then 
    kz2 = real(kz2) 
end if 

if (aimag(kz1) < 0.0005) then 
    kz1 = real(kz1) 
end if 

但我會怎麼做,如果我想設置虛部非零量?

回答

9

我認爲您正在尋找CMPLX函數,它將實數或整數參數轉換爲複數。所以,你比如說你應該能夠做這樣的事情:

kz1 = cmplx(real(kz1), 0.) 

你已經嘗試了(1.0,1.0)風格括號表示法只適用於常值,而不是形成從變量保存的值的複數。

+0

謝謝 - 這看起來正是我想要的。 我猜複雜變量的賦值只能取參數,而不是變量或表達式作爲參數? 我以前習慣在C/Python/Matlab中進行編程,因此我必須使用函數而不是直接賦值來設置它,這一事實對我來說並不明顯。 對不起,這樣一個微不足道的問題。 – 2012-03-16 11:28:22

+0

@AlexMcMurray:是的,複雜賦值的'(,)'符號只適用於常量。你需要'cmplx'函數來使用編譯時不知道的數量。我會更新我的答案,包括這一點。如果這個答案解決了你的問題,你可以考慮[接受它](http://meta.stackexchange.com/a/5235/163653)。 – talonmies 2012-03-16 11:57:13

8

在Fortran 2008中,還有更多的可能性。您可以訪問實部和虛部作爲派生類型組件,例如

a = c%re 
    b%im = 5 

因此,設置的新的編譯器z零虛部可以嘗試z%im = 0