14  Eksperimen Numerik Berprasyarat

14.1 Tujuan belajar

Setelah menyelesaikan unit ini, pembaca dapat:

  • memilih metode numerik yang sesuai dengan prasyarat matematikanya;
  • mencatat invarian, toleransi, batas iterasi, dan kriteria berhenti;
  • membedakan galat masalah, galat diskretisasi, galat pembulatan, dan galat implementasi;
  • memeriksa hasil melalui substitusi, residual, batas, atau metode pembanding;
  • menjalankan eksperimen konvergensi tanpa mengubahnya menjadi bukti umum; dan
  • menolak penggunaan pustaka yang menyembunyikan asumsi domain.

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.

PentingBatas inti B80

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.

14.2 Metode datang bersama teorema

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:

  1. masalah dan domain;
  2. asumsi matematis;
  3. metode dan representasi;
  4. parameter serta kriteria berhenti;
  5. invarian yang diperiksa;
  6. ukuran galat atau residual; dan
  7. batas kesimpulan.

14.3 Jalur A30: bagi-dua

Untuk mencari akar f(x)=0f(x)=0, mulai dengan [a,b][a,b] sehingga f(a)f(b)<0f(a)f(b)<0. Setiap langkah memilih titik tengah dan mempertahankan separuh selang yang masih mempunyai perubahan tanda.

Jika lebar awal w0=baw_0=b-a, setelah kk langkah lebarnya wk=w0/2kw_k=w_0/2^k. Hubungan ini memberi batas galat berdasarkan selang, bukan hanya berdasarkan nilai kecil f(x)f(x).

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)
Daftar 14.1
(1.414213562372879, 9.094947017729282e-13, 40)

Nilai itu adalah pendekatan. Pernyataan eksak x=2x=\sqrt{2} berasal dari definisi akar positif persamaan x2=2x^2=2, bukan dari digit yang dicetak.

14.4 Jalur A30: pembanding SciPy yang dapat dieksekusi

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"],
)
Daftar 14.2
('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 f(a)f(b)<0f(a)f(b)<0 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.

14.5 Jalur B30: kuadratur dan pemurnian

PeringatanGate B30 - ekstensi yang ditunda

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 n,2n,4n,n,2n,4n,\ldots 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.

14.6 Jalur B40: sistem linear dan residual

PeringatanGate B40 - ekstensi yang ditunda

Bagian sistem linear dan Latihan 4 memerlukan B40. Keduanya tidak dihitung sebagai inti atau bukti penyelesaian B80.

Jika program mengusulkan x̂\widehat{x} bagi Ax=bAx=b, hitung residual r=bAx̂r=b-A\widehat{x}. 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.

14.7 Jalur B70: langkah Euler

PeringatanGate B70 - ekstensi yang ditunda

Bagian persamaan diferensial dan Latihan 5 memerlukan B70. Keduanya tidak dihitung sebagai inti atau bukti penyelesaian B80.

Untuk masalah y=g(t,y)y'=g(t,y), langkah Euler memakai

yk+1=yk+hg(tk,yk). y_{k+1}=y_k+h g(t_k,y_k).

Mengurangi hh 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 gg.

14.8 Empat sumber ketidakcocokan

Ketika hasil tidak cocok dengan harapan, pisahkan:

  • galat masalah: model atau data tidak menggambarkan pertanyaan;
  • galat diskretisasi: metode mengganti masalah kontinu dengan masalah berhingga;
  • galat pembulatan: representasi titik-mengambang mengubah operasi; dan
  • galat implementasi: kode tidak melaksanakan metode yang dimaksud.

Mengubah toleransi hanya menanggapi sebagian sumber tersebut. Karena itu, laporan tidak boleh menyebut satu angka “galat numerik” tanpa definisi.

14.9 Artefak eksperimen

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.

14.10 Latihan

14.10.1 Latihan 1 - invarian bagi-dua

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.

14.10.2 Latihan 2 - batas iterasi

Berapa langkah minimum yang menjamin lebar selang paling besar 10610^{-6} jika lebar awal 1?

Cari kk sehingga 2k1062^{-k}\leq 10^{-6}.

Karena 219=524288<1062^{19}=524288<10^6 dan 220=1048576>1062^{20}=1048576>10^6, diperlukan 20 langkah. Setelah 20 langkah, lebarnya 220<1062^{-20}<10^{-6}.

14.10.3 Latihan SciPy - dua implementasi pada akar kubik

Gunakan compare_bisection_with_scipy untuk mencari akar f(x)=x3x2f(x)=x^3-x-2 pada [1,2][1,2] dengan toleransi lebar 101010^{-10}. 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.

PentingPemeriksaan mandiri
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 f(1)=2f(1)=-2 dan f(2)=4f(2)=4, ujungnya mempunyai tanda berbeda. Dengan asumsi ff 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.

14.10.4 Latihan 3 - pemeriksaan kuadratur

Status kurikulum: ekstensi B30 yang ditunda; bukan inti B80.

Gunakan aturan trapesium untuk f(x)=3x+2f(x)=3x+2 pada [0,4][0,4] dengan satu subselang. Bandingkan dengan integral eksak.

Luas trapesium adalah lebar dikali rata-rata tinggi ujung.

Nilai ujungnya 2 dan 14, sehingga luas trapesium 4(2+14)/2=324(2+14)/2=32. Integral eksak [3x2/2+2x]04=24+8=32[3x^2/2+2x]_0^4=24+8=32. Kecocokan eksak ini diharapkan karena grafik fungsi linear sendiri merupakan ruas garis.

14.10.5 Latihan 4 - residual bukan galat solusi

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 x̂\widehat{x} 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.

14.10.6 Latihan 5 - eksperimen Euler

Status kurikulum: ekstensi B70 yang ditunda; bukan inti B80.

Untuk y=yy'=y, y(0)=1y(0)=1, bandingkan galat pada t=1t=1 untuk h=1/10h=1/10 dan h=1/20h=1/20. Kesimpulan apa yang boleh dibuat?

Gunakan solusi referensi ete^t dan jangan menaikkan dua kasus menjadi teorema.

Langkah Euler memberi (1+h)1/h(1+h)^{1/h}. Untuk h=0,1h=0{,}1 nilainya sekitar 2,5937; untuk h=0,05h=0{,}05 sekitar 2,6533; sedangkan e2,7183e\approx2{,}7183. 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.

14.11 Ringkasan

  • Metode numerik datang bersama asumsi dan teorema.
  • Implementasi asli dan scipy.optimize.root_scalar(method="bisect") memberi pemeriksaan silang A30 yang harus merekam versi, selang, toleransi, konvergensi, dan kesepakatan hasil.
  • Kriteria berhenti harus dinyatakan sebelum hasil dilihat.
  • Residual, batas selang, dan kasus eksak memberi pemeriksaan yang berbeda.
  • Galat masalah, diskretisasi, pembulatan, dan implementasi tidak boleh dicampur.
  • Eksperimen pemurnian memberi bukti kerja; bukti konvergensi memerlukan argumen matematika.
  • Kuadratur B30, sistem linear B40, dan Euler B70 tetap merupakan ekstensi dan tidak boleh dihitung sebagai inti B80.