Pilihan ukuran langkah menggunakan ODE di matlab

12

Hai dan terima kasih telah meluangkan waktu untuk melihat pertanyaan saya. Ini adalah versi terbaru dari pertanyaan saya yang saya posting sebelumnya di physics.stackexchange.com

Saat ini saya sedang mempelajari spin exciton 2D Bose-Einstein Condensate dan saya ingin tahu tentang keadaan dasar sistem ini. Metode matematika untuk mencapai keadaan dasar disebut metode waktu imajiner .

Metode ini sangat sederhana di mana waktu dalam mekanika kuantum digantikan oleh imajiner satu Substitusi ini menyebabkan partikel energi tinggi dalam sistem saya meluruh lebih cepat daripada yang energi rendah. Menormalkan kembali jumlah partikel dalam setiap langkah perhitungan kita berakhir dengan sistem partikel energi terendah, alias. keadaan dasar.

t=iτ

Persamaan yang dimaksud adalah nonlinier, disebut persamaan Schrödinger nonlinier , kadang-kadang persamaan Gross-Pitaevskii . Untuk mengatasi masalah ini saya menggunakan Matlabs ode45 yang mengembangkan sistem maju dalam waktu dan akhirnya mencapai keadaan dasar.

  • Catatan! Persamaan Schrödinger nonlinear termasuk laplacian dan beberapa istilah diferensial lainnya dalam ruang. Ini semua diselesaikan dengan menggunakan transformasi Fourier cepat. Pada akhirnya kita hanya memiliki ODE waktu. *

t0tf[t0,,tf][t0,t0+Δ/2,t0+Δ],y,t0+ΔΔ

Usaha saya: Saya menyadari bahwa dalam skema ini langkah-langkah waktu yang besar akan menyebabkan sejumlah besar partikel membusuk sebelum dinormalisasi ulang ke jumlah partikel semula sedangkan langkah-langkah waktu yang kecil akan menyebabkan jumlah partikel yang lebih kecil membusuk sebelum kembali dinormalisasi. Pikiran awal saya adalah bahwa langkah waktu yang kecil harus memberikan solusi yang lebih akurat tetapi tampaknya sebaliknya.

Saya bukan ahli numerik sehingga pilihan ode45 benar-benar sewenang-wenang. ode113 memberiku hal yang sama. :(

Apakah ada yang punya pemikiran tentang hal ini. Beri tahu saya jika ada detail tambahan yang dibutuhkan.

Terima kasih.

Pembaruan 1: Saya telah meneliti metode waktu imajiner dan ODE. Tampaknya jika langkah waktu tidak cukup kecil semuanya menjadi tidak stabil. Ini membuat saya bertanya-tanya apakah persamaan nonlinear saya kaku yang membuat banyak hal lebih sulit dari apa yang saya mengerti. Saya akan membuat Anda diperbarui.

Pembaruan 2: TETAP: Masalahnya memang memiliki normalisasi di luar ODE. Jika normalisasi disimpan di dalam odefun maka ODE mengembalikan hasil yang sama untuk pilihan langkah-langkah waktu "luar" yang berbeda. Rekan saya menunjukkan kode yang lebih lama dan saya hanya menambahkan satu baris di odefun saya.

function y_out = odefun(t,y_in,...variables...) 

    ...
    [ Nonlinear equations evaluated ]  
    ...


    y_out = y_out + 0.1*y_in*(N0-Ntemp) ;
end

Baris terakhir menghitung perbedaan jumlah partikel saat ini (Ntemp) dan jumlah partikel yang harus dimiliki sistem (N0). Ini menambahkan sebagian partikel kembali ke output dan dengan demikian menciptakan stabilitas jumlah partikel total dalam sistem bukannya membuat mereka semua membusuk.

Saya juga akan mengajukan pertanyaan baru mengenai dimensi masalah dan beberapa perbedaan dalam bekerja dengan picoseconds atau nanoseconds sebagai langkah waktu dalam ODE.

Terima kasih semua. :)


sumber
3
Masalah mendasarnya adalah bahwa Anda secara paksa menggunakan metode adaptif yang ingin ode45()mengambil langkah-langkah yang sama. Mengapa, tepatnya, apakah Anda menghindari generasi "vektor raksasa"? Jika Anda benar-benar membutuhkan titik-titik bersyarat, ode45()lanjutkan seperti biasa, lalu gunakan interpolasi.
JM
y
Jika memori berfungsi, harus ada opsi ode45()yang memungkinkan Anda mempertahankan langkah-langkah yang lebih besar dari batas tertentu; Anda mungkin ingin melihatnya.
JM
1
Jawabannya hanya menggunakan estimasi kesalahan lokal. Ada satu bawaan untuk ODE45, jadi yang paling mudah adalah menggunakannya, tetapi Anda bisa membuat kode sendiri.
David Ketcheson
1
0.11/timeαΔt(NtN0)Δt

Jawaban:

4

Karena Anda tidak memposting kode MATLAB Anda, saya tidak yakin bagaimana Anda memanggil ode45. Saya kira Anda mengubah vektor tspan (argumen kedua) pada setiap panggilan ke ode45. Hal pertama yang harus dipahami adalah bahwa vektor tspan (hampir) tidak berpengaruh pada langkah waktu yang digunakan oleh ode45. Vektor tspan hanya memungkinkan Anda meneruskan ke Ode45 rentang waktu integrasi dan pada waktu apa Anda ingin output. Langkah waktu yang digunakan oleh algoritma Runga-Kutta di ode45 disesuaikan secara internal untuk mencapai akurasi yang ditentukan. Dua parameter yang mengontrol akurasi ini adalah RelTol dan AbsTol dalam struktur opsi yang diteruskan ke ode45. Mereka memiliki default yang masuk akal dan karena Anda tidak menyebutkan ini, saya berasumsi Anda tidak mengubahnya.

Saya mengatakan "hampir" tidak berpengaruh pada langkah waktu Ode45 normal. Jika Anda meminta output pada interval waktu yang sangat kecil relatif terhadap langkah waktu yang akan diambil ode45, maka itu harus mengurangi langkah waktu untuk memenuhi permintaan output Anda. Saya percaya inilah yang sedang diasumsikan oleh JM. Mengapa Anda membutuhkan solusinya pada saat-saat keluaran yang begitu banyak? Biasanya cukup dengan hanya meminta output pada waktu yang cukup untuk menghasilkan plot yang mulus.

Mengenai perubahan solusi yang Anda lihat, mungkin nilai default RelTol dan AbsTol tidak sesuai untuk masalah Anda. Saya sarankan mengganti loop Anda di ode45 dengan satu panggilan, permintaan output pada beberapa kali yang wajar, dan bereksperimen dengan nilai RelTol dan AbsTol yang lebih kecil sampai Anda mendapatkan solusi konvergen.

Bill Greene
sumber
Terima kasih atas jawabannya. Alasan mengapa saya membutuhkan solusi pada banyak kali keluaran adalah karena jika fungsi gelombang tidak dinormalisasi secara teratur maka semuanya meluruh dan sistem saya kosong. Itu sebabnya saya meletakkan ode45 ke dalam loop dengan vektor tspan kecil sehingga saya bisa menormalkan kembali setelah setiap vektor tspan.
2

Karena persamaan Schrödinger nonlinier, yah, nonlinier, ia dapat memiliki sejumlah besar status stasioner, beberapa di antaranya mungkin stabil. Dalam realitas fisik, mulai dari satu keadaan tertentu, sistem secara deterministik akan berkembang menjadi satu keadaan akhir. Jika skema numerik memberi Anda hasil yang berbeda untuk diskritisasi yang berbeda (langkah waktu), maka ini adalah cacat mendasar diskritisasi Anda. Periksa kode Anda.

ψ0

dψdt=F(ψ),
F(ψ0)=0.
G(ψ)=ΩE(ψ)
E()F(ψ)=0E(ψ)E(ψ)=|ψ|4
Nico Schlömer
sumber
Iya. Saya memplot profil densitas dari solusi output saya dan ketika itu tidak berubah untuk waktu yang lama, pada dasarnya berhenti berkembang, saya berasumsi saya telah mencapai keadaan stasioner. Tetapi saya tidak yakin bahwa melihat kerapatan energi dapat membantu karena fungsi gelombang adalah spinor dengan komponen putaran (+2, +1, -1, -2). Saya tidak berpikir mengintegrasikan setiap komponen akan memberi tahu saya energi kondensat tetapi ketika saya sampai ke keadaan dasar, kepadatan energi harus stasioner dan dengan demikian konstan dalam waktu, ini adalah petunjuk untuk solusi yang benar.
1

Masalah terpecahkan:

Normalisasi perlu menjadi bagian dari fungsi yang dievaluasi dalam ODE. Memecah ODE dalam banyak langkah dan menormalisasi di antara mereka menyebabkan ketidakstabilan yang tampak numerik dan menghasilkan hasil yang berbeda tergantung pada interval waktu ODE dipecah menjadi. (Lihat edit 2 pada pertanyaan untuk lebih jelasnya.)


sumber