Przejdź do głównej zawartości

Pierwiastek kwadratowy [m. połowienia]

Metoda połowienia jest najwolniej zbieżną metodą znajdowania przybliżonych pierwiastków funkcji w zadanym przedziale argumentów [a; b]. Metodę tę można zastosować, jeśli funkcja jest ciągła i ma przeciwne wartości w krańcach przedziału ( f(a) * f(b) < 0 ).

Aby wykorzystać tę metodę do wyznaczania wartości pierwiastków kwadratowych należy odpowiednio przygotować funkcję kwadratową:

f(x) = ax^2 + bx + c


Będziemy szukać miejsca zerowego (nieujemnego) funkcji

f(x) = x^2 - A

czyli

x^2 - A = 0

gdzie A jest liczbą, której pierwiastka będziemy szukać w określonym przedziale. Dla ułatwienia możemy przyjąć, że ten przedział będzie następujący: [0; A)

W tej metodzie sprawdza się czy miejsce zerowe znajduje się na środku zadanego przedziału. Jeżeli sprawdzany element jest większy od poszukiwanego elementu to staje się on nowym końcem przedziału. W przeciwnym przypadku sprawdzany element staje się nowym początkiem przedziału.
Powyższe czynności powtarza się aż do znalezienia miejsca zerowego lub do znalezienia elementu, którego wartość będzie wystarczająco bliska poszukiwanej wartości.

Dla A = 2 i bezwzględnego błędu eps = 0,1 (zakładana dokładność obliczeń) graficzne przedstawienie opisywanej metody będzie wyglądało następująco:



W powyższym przykładzie ostatnim otrzymanym przedziałem jest [1,375; 1,4375). Jego średnica jest mniejsza niż 0,1. Poszukiwanym wynikiem może być, którakolwiek z liczb znajdujących się w tym przedziale. W realizacji komputerowej przyjąłem, że wyświetlę najmniejszy element ostatniego przedziału.

Realizacja komputerowa w języku C++


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <math.h>
 
using namespace std;
 
int main() {
    float A;
    float a, b;
    float srodek;
    float eps = 0.1;
    
    cin >> A;
    
    a = 0;
    b = A;
    
    while(fabs(a-b)>eps)
    {
        srodek = (a + b) / 2;
        if(srodek * srodek > A)
            b = srodek;
        else
            a = srodek;   
        cout <<"[" << a<< ", " << b <<")"<< endl;
    }
    cout << a;
    return 0;
}





Popularne posty z tego bloga

[C++]Konwersja systemu dziesiętnego na binarny [dec2bin, dec2u2]

Konwersja między systemami liczbowymi była już poruszana w tym serwisie tym razem zajmę się kodem U2. Inaczej zwany uzupełnieniem do 2. Opis tego systemu pojawił się w kontekście wstępu do programowania w języku Python [ tutaj ]. Prosty program tzw. szkolny zamiany nieujemnej liczby dziesiętnej na jej postać binarną: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <iostream> using namespace std; int main () { int liczba; cin >> liczba; string wynik; while (liczba){ wynik = (liczba % 2 ? "1" : "0" ) + wynik; liczba /= 2 ; } cout << wynik; return 0 ; } Poniżej prezentuję kod programu, który zawiera trzy metody rozwiązania problemu jakim jest wyświetlenie użytkownikowi reprezentacji u2 podanej przez niego liczby dziesiętnej. Pierwsza z nich wywodzi się z typowego algorytmu konwersji systemu dec do u2: 1. przedstaw bezwzględną wartość liczby dziesiętnej w postaci binarnej, 2. dodaj na początek

Python - lekcja 005

Spis treści - zamiana całkowitych liczb dziesiętnych na ich odpowiedniki w innych systemach liczbowych (algorytm), - ujemne liczby całkowite w systemie binarnym (ZM, U1, U2, algorytm, formatowanie stringów, rzutowanie ze zmianą systemu liczbowego) [dec2bin, dec2ZM, dec2U1, dec2U2] - zadania.