एफएफटी पॉइसन सॉल्वर का अभिसरण दर


16

एफएफटी ज़हर सॉल्वर के लिए सैद्धांतिक अभिसरण दर क्या है?

मैं एक प्वासों समीकरण को हल कर रहा हूँ: के साथ n ( एक्स , वाई , जेड ) = 3

2वीएच(एक्स,y,z)=-4πn(एक्स,y,z)
डोमेन पर[0,2]×[0,2]×[0,2]आवधिक सीमा शर्त के साथ। यह चार्ज घनत्व शुद्ध तटस्थ है। : समाधान द्वारा दिया जाता है वीएच(एक्स)=n(
n(एक्स,y,z)=3π((एक्स-1)2+(y-1)2+(z-1)2-1)
[0,2]×[0,2]×[0,2] जहाँx=(x,y,z)। पारस्परिक अंतरिक्ष में वीएच(G)=4πn(जी)
वीएच(एक्स)=n(y)|एक्स-y|3y
एक्स=(एक्स,y,z) जहांजीपारस्परिक अंतरिक्ष वैक्टर हैं। मुझे हर्ट्री ऊर्जा में दिलचस्पी है: एच=1
वीएच(जी)=4πn(जी)जी2
जी में पारस्परिक इस (discretization के बाद) हो जाता है अंतरिक्ष: एच=2πΣजी0 | एन( जी ) | 2
एच=12n(एक्स)n(y)|एक्स-y|3एक्स3y=12वीएच(एक्स)n(एक्स)3एक्स
जी=0अवधि छोड़ दिया जाता है, जो प्रभावी रूप से बनाता है चार्ज घनत्व शुद्ध तटस्थ (और के बाद से यह पहले से ही तटस्थ है, तो सब कुछ संगत है)।
एच=2πΣजी0|n(जी)|2जी2
जी=0

एच=12835π=१.१६,४१० ...

यहां NumPy का उपयोग करके एक प्रोग्राम है जो गणना करता है।

from numpy import empty, pi, meshgrid, linspace, sum
from numpy.fft import fftn, fftfreq
E_exact = 128/(35*pi)
print "Hartree Energy (exact):      %.15f" % E_exact
f = open("conv.txt", "w")
for N in range(3, 384, 10):
    print "N =", N
    L = 2.
    x1d = linspace(0, L, N)
    x, y, z = meshgrid(x1d, x1d, x1d)

    nr = 3 * ((x-1)**2 + (y-1)**2 + (z-1)**2 - 1) / pi
    ng = fftn(nr) / N**3

    G1d = N * fftfreq(N) * 2*pi/L
    kx, ky, kz = meshgrid(G1d, G1d, G1d)
    G2 = kx**2+ky**2+kz**2
    G2[0, 0, 0] = 1  # omit the G=0 term

    tmp = 2*pi*abs(ng)**2 / G2
    tmp[0, 0, 0] = 0  # omit the G=0 term
    E = sum(tmp) * L**3
    print "Hartree Energy (calculated): %.15f" % E
    f.write("%d %.15f\n" % (N, E))
f.close()

और यहाँ एक अभिसरण ग्राफ है (बस conv.txtउपरोक्त स्क्रिप्ट से प्लॉटिंग , यहाँ एक नोटबुक है जो यह करता है यदि आप अपने आप से खेलना चाहते हैं):

एफएफटी अभिसरण ग्राफ

जैसा कि आप देख सकते हैं, अभिसरण रैखिक है, जो मेरे लिए आश्चर्य की बात थी, मैंने सोचा कि एफएफटी उससे कहीं अधिक तेजी से परिवर्तित होता है।

अपडेट :

समाधान सीमा पर एक पुच्छल है (मुझे इससे पहले इसका एहसास नहीं था)। एफएफटी के लिए तेजी से अभिसरण करने के लिए, समाधान में सभी डेरिवेटिव सुचारू होने चाहिए। तो मैंने भी निम्नलिखित दाहिने हाथ की कोशिश की:

nr = 3*pi*sin(pi*x)*sin(pi*y)*sin(pi*z)/4

वीएच=पाप(πएक्स)पाप(πy)पाप(πz)एच=3π8

क्या किसी को 3 डी में कोई बेंचमार्क पता है ताकि मैं रैखिक की तुलना में तेजी से अभिसरण देख सकूं?


Ondrej, अपने चिकनी घनत्व के फूरियर रूपांतरण एक डेल्टा कार्य नहीं है? मैं इसे चलाने के लिए बहुत आलसी होने का स्वीकार करता हूं, लेकिन इसे पहली कोशिश में सटीक जवाब मिलना चाहिए।
मैट नेप्ले

मुझे लगता है ऐसा है। लेकिन यह एक पुनरावृत्ति में परिवर्तित नहीं होता है, जैसा कि नोटबुक प्लॉट से देखा जा सकता है। मुझे पता नहीं क्या चल रहा है।
ओंडे 'íertík

Ondrej, क्या आप सुनिश्चित हैं कि आपका कार्यान्वयन सही है? मुझे याद है कि मैं ग्रेड स्कूल में एक होमवर्क असाइनमेंट के लिए स्पेक्ट्रल सॉल्वर्स को लागू करने की कोशिश कर रहा हूं और पूरी तरह से स्थिरांक बना रहा हूं। मैं ध्यान देता हूं कि आप गणना की गई सटीक और सटीक ऊर्जा के बीच की दूरी को देखकर त्रुटि को माप रहे हैं। समस्या के वास्तविक समाधान में आपका अभिसरण कैसा दिखता है? यह गणना करने में आसान होना चाहिए और समस्या के 2-डी स्लाइस पर भी साजिश करना चाहिए।
एरन अहमदिया

एरन --- मैंने कुछ अन्य कोड के खिलाफ अपने कार्यान्वयन की जांच की, लेकिन मैं इसे अपने गलत प्रारंभिक नमूने के लिए जाँच रहा था, इसलिए मेरे पास दोनों कोडों में समान बग था। मैट सही था, अब यह पहली कोशिश में जुट गया। नीचे मेरा जवाब देखें।
ओन्डेज Čertík

जवाबों:


10

मुझे पहले सभी सवालों के जवाब दें:

एफएफटी ज़हर सॉल्वर के लिए सैद्धांतिक अभिसरण दर क्या है?

सैद्धांतिक अभिसरण घातीय है जब तक कि समाधान पर्याप्त रूप से सुचारू है।

इस ऊर्जा को कितनी तेजी से परिवर्तित करना चाहिए?

एच

क्या किसी को 3 डी में कोई बेंचमार्क पता है ताकि मैं रैखिक की तुलना में तेजी से अभिसरण देख सकूं?

कोई भी दाहिना हाथ जो एक ऐसा समाधान तैयार करता है जो आवधिक और असीम रूप से भिन्न होता है (आवधिक सीमा के पार) को तेजी से परिवर्तित किया जाना चाहिए।


ऊपर दिए गए कोड में एक बग होता है, जो अभिसरण को घातीय की तुलना में धीमा होने का कारण बनता है। चिकने घनत्व कोड ( https://gist.github.com/certik/5549650/ ) का उपयोग करते हुए , निम्नलिखित पैच बग को ठीक करता है:

@@ -6,7 +6,7 @@ f = open("conv.txt", "w")
 for N in range(3, 180, 10):
     print "N =", N
     L = 2.
-    x1d = linspace(0, L, N)
+    x1d = linspace(0, L, N+1)[:-1]
     x, y, z = meshgrid(x1d, x1d, x1d)

     nr = 3*pi*sin(pi*x)*sin(pi*y)*sin(pi*z)/4

समस्या यह थी कि असली अंतरिक्ष नमूना पहले और अंतिम बिंदु को दोहरा नहीं सकता (जिसकी आवधिक सीमा स्थिति के कारण समान मूल्य है)। दूसरे शब्दों में, समस्या प्रारंभिक नमूना स्थापित करने में थी।

इस फिक्स के बाद, घनत्व एक पुनरावृत्ति में परिवर्तित हो जाता है, जैसा कि मैट ने ऊपर कहा था। इसलिए मैंने अभिसरण रेखांकन भी नहीं किया।

हालांकि, एक और अधिक कठिन घनत्व की कोशिश कर सकते हैं, उदाहरण के लिए:

     nr = 3*pi*exp(sin(pi*x)*sin(pi*y)*sin(pi*z))/4

फिर अभिसरण अपेक्षा के अनुसार घातीय है। इस घनत्व के अभिसरण रेखांकन इस प्रकार हैं: यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें


बहुत बढ़िया। क्षमा करें, मैं अधिक मदद नहीं कर रहा था!
एरन अहमदिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.