eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingSimpson vs. Niski CotesRe: Simpson vs. Niski Cotes
  • Data: 2012-11-13 13:58:58
    Temat: Re: Simpson vs. Niski Cotes
    Od: Roman W <r...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    W dniu wtorek, 13 listopada 2012 11:42:24 UTC uzytkownik slawek napisal:
    > Udz?ytkownik "Roman W" napisadz? w wiadomodz?ci grup
    > dyskusyjnych:4c699929-26e9-484c-a399-c34765287e83@go
    oglegroups.com...
    >
    > >Poprawnie zaimplementowany Simpson (wg.
    > >http://en.wikipedia.org/wiki/Simpson%27s_rule#Compo
    site_Simpson.27s_rule)
    > >daje wartosc, dla Twoich danych, 0.5022749400837603, czyli >znacznie blizej
    > >prawdziwej wartosci niz Twoje trapezy.
    >
    > Primo, nie pisze sidz? zaimkdz?w osobowych wielkdz? literdz?, wyjdz?tek modz?e
    bydz? dla
    > czasem w tekstach religijnych.

    Robilem to z grzecznosci, ale jezeli ciebie to krepuje, to przestaje.

    > Tertio, popatrzmy co mamy, 1000 przedziadz?dz?w, 500 przedziadz?dz?w, czy modz?e
    2000
    > przedziadz?dz?w? Przedziadz?dz?w czy wdz?zdz?dz?w? Ale to chyba nie w tym
    przyczyna...

    Moja implementacja uzywa prawie tyle samo wartosci funkcji co twoja (10001 zamiast
    10000).
    Roznica powinna byc zaniedbywalna, jezeli obie implementacje byly poprawne.

    > Quarto, pordz?wnaj z wynikiem "mojego Simpsona" - jedz?eli "mdz?j Simpson" bydz?
    > gorszy nidz? "moje trapezy", to oznacza dz?e "twdz?j Simpson" jest dokdz?adniejszy
    > nidz? "mdz?j Simpson" (bo "mdz?j Simpson" gorszy nidz? "moje trapezy") - a to
    > oznacza, dz?e masz inne wyniki dlatego, dz?e masz inny komputer i/lub nie masz
    > tablicy wartodz?ci (czyli liczysz na 80-bitach zamiast na 64-bitach). Sprdz?buj
    > najpierw wdz?adowadz? wszystkie wartodz?ci do tablicy liczb double (tzn. np.
    > wdz?adz?nie 1000 liczb, co da 999 przedziadz?dz?w) - i dopiero potem, po tej
    > modyfikacji, policz co daje "twdz?j Simpson".

    OK, point taken: sprawdzilem wersje z tablica (kod ponizej). Wynik jest nadal
    0.5022749400837603, czyli praktycznie tyle samo, co analityczny rezultat.

    Sorry, masz zla implementacje. Moze sam po swojemu zaimplementuj wersje z Wiki,
    a potem pogadamy?

    RW

    ------

    Kod:

    #include <cmath>
    #include <iostream>
    #include <iomanip>
    #include <vector>

    double function(double x)
    {
    return sin(x) * exp(-x);
    }

    template <class F>
    double integrate_simpson(F f, double x0, double x1, size_t k)
    {
    const size_t n = 2 * k;
    const double h = (x1 - x0) / n;
    std::vector<double> y(n + 1);
    for (size_t j = 0; j <= n; ++j) {
    y[j] = f(x0 + j * h);
    }
    double sum = y[0] + y[n];
    for (size_t j = 1; j < k; ++j) {
    sum += 2 * y[2 * j];
    }
    for (size_t j = 1; j <= k; ++j) {
    sum += 4 * y[2 * j - 1];
    }
    return h * sum / 3.0;
    }

    int main()
    {
    std::cout << std::setprecision(16) << integrate_simpson(function, 0.0, 5.0, 10000/2)
    << std::endl;
    }

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: