| Opakuj, dokud délka intervalu (b - a) není menší než zvolená přenost ε, nebo dokud není | f(c) | < ε |
a = 1 b = 2 f(a) = -2 f(b) = 5
Na levém konci je funkce záporná, na pravém kladná. Jelikož je funkce spojitá, musí někde mezi těmito body projít nulou, jinak by se nemohla plynule změnit ze záporné na kladnou. Když vezmeme c = (1 + 2) / 2 = 1.5, a pak spočítáme f(c) = f(1,5) = 0.1, pak f(c) má stejné znaménko jako f(a), a to znamená, že kořen leží mezi c a b, protože v této části se funkce mění ze záporné na kladnou.
bisection <- function(f, a, b, eps) {
fa <- f(a)
fb <- f(b)
if (fa * fb >= 0) {
stop("Function does not change sign on the interval")
}
while (abs(b - a) > eps) {
c <- (a + b) / 2
fc <- f(c)
if (fa * fc < 0) {
b <- c
fb <- fc
} else {
a <- c
fa <- fc
}
}
return((a + b) / 2)
}
# f(x) = 7x − 9
f <- function(x) { 7*x - 9 }
# interval ⟨1, 2⟩ a přesnost ε = 1e-6
root <- bisection(f, a = 1, b = 2, eps = 1e-6)
# root ≈ hodnota x, kde hledáme řešení rovnice f(x) = 0
print(root)
# f(x) = 0 -> f(root) ≈ 0
print(f(root))
Najděte numericky řešení rovnice x^3 - x - 1 = 0 na intervalu <1, 2> s přesností eps = 1e-6.
f <- function(x) { x^3 - x - 1 }
root <- bisection(f, a = 1, b = 2, eps = 1e-6)
print(root)
print(f(root))
imax hledá řádek s největším možným pivotem v aktuálním sloupci, + p − 1 převádí lokální index na globální, a výměna řádků zajišťuje, že Gaussova eliminace nedělí malým číslem a zůstane numericky stabilní.ord <- order(x)
x <- x[ord]
y <- y[ord]
viz METHODS.md