from source.code.unit11_numerical import bisection
result = bisection(lambda x: x*x - 2.0, 1.0, 2.0, width_tolerance=1e-12)
(result.midpoint, result.width, result.iterations)(1.414213562372879, 9.094947017729282e-13, 40)
Setelah menyelesaikan unit ini, pembaca dapat:
Unit ini mempunyai jalur lokal. Jalur akar memerlukan A30 dan konsep fungsi kontinu. Jalur kuadratur memerlukan B30, jalur sistem linear memerlukan B40, dan jalur persamaan diferensial memerlukan B70. Pembaca boleh menunda jalur yang prasyaratnya belum dipenuhi.
Hanya metode dan teorema, jalur A30 bagi-dua, perbandingan SciPy, sumber galat, serta Latihan 1, 2, dan latihan SciPy s01 yang menjadi inti B80 unit ini. Jalur B30, B40, dan B70 tetap tersedia sebagai ekstensi, tetapi tidak boleh dipakai sebagai bukti penyelesaian B80 sebelum prasyarat masing-masing dipenuhi.
Perintah perangkat lunak tidak menjamin bahwa masalah memenuhi asumsi metode. Metode bagi-dua, misalnya, mempertahankan selang yang kedua ujungnya mempunyai tanda berbeda. Jaminan adanya akar di dalam selang memerlukan kekontinuan. Program dapat memeriksa tanda ujung; program tidak dapat menyimpulkan kekontinuan dari beberapa sampel. Implementasi unit juga menolak titik ujung, titik tengah, atau nilai fungsi yang tidak berhingga.
Setiap eksperimen numerik menuliskan:
Untuk mencari akar , mulai dengan sehingga . Setiap langkah memilih titik tengah dan mempertahankan separuh selang yang masih mempunyai perubahan tanda.
Jika lebar awal , setelah langkah lebarnya . Hubungan ini memberi batas galat berdasarkan selang, bukan hanya berdasarkan nilai kecil .
from source.code.unit11_numerical import bisection
result = bisection(lambda x: x*x - 2.0, 1.0, 2.0, width_tolerance=1e-12)
(result.midpoint, result.width, result.iterations)(1.414213562372879, 9.094947017729282e-13, 40)
Nilai itu adalah pendekatan. Pernyataan eksak berasal dari definisi akar positif persamaan , bukan dari digit yang dicetak.
Implementasi asli membuat setiap langkah bagi-dua dapat dibaca. Implementasi kedua dari scipy.optimize.root_scalar memberi pembanding yang dikembangkan secara terpisah. Keduanya menerima fungsi, selang awal, metode, dan batas iterasi yang dinyatakan, tetapi istilah toleransinya tidak boleh disamakan. original_width_tolerance membatasi lebar selang akhir implementasi asli; scipy_xtol dan scipy_rtol adalah kriteria kedekatan absolut dan relatif untuk akar yang dikembalikan SciPy. Nilainya boleh sama secara numerik pada contoh ini, tetapi maknanya tetap berbeda dan direkam terpisah.
from source.code.unit11_numerical import (
SCIPY_VERSION,
compare_bisection_with_scipy,
square_minus_two,
)
perbandingan_u11 = compare_bisection_with_scipy(
square_minus_two,
1.0,
2.0,
original_width_tolerance=1e-12,
scipy_xtol=1e-12,
)
assert perbandingan_u11["scipy_version"] == SCIPY_VERSION
assert perbandingan_u11["verification"]["strict_sign_change"]
assert perbandingan_u11["scipy"]["converged"]
assert perbandingan_u11["verification"]["roots_inside_initial_bracket"]
assert perbandingan_u11["verification"]["roots_agree"]
(
perbandingan_u11["scipy_version"],
perbandingan_u11["original"]["midpoint"],
perbandingan_u11["scipy"]["root"],
perbandingan_u11["verification"]["absolute_root_difference"],
)('1.15.2', 1.414213562372879, 1.4142135623724243, 4.547473508864641e-13)
Rekaman menyimpan versi SciPy yang benar-benar diimpor, bukan sekadar nama pustaka. strict_sign_change memeriksa sebelum pemanggilan. converged dan flag mencatat laporan SciPy. Kedua akar harus tetap berada dalam selang awal dan selisihnya tidak boleh melebihi toleransi kesepakatan yang direkam.
Kesepakatan dua implementasi meningkatkan peluang mendeteksi kesalahan kode lokal. Ia tidak membuktikan bahwa fungsi kontinu, tidak membuktikan bahwa selang memuat tepat satu akar, dan tidak mengubah digit pendekatan menjadi nilai eksak. Kekontinuan dan jaminan keberadaan berasal dari asumsi serta Teorema Nilai Antara; pemeriksaan versi dan konvergensi adalah bukti kerja komputasional.
Bagian kuadratur dan Latihan 3 memerlukan B30. Keduanya boleh dijalankan untuk pengayaan setelah prasyarat tersedia, tetapi tidak dihitung sebagai inti atau bukti penyelesaian B80.
Aturan trapesium majemuk mengganti kurva pada setiap subselang dengan ruas garis. Eksperimen pemurnian memakai subselang dan mencatat perubahan hasil. Nilai yang tampak stabil mendukung dugaan konvergensi, tetapi tidak menggantikan analisis galat.
Untuk fungsi linear, aturan trapesium eksak dalam aritmetika eksak. Kasus itu menjadi pemeriksaan implementasi yang lebih kuat daripada angka referensi acak.
Bagian sistem linear dan Latihan 4 memerlukan B40. Keduanya tidak dihitung sebagai inti atau bukti penyelesaian B80.
Jika program mengusulkan bagi , hitung residual . Residual kecil berarti persamaan hampir dipenuhi pada skala yang dipakai. Residual kecil belum selalu berarti galat solusi kecil; hubungannya dipengaruhi kondisi matriks.
Untuk sistem berukuran dua yang koefisiennya rasional, solusi eksak dengan Fraction dapat menjadi pembanding independen bagi jalur titik-mengambang.
Bagian persamaan diferensial dan Latihan 5 memerlukan B70. Keduanya tidak dihitung sebagai inti atau bukti penyelesaian B80.
Untuk masalah , langkah Euler memakai
Mengurangi dan membandingkan dengan solusi yang diketahui dapat mengungkap pola galat pada contoh. Itu menguji implementasi dan perilaku kasus, bukan membuktikan orde konvergensi bagi semua fungsi .
Ketika hasil tidak cocok dengan harapan, pisahkan:
Mengubah toleransi hanya menanggapi sebagian sumber tersebut. Karena itu, laporan tidak boleh menyebut satu angka “galat numerik” tanpa definisi.
Jalankan seluruh contoh lokal yang prasyaratnya telah dipenuhi:
python source/code/unit11_numerical.py --output output/unit11-results.json
Keluaran mencatat selang akhir bagi-dua, tabel pemurnian kuadratur, solusi dan residual sistem, serta galat langkah Euler. Identitas fungsi, domain atau data awal, toleransi, kisi pemurnian, banyak langkah, dan nilai referensi yang dipakai pemeriksaan disimpan bersama hasil.
Rekaman juga memuat pembanding SciPy, versi SciPy, pemeriksaan selang, konvergensi, kesepakatan hasil, dan batas bukti. Tabel kuadratur, sistem linear, serta Euler dipertahankan sebagai regresi ekstensi; keberadaannya dalam JSON tidak menjadikannya bagian inti B80. Medan curriculum_routes menyatakan pemisahan itu secara eksplisit.
Sebutkan dua invarian yang harus diperiksa pada setiap langkah bagi-dua dan jelaskan mengapa nilai tengah saja tidak cukup.
Perhatikan perubahan tanda dan penyusutan selang.
Ujung selang harus tetap mengurung perubahan tanda, dan lebar selang harus berkurang setengah pada setiap langkah. Nilai tengah saja tidak membuktikan bahwa akar masih terkurung atau bahwa implementasi memilih separuh yang benar.
Berapa langkah minimum yang menjamin lebar selang paling besar jika lebar awal 1?
Cari sehingga .
Karena dan , diperlukan 20 langkah. Setelah 20 langkah, lebarnya .
Gunakan compare_bisection_with_scipy untuk mencari akar pada dengan toleransi lebar . Verifikasi perubahan tanda, versi SciPy, laporan konvergensi, letak kedua hasil dalam selang, dan kesepakatan akar. Jelaskan satu hal yang tetap memerlukan argumen matematis.
Definisikan fungsi Python terlebih dahulu. Hasil perbandingan mempunyai medan endpoint_values, scipy_version, scipy, original, dan verification.
from source.code.unit11_numerical import SCIPY_VERSION, compare_bisection_with_scipy
def fungsi_kubik_u11(x):
return x**3 - x - 2
hasil_kubik_u11 = compare_bisection_with_scipy(
fungsi_kubik_u11,
1.0,
2.0,
original_width_tolerance=1e-10,
scipy_xtol=1e-10,
)
assert hasil_kubik_u11["endpoint_values"][0] < 0
assert hasil_kubik_u11["endpoint_values"][1] > 0
assert hasil_kubik_u11["scipy_version"] == SCIPY_VERSION
assert hasil_kubik_u11["scipy"]["converged"]
assert hasil_kubik_u11["verification"]["roots_inside_initial_bracket"]
assert hasil_kubik_u11["verification"]["roots_agree"]
assert (
hasil_kubik_u11["verification"]["absolute_root_difference"]
<= hasil_kubik_u11["verification"]["agreement_tolerance"]
)Pemecahan 14.1.
from source.code.unit11_numerical import SCIPY_VERSION, compare_bisection_with_scipy
def fungsi_kubik_solusi_u11(x):
return x**3 - x - 2
solusi_kubik_u11 = compare_bisection_with_scipy(
fungsi_kubik_solusi_u11,
1.0,
2.0,
original_width_tolerance=1e-10,
scipy_xtol=1e-10,
)
verifikasi_kubik_u11 = solusi_kubik_u11["verification"]
assert solusi_kubik_u11["method"] == "bisect"
assert solusi_kubik_u11["scipy_version"] == SCIPY_VERSION
assert solusi_kubik_u11["scipy"]["flag"] == "converged"
assert verifikasi_kubik_u11["strict_sign_change"]
assert verifikasi_kubik_u11["roots_inside_initial_bracket"]
assert verifikasi_kubik_u11["roots_agree"]Karena dan , ujungnya mempunyai tanda berbeda. Dengan asumsi kontinu, Teorema Nilai Antara menjamin sedikitnya satu akar dalam selang. Kedua implementasi sepakat pada toleransi yang direkam dan SciPy melaporkan konvergensi. Namun, kekontinuan serta keunikan akar tidak dibuktikan oleh dua program; keduanya memerlukan argumen matematika terpisah.
Status kurikulum: ekstensi B30 yang ditunda; bukan inti B80.
Gunakan aturan trapesium untuk pada dengan satu subselang. Bandingkan dengan integral eksak.
Luas trapesium adalah lebar dikali rata-rata tinggi ujung.
Nilai ujungnya 2 dan 14, sehingga luas trapesium . Integral eksak . Kecocokan eksak ini diharapkan karena grafik fungsi linear sendiri merupakan ruas garis.
Status kurikulum: ekstensi B40 yang ditunda; bukan inti B80.
Jelaskan mengapa residual kecil tidak otomatis menjamin bahwa solusi hampiran dekat dengan solusi eksak.
Pikirkan sistem yang sangat peka terhadap perubahan kecil pada ruas kanan.
Residual mengukur seberapa baik memenuhi persamaan yang diberikan. Pada matriks berkondisi buruk, perubahan kecil pada ruas kanan dapat berkaitan dengan perubahan besar pada solusi. Karena itu residual harus dibaca bersama skala dan informasi kondisi, bukan sebagai galat solusi langsung.
Status kurikulum: ekstensi B70 yang ditunda; bukan inti B80.
Untuk , , bandingkan galat pada untuk dan . Kesimpulan apa yang boleh dibuat?
Gunakan solusi referensi dan jangan menaikkan dua kasus menjadi teorema.
Langkah Euler memberi . Untuk nilainya sekitar 2,5937; untuk sekitar 2,6533; sedangkan . Galat berkurang pada dua kasus ini. Hasil tersebut mendukung perilaku yang diharapkan dan memeriksa implementasi, tetapi dua ukuran langkah tidak membuktikan konvergensi atau orde galat secara umum.
scipy.optimize.root_scalar(method="bisect") memberi pemeriksaan silang A30 yang harus merekam versi, selang, toleransi, konvergensi, dan kesepakatan hasil.