Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Intervalna algebra i primena

[es] :: Art of Programming :: Intervalna algebra i primena

[ Pregleda: 1733 | Odgovora: 0 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8450
*.dynamic.sbb.rs.



+2736 Profil

icon Intervalna algebra i primena14.09.2010. u 11:44 - pre 132 meseci
Svakoj realnoj funkciji realne promenljive možemo pridružiti jednu intervalnu funkciju koja intervalima pridružuje intervale tako da važi: ako je interval podskup domena funkcije i za svako važi . Naravno, uvek se može staviti da je , ali od toga nema nikakve koristi. Cilj je da dobijeni interval bude po mogućstrvu što uži.

Intervalna algebra omogućava da kontrolišemo, kako grešku odsecanja ili zaokrugljivanja ili računa (što je isto), tako i ukupnu grešku, koja uključuje i grešku merenja i grešku metode. Vrednost izraza izračunatog u intervalnoj algebri je interval kome garantovano pripada tačna vrednost izraza. Jedna od intervalnih biblioteka za C++ uključena je u boost. Evo primera njene primene na računanje sinusa pomoću tejlorovog razvoja.

Code:
#include <boost/numeric/interval.hpp>

using namespace boost;
using namespace numeric;
using namespace interval_lib;

typedef interval<double> real;

real sin(double arg) {
    real x(arg);
    const real pi2(6.283185307179586, 6.2831853071795867);
    int factor = 1;

    if (x == 0) {
        return real(0);
    }

    if (x < 0) {
        factor = -1;
        x = -x;
    }

    real q = x / pi2;

    q -= floor(q.upper());

    if (q.upper() > 0.5) {
        factor = -factor;
        q -= 0.5;
    }

    if (q.upper() > 0.25) {
        q = -q + 0.5;
    }

    x = q*pi2;

    real x2 = -x*x;
    real s(0);
    real f = x;
    int n = 1;
    real approximation(qMin(0.0, x.lower()), qMax(0.0, x.upper()));

    while (true) {
        s += f;
        n += 2;
        f *= x2;
        f /= n*(n-1);

        real newApproximation = s + f;

        newApproximation = real(qMin(newApproximation.lower(), s.lower()), qMax(newApproximation.upper(), s.upper()));
        newApproximation = real(qMax(newApproximation.lower(), approximation.lower()), qMin(newApproximation.upper(), approximation.upper()));

        if (newApproximation.lower() == approximation.lower() && newApproximation.upper() == approximation.upper()) {
            break;
        }

        approximation = newApproximation;
    }

    if (factor == -1) {
        return -approximation;
    }

    return approximation;
}


Dakle, za svako neka je interval kome pripadaju sve moguće vrednosti oblika za . Jasno je da za to koristimo intervalnu algebru. Mada se greška metode (ostatak) smanjuje sa povećavanjem greška računa će biti sve veća i veća, pa će interval da se proširuje posle nekog . Uz oznaku , tačna vrednost sinusa će svakako pripadati svakom od intervala , jer pripada svakom od intervala i niz intervala će biti neopadajući, ali će posle nekog vremena biti konstantan. Stoga izračunavanje treba prekinuti u trenutku kada bude jednako sa .
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

[es] :: Art of Programming :: Intervalna algebra i primena

[ Pregleda: 1733 | Odgovora: 0 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.