Bagaimana cara menghapus Gerakan Tubuh Kaku di Elastisitas Linier?

9

Saya ingin memecahkan di mana K adalah matriks kekakuan saya. Namun beberapa kendala mungkin hilang dan karena itu beberapa gerakan tubuh yang kaku mungkin masih ada dalam sistem (karena nilai eigen nol). Karena saya menggunakan CG untuk menyelesaikan sistem linear, ini tidak dapat diterima karena kadang-kadang CG tidak konvergen pada masalah semi-positif (tapi saya terkadang konvergen).Kkamu=bK

Sebenarnya saya menggunakan pendekatan perpindahan hukuman dalam arti bahwa saya menambahkan hukuman berupa untuk energi elastis. Jadi energinya bertuliskan W ( u ) : = 1α||kamu||2manaαdiambil secara proporsional dengan beberapa entri diagonal dari matriks kekakuan. Tetapi sebenarnya ini memiliki efek untuk meredam beberapa mode deformasi yang kadang ingin saya miliki.

W(kamu): =12kamuT(K+αsaya)kamu-btkamu
α

Beberapa pertanyaan saya adalah:

a) dapatkah saya mengubah sistem asli sehingga harus membuatnya bebas dari singularitas dan kepastian positif (seperti transformasi koordinat atau transformasi kongruensi atau apa pun)? Ide saya adalah menggunakan transformasi tersebut untuk tetap menggunakan CG pada masalah yang diubah

b) Apakah ada cara standar untuk menangani singularitas itu?

Terima kasih banyak !

Salam,

Tom

Tom
sumber

Jawaban:

6

kamu(x0)=0x0

Wolfgang Bangerth
sumber
1
Terima kasih! Yap, tapi saya kasus saya, saya memiliki beberapa substruktur mengambang dan saya tidak tahu mana node (3 node non colinear dalam 3D) untuk memperbaikinya. Inilah sebabnya saya bertanya-tanya apakah tidak ada solusi tingkat yang lebih tinggi karena dalam kasus saya ruang nol dikenal.
Tom
Jika Anda memiliki beberapa struktur maka Anda perlu memperbaiki satu simpul untuk setiap struktur. Tidak masalah yang mana, cukup pilih satu per struktur.
Wolfgang Bangerth
3
@WolfgangBangerth Ini adalah elastisitas 3D, oleh karena itu Anda perlu menyematkan tiga titik non-colinear untuk mengontrol ruang nol dimensi 6. Menyematkan tiga perpindahan adalah gangguan peringkat 9 dan tidak mudah untuk memastikan bahwa modifikasi peringkat-3 di luar ruang kosong tidak mengubah solusi. Untuk setiap pilihan titik dan nilai yang akan disematkan, ada keluarga 3-sisi sisi kanan di mana masalah yang disematkan Anda memberikan jawaban yang benar hanya untuk satu anggota.
Jed Brown
Tidak, Anda tidak dapat menyematkan 3 poin untuk 9 kendala karena Anda juga akan memperbaiki jarak relatifnya. Jika kondisi batas Anda benar-benar tidak memberikan kendala lain (misalnya jika tidak ada perpindahan normal pada lingkaran) maka Anda perlu memperbaiki 1 titik + berbagai sudut rotasi pada dua titik lainnya untuk total 6 kendala.
Wolfgang Bangerth
6

Jika Anda tahu ruang nol, Anda dapat membuat sisi kanan kompatibel dan memiliki metode Krylov mencegah prekondisi menyebabkan polusi, lihat Mengapa menjepit suatu titik untuk menghapus ruang nol buruk? untuk diskusi lebih lanjut. Dalam PETSc, ini dilakukan menggunakan MatNullSpaceobjek. Perhatikan bahwa Anda dapat menyediakan fungsi Anda sendiri untuk memproyeksikan ruang nol, yang akan berguna untuk mengurangi biaya proyeksi ketika Anda memiliki banyak struktur apung.

Jika Anda tidak tahu ruang nol dan tidak dapat menghindari sisi kanan yang tidak kompatibel, ada metode khusus Krylov seperti MINRES-QLP yang dapat menemukan solusi norma minimum. Pendekatan ini mungkin berguna jika Anda memiliki engsel dan koneksi titik tunggal yang hanya memasangkan beberapa mode. Perhatikan bahwa Anda harus tetap berhati-hati tentang prekondisi yang menyebabkan pencemaran (misalnya, karena faktorisasi LU menemukan nol pivot, mungkin pada tingkat multigrid kasar).

Jed Brown
sumber
Jed terima kasih! Saya berpikir untuk menghapus dengan memproyeksikan ruang nol secara langsung dalam metode iteratif saya. Tapi saya bertanya-tanya apakah itu tidak terlalu mahal (saya dapat membuat operator yang memproyeksikan ruang nol karena itu benar-benar sepele dalam elastisitas). Saya juga berpikir bahwa residunya juga harus diproyeksikan?
Tom
2
K=(saya-N)P-1SEBUAH{b,Kb,K2b,...}MatSetNullSpace()