คำตอบของ Kyle Kanos ดูเหมือนจะเต็มมาก แต่ฉันคิดว่าฉันจะเพิ่มประสบการณ์ของตัวเอง วิธีฟูเรียร์แบบแยกขั้นตอน (SSFM) นั้นง่ายมากในการวิ่งและเล่นกับ คุณสามารถสร้างต้นแบบมันขึ้นมาในไม่กี่บรรทัดของ Mathematica และมันก็เป็นตัวเลขที่เสถียรมาก มันเกี่ยวข้องกับการให้ผู้ประกอบการที่ไม่ซ้ำกันในชุดข้อมูลของคุณดังนั้นมันจึงสงวนความน่าจะเป็น / พลังงานโดยอัตโนมัติ (หลังถ้าคุณกำลังแก้สมการของ Maxwell ด้วยซึ่งเป็นที่ที่ประสบการณ์ของฉันอยู่) สำหรับสมการSchrödingerหนึ่งมิติ (เช่นและเปลี่ยนแปลงเท่านั้น) มันเร็วมากแม้ในขณะที่รหัส Mathematica และถ้าคุณต้องการเพิ่มความเร็วคุณต้องใช้รหัส FFT ที่ดีในภาษาเป้าหมายของคุณ (ประสบการณ์ของฉันคือ C ++)txt
สิ่งที่คุณกำลังทำอยู่คือวิธีการเผยแพร่แบบลำแสงแบบไม่เปิดเผยสำหรับการแพร่กระจายทางแสงผ่านท่อนำคลื่นของส่วนข้ามที่แตกต่างกัน
วิธีที่ฉันดู SSFM / BPM มีดังนี้ การต่อสายดินเป็นสูตรผลิตภัณฑ์ Trotter ของทฤษฎี Lie:
limm→∞(exp(Dtm)exp(Vtm))m=exp((D+V)t)(1)
ซึ่งบางครั้งเรียกว่าสมการแยกตัวดำเนินการในบริบทนี้ ชุดข้อมูลของคุณเป็นหรือ discretised ตารางของค่าที่ซับซ้อนเป็นตัวแทนในเวลาที่กำหนดทีคุณลองนึกภาพนี้ (คุณไม่ต้องทำอย่างนี้ฉันยังคงพูดถึงแนวคิด) ที่เขียนตารางเป็นเวกเตอร์คอลัมน์องค์ประกอบ (สำหรับตารางเรามี ) จากนั้นสมการชโรดิงเงอร์ของคุณเป็นรูปแบบ:x−yx−y−zψ(x,y,z)tNΨ1024×1024N=10242=1048576
dtΨ=KΨ=(D+V(t))Ψ(2)
ที่คือเอียง - Hermitian เมทริกซ์เป็นองค์ประกอบของและจะถูกแมปด้วยเวลาที่เพิ่มขึ้นโดยองค์ประกอบของคนหนึ่ง กลุ่มพารามิเตอร์t) (ฉันดูดปัจจัยเข้าไปในบน RHS เพื่อให้ฉันสามารถพูดคุยในแง่ทฤษฎีโกหกได้ง่ายขึ้น) ด้วยขนาดของที่อยู่อาศัยตามธรรมชาติของผู้ปฏิบัติงานเป็นกลุ่มโกหกที่ใหญ่โตอย่างมากดังนั้น PHEW! ใช่ฉันยังคงพูดในแง่ทฤษฎีทั้งหมด! ตอนนี้K=D+VN×Nu(N)Ψexp(Kt)iℏK=D+VNU(N)D+Vดูเหมือน? ยังคงนึกภาพตอนนี้มันอาจจะคิดว่าเป็นรุ่นที่แตกต่างกัน จำกัด ของโดยที่มีความเป็นไปได้ "หมายถึง" ที่สะดวกสำหรับปัญหาที่อยู่ในมือiℏ∇2/(2m)−iℏ−1V0+iℏ−1(V0−V(x,y,z,t0))V0
เราให้:
DV==iℏ2m∇2−iℏ−1V0iℏ−1(V0−V(x,y,z,t))(3)
ทำไมฉันถึงแยกมันออกเป็นแบบนี้จะชัดเจนขึ้น
จุดเกี่ยวกับก็คือมันสามารถทำงานได้วิเคราะห์สำหรับคลื่นระนาบ: มันเป็นตัวดำเนินการคูณแบบง่าย ๆ ในพิกัดโมเมนตัม ดังนั้นเพื่อหาไปนี้เป็นสามขั้นตอนแรกของรอบ SSFM / BPM:DΨ↦exp(ΔtD)Ψ
- ส่ง FFT ไปยังชุดข้อมูลเพื่อแปลงเป็นชุดของน้ำหนักทับซ้อนของคลื่นระนาบ: ตอนนี้พิกัดพิกัดได้เปลี่ยนจากเป็น ;ΨΨ~x,y,zkx,ky,kz
- บอก โดยการคูณแต่ละจุดบนตารางโดย ;Ψ~↦exp(ΔtD)Ψ~exp(iΔt(V0−k2x+k2y+k2z)/ℏ)
บอก FFT ผกผันเพื่อทำแผนที่กริดของเรากลับไปที่exp(ΔtD)Ψ
. ตอนนี้เรากลับมาอยู่ในโดเมนตำแหน่งแล้ว นี่เป็นโดเมนที่ดีกว่าในการบอกโอเปอเรเตอร์แน่นอน: ที่นี่เป็นตัวดำเนินการคูณอย่างง่าย ดังนั้นนี่คือขั้นตอนสุดท้ายของวัฏจักรอัลกอริทึมของคุณ:VV
บอกกล่าวโอเปอเรเตอร์เพียงแค่คูณแต่ละจุดบนกริดโดยปัจจัยเฟสΨ↦exp(ΔtV)Ψexp(iΔt(V0−V(x,y,z,t))/ℏ)
.... แล้วคุณจะเริ่มถัดไปของคุณละขั้นตอนและวนซ้ำ เห็นได้ชัดว่ามันง่ายมากที่จะใส่ค่าศักย์ที่แปรผันตามเวลาลงในโค้ดΔtV(x,y,z,t)
ดังนั้นคุณจะเห็นว่าคุณเลือกเล็กพอที่สูตร Trotter (1) เตะเข้า: คุณแค่ประมาณการกระทำของโอเปอเรเตอร์และคุณโบกไปมาพร้อมกับ FFT ของคุณระหว่างตำแหน่งและพิกัดโมเมนตัมเช่นโดเมนที่และเป็นตัวดำเนินการคูณอย่างง่ายΔtexp(D+VΔt)≈exp(DΔt)exp(VΔt)VD
ขอให้สังเกตว่าคุณเป็นคนเดียวที่เปิดเผยแม้ในโลกที่แยกตัวออกมาผู้ประกอบการที่รวมกัน: FFT และปัจจัยเฟสบริสุทธิ์
จุดหนึ่งที่คุณต้องระวังคือเมื่อของคุณมีขนาดเล็กคุณต้องตรวจสอบให้แน่ใจว่าระยะห่างของตารางอวกาศลดลงเช่นกัน มิฉะนั้นสมมติว่าระยะห่างตารางอวกาศเป็นx จากนั้นความหมายทางกายภาพของขั้นตอนที่ไม่ต่อเนื่องคือผลกระทบการเลี้ยวเบนกำลังเคลื่อนที่ด้วยความเร็ว ; เมื่อจำลองสมการของแมกซ์เวลล์และท่อนำคลื่นคุณจะต้องตรวจสอบให้แน่ใจว่าความเร็วนี้มีขนาดเล็กกว่าคฉัน daresay ชอบข้อ จำกัด ที่ใช้กับสมการชโรดิงเงอร์: ฉันไม่มีประสบการณ์ตรงที่นี่ แต่มันฟังดูสนุกและบางทีคุณอาจโพสต์ผลลัพธ์ของคุณได้บ้าง!Δ x Δ x / Δ t cΔtΔxΔx/Δtc
จุดที่ "ประสบการณ์" ประการที่สองคือสิ่งนี้ฉันเกือบยินดีที่จะเดิมพันว่านี่เป็นวิธีที่คุณจะเลิกติดตามความคิดของคุณ เรามักจะมีความคิดที่เราต้องการทำแบบจำลองที่ง่ายและรวดเร็วและสกปรก แต่มันก็ไม่เคยได้ผลเลย! ฉันจะเริ่มต้นด้วย SSFM ตามที่อธิบายไว้ข้างต้นเพราะมันง่ายมากที่จะเริ่มต้นใช้งานและคุณจะเห็นได้อย่างรวดเร็วว่าผลลัพธ์นั้นมีอยู่จริงหรือไม่ ต่อมาเมื่อคุณสามารถใช้ของคุณบอกรหัส Mathematica SSFM ตรวจสอบผลของรหัสที่ซับซ้อนมากขึ้นคุณอาจท้ายการสร้างการพูด, รหัส Crank Nicolson ตามสายของคำตอบที่ไคล์ Kanos ของ
ข้อผิดพลาดขอบเขต
การรับรู้สูตร Dynkin ของทฤษฎีบทของ Baker-Campbell-Hausdorff:
exp(DΔt)exp(V)Δt)=exp((D+V)Δt+12[D,V]Δt2+⋯)
บรรจบกันสำหรับแสดงให้เห็นว่าวิธีนี้มีความแม่นยำ ลำดับที่สองและสามารถแสดงให้เห็นว่า:
Δt>0
exp(DΔt)exp(V)Δt)exp(−12[D,V]Δt2)=exp((D+V)Δt+O(Δt3))
ในทางทฤษฎีคุณสามารถใช้คำว่าเพื่อประเมินข้อผิดพลาดและตั้งค่าของคุณตามลำดับ สิ่งนี้ไม่ใช่เรื่องง่ายอย่างที่มันดูและในทางปฏิบัติขอบเขตของการเป็นข้อผิดพลาดแทน ปัญหาคือ:exp(V)Δt)exp(−12[D,V]Δt2)Δt
Δt22[D,V]=−iΔt22m(∂2xV(x,t)+2∂xV(x,t)∂x)
และไม่มีการแปลงให้เป็นพิกัด -เป็นตัวดำเนินการอย่างง่าย ดังนั้นคุณต้องมีเนื้อหาที่มีและใช้สิ่งนี้เพื่อประเมินข้อผิดพลาดของคุณโดยหาสำหรับคุณ กำลังพัฒนาโซลูชันและใช้สิ่งนี้เพื่อตั้งค่าของคุณ[D,V]exp(−12[D,V]Δt2)≈e−iφΔt2(id−(12[D,V]−iφ(t))Δt2)(id−(12[D,V]−iφ(t))Δt2)ψψ(x,t)Δton-the-fly หลังจากแต่ละรอบของอัลกอริทึม แน่นอนคุณสามารถทำให้ความคิดเหล่านี้เป็นพื้นฐานสำหรับการควบคุม stepize แบบปรับตัวสำหรับการจำลองของคุณ ที่นี่เป็นระยะส่วนกลางที่ดึงออกมาจากชุดข้อมูลเพื่อลดบรรทัดฐานของ ; แน่นอนว่าคุณสามารถขว้างระยะออกจากโลกออกมาได้บ่อยครั้งขึ้นอยู่กับว่าคุณกำลังทำอะไรกับผลการจำลองสถานการณ์บ่อยครั้งที่เราไม่ได้ใส่ใจกับโลกคงที่ขวา)φ(12[D,V]−iφ(t))Δt2exp(∫φdt)
บทความที่เกี่ยวข้องเกี่ยวกับข้อผิดพลาดใน SSFM / BPM คือ:
Lars Thylén "คานการขยายพันธุ์วิธีการ: การวิเคราะห์การบังคับใช้" แสงและควอนตัมอิเล็กทรอนิคส์ 15 (1983) pp433-439
Lars Thylénคิดเกี่ยวกับข้อผิดพลาดในแง่ทฤษฎีที่ไม่โกหก (กลุ่ม Lie เป็นคนงอของฉันดังนั้นฉันชอบที่จะมองหาการตีความของพวกเขา) แต่ความคิดของเขาเป็นหลักเหมือนกับข้างต้น