memecahkan ODE yang digabungkan dengan batasan nilai awal dan nilai akhir

12

Inti dari pertanyaan saya adalah sebagai berikut: Saya memiliki sistem dua ODE. Yang satu memiliki batasan nilai awal dan yang lainnya memiliki batasan nilai akhir. Ini dapat dianggap sebagai sistem tunggal dengan batasan nilai awal pada beberapa variabel dan batasan nilai akhir pada yang lain.

Berikut detailnya:

Saya mencoba menggunakan pengontrol LQR finite-horizon waktu-kontinu untuk menggerakkan sistem dinamik linier. Saya ingin terus menggunakan ekosistem Python.

Sistem ini dalam bentuk , tunduk padax˙(t)=Ax(t)+Bu(t)x(0)=x0

Solusi LQR menghasilkan matriks sedemikian rupa sehingga input kontrol optimal u (t), linier dalam , adalah .K(t)x(t)u(t)=K(t)x(t)

di manaK(t)=R1BTP(t)

dan adalah solusi untuk persamaan diferensial Riccati waktu kontinu (perhatikan bahwa ini adalah matriks)P(t)P(t)

P˙(t)=ATP(t)P(t)A+P(t)BR1BTP(t)+Q tunduk padaP(tf)=Q

A , , , , , , semua diberikan.Bx0QQfRtf

Dalam bahasa Inggris: Anda memiliki beberapa sistem dinamis yang dimulai dalam keadaan . Kontroler LQR menghasilkan matriks umpan balik untuk digunakan antara waktu dan ( umumnya disebut time-horizon masalah)x00tftf

Perhatikan bahwa kedua ODE hanya digabungkan dalam satu arah - solusi untuk tidak bergantung pada . Oleh karena itu salah satu cara untuk memecahkan masalah adalah membalikkan persamaan Riccati untuk mengubah masalah nilai akhir menjadi masalah nilai awal dan menemukan solusi numerik antara waktu dan menggunakan integrator ODE standar. Saya kemudian dapat menggunakan solusi numerik ini untuk menemukan . Ini menjadi perhatian saya karena pemecah ODE numerik untuk x (t) belum tentu sampel ODE pada waktu yang sama dengan waktu dalam solusi numerik ke $ P (t). Mungkin ada beberapa cara cerdas untuk menegakkan ini.P(t)x(t)0tfx(t)

Cara lain yang saya perkirakan untuk menyelesaikan masalah adalah dengan memecahkan sistem bersama-sama, tetapi saya tidak tahu bagaimana menghadapi campuran nilai awal dan nilai akhir. Apakah masalah ini berat untuk diselesaikan secara komputasi? Bisakah saya melakukannya dengan SciPy / Python?

Gus
sumber

Jawaban:

8

Saya tidak setuju dengan jawaban yang lain. Karena Anda hanya memiliki sambungan satu arah antara masalah waktu mundur dan waktu depan, akan jauh lebih efisien untuk menyelesaikannya secara berurutan, seperti yang Anda usulkan pertama kali. Anda hanya perlu solusi yang dapat dievaluasi kapan saja . P(t)t[0,tf]

Anda dapat melakukan ini dengan menginterpolasi antara nilai output . Saya sarankan Anda menggunakan metode Runge-Kutta yang mendukung output padat. Misalnya, scipy.integrate.ode.dopri5didasarkan pada metode seperti itu. Jadi, Anda harus dapat menentukan waktu keluaran dengan spasi sangat halus tanpa memaksa integrator untuk mengambil langkah-langkah yang sangat kecil (dengan asumsi bahwa antarmuka scipy untuk itu diimplementasikan dengan benar).

David Ketcheson
sumber
Ya, ini memang lebih sederhana. Anda dapat menggunakan metode apa pun untuk menghasilkan dan pada titik apa pun yang diperlukan integrator, dan interpolasi di antaranya dengan spline Hermit kubik jika akurasi O (h ^ 4) cukup. P(t)P(t)
Arnold Neumaier
6

Ini disebut masalah nilai batas dua poin dan dipelajari dengan baik.

Metode pemotretan sangat sederhana untuk diprogram tetapi mungkin sangat tidak stabil secara numerik.

Cara standar untuk memecahkan masalah ini adalah menggunakan pendekatan pemotretan berganda dan menyelesaikan sistem persamaan nonlinier yang sesuai dengan pemecah nonlinier standar. Untuk daftar pemecah untuk sistem persamaan nonlinier, lihat, misalnya,
http://www.mat.univie.ac.at/~neum/glopt/software_l.html#nonlin

Anda mengambil sebagai variabel keadaan pada grid biasa dalam waktu (biasanya tidak ada grid yang sangat halus diperlukan), dan sebagai persamaan kondisi batas dan pemetaan yang memetakan variabel t waktu ke variabel t + h waktu. Ini memberikan persamaan sebanyak variabel. Anda hanya perlu memberikan rutinitas untuk mengevaluasi pemetaan ini untuk konfigurasi status yang diberikan pada kisi, dan pemecah nonlinier melakukan segalanya. (Mungkin Anda perlu beberapa titik awal jika tebakan awal Anda buruk.)

Wikipedia http://en.wikipedia.org/wiki/Direct_multiple_shooting_method memiliki deskripsi proses yang berguna, jika deskripsi di atas tidak cukup detail untuk Anda. Buku karya Stoer / Bulirsch yang dikutip di sana memberikan detail lengkap.

Arnold Neumaier
sumber
5

Saya tidak tahu bagaimana melakukannya dengan Python, tetapi kata kunci yang ingin Anda cari dalam literatur adalah "metode pemotretan". Itulah nama metode yang memecahkan masalah yang memiliki batasan nilai awal dan akhir.

Wolfgang Bangerth
sumber
1

AUTO dapat menyelesaikan dua titik BVP dan memiliki antarmuka python dan relatif mudah untuk diinstal. http://www.ma.hw.ac.uk/~gabriel/auto07/node6.html .

Jika Anda pergi rute yang ingin menyelesaikan P (t) pertama dan mengumpankannya ke ODE lain sebagai input, maka cara yang efisien untuk mengatur bahwa menggunakan PyDSTool. PyDSTool sangat mudah dipasang di platform apa pun, lihat http://pydstool.sf.net . Secara default, ini hanya akan menggunakan interpolasi linier untuk solusi yang Anda hitung sebelumnya (jadi hitung pada resolusi waktu yang baik). Namun, Anda dapat memaksa PyDSTool untuk melangkah tepat ke titik waktu yang diinginkan bahkan dengan integrator adaptif (meskipun itu mungkin tidak efisien dan menyebabkan ketidakakuratan). Tetapi dengan langkah waktu maks yang cukup kecil, interpolasi linier dan integrator cepat (Dopri terintegrasi) untuk sistem kedua berarti Anda akan baik-baik saja untuk sistem "biasa" seperti ini.

RHC
sumber