Tulislah program mandiri yang ketika diberi polinomial dan terikat akan menemukan semua akar nyata polinomial itu menjadi kesalahan absolut tidak melebihi batas.
Kendala
Saya tahu bahwa Mathematica dan mungkin beberapa bahasa lain memiliki solusi satu-simbol, dan itu membosankan, jadi Anda harus tetap berpegang pada operasi primitif (penambahan, pengurangan, perkalian, pembagian).
Ada fleksibilitas tertentu pada format input dan output. Anda dapat mengambil input melalui argumen stdin atau baris perintah dalam format apa pun yang masuk akal. Anda dapat mengizinkan titik apung atau mengharuskan beberapa representasi bilangan rasional digunakan. Anda dapat mengambil terikat atau kebalikan dari terikat, dan jika Anda menggunakan floating point Anda dapat mengasumsikan bahwa terikat tidak akan kurang dari 2 ulp. Polinomial harus dinyatakan sebagai daftar koefisien monomial, tetapi mungkin besar atau sedikit-endian.
Anda harus dapat membenarkan mengapa program Anda akan selalu bekerja (masalah numerik modulo), meskipun itu tidak perlu untuk menyediakan bukti lengkap sebaris.
Program harus menangani polinomial dengan akar berulang.
Contoh
x^2 - 2 = 0 (error bound 0.01)
Masukan bisa berupa misalnya
-2 0 1 0.01
100 1 0 -2
1/100 ; x^2-2
Keluaran bisa misalnya
-1.41 1.42
tapi tidak
-1.40 1.40
karena memiliki kesalahan absolut sekitar 0,014 ...
Uji kasus
Sederhana:
x^2 - 2 = 0 (error bound 0.01)
x^4 + 0.81 x^2 - 0.47 x + 0.06 (error bound 10^-6)
Banyak root:
x^4 - 8 x^3 + 18 x^2 - 27 (error bound 10^-6)
Polinomial Wilkinson:
x^20 - 210 x^19 + 20615 x^18 - 1256850 x^17 + 53327946 x^16 -1672280820 x^15 +
40171771630 x^14 - 756111184500 x^13 + 11310276995381 x^12 - 135585182899530 x^11 +
1307535010540395 x^10 - 10142299865511450 x^9 + 63030812099294896 x^8 -
311333643161390640 x^7 + 1206647803780373360 x^6 -3599979517947607200 x^5 +
8037811822645051776 x^4 - 12870931245150988800 x^3 + 13803759753640704000 x^2 -
8752948036761600000 x + 2432902008176640000 (error bound 2^-32)
NB Pertanyaan ini ada di Sandbox selama kurang lebih 3 bulan. Jika Anda merasa perlu ditingkatkan sebelum memposting, kunjungi Sandbox dan komentari pertanyaan lain yang diajukan sebelum diposkan di Main.
sumber
fractions.Fraction
(tipe rasional)? (c) Apakah kita harus menangani polinomial derajat <1? (d) Bisakah kita mengasumsikan bahwa koefisien yang memimpin adalah 1?Jawaban:
Mathematica, 223
Solusi ini mengimplementasikan metode Durand-Kerner untuk menyelesaikan polinomial. Perhatikan bahwa ini bukan solusi lengkap (seperti yang akan ditunjukkan di bawah) karena saya belum dapat menangani Polinomial Wilkinson dengan presisi yang ditentukan. Pertama, penjelasan tentang apa yang saya lakukan:
#[[i]]-p[#[[i]]]/Product[If[i!=j,#[[i]]-#[[j]],1],{j,l}]&
: Dengan demikian fungsi menghitung untuk setiap indeksi
perkiraan Durand-Kerner berikutnya. Kemudian baris ini dienkapsulasi dalam Tabel dan diterapkan menggunakan NestWhile ke titik input yang dihasilkan olehTable[(0.9+0.1*I)^i,{i,l}]
. Kondisi pada NestWhile adalah bahwa perubahan maksimum (atas semua persyaratan) dari satu iterasi ke yang berikutnya lebih besar dari presisi yang ditentukan. Ketika semua istilah telah berubah kurang dari ini, NestWhile berakhir danRe@Select
menghapus nol yang tidak jatuh pada garis nyata.Contoh output:
Seperti yang mungkin Anda lihat, ketika tingkat tumbuh lebih tinggi metode ini mulai bangkit di sekitar nilai-nilai yang benar, tidak pernah benar-benar pulang sepenuhnya. Jika saya mengatur kondisi berhenti kode saya menjadi sesuatu yang lebih ketat daripada "dari satu iterasi ke berikutnya tebakan diubah oleh tidak lebih dari epsilon" maka algoritma tidak pernah berhenti. Saya kira saya harus menggunakan Durand-Kerner sebagai input untuk metode Newton?
sumber