eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingSimpson vs. Niski CotesRe: Simpson vs. Niski Cotes
  • Received: by 10.52.66.235 with SMTP id i11mr4315761vdt.7.1352811538740; Tue, 13 Nov
    2012 04:58:58 -0800 (PST)
    Received: by 10.52.66.235 with SMTP id i11mr4315761vdt.7.1352811538740; Tue, 13 Nov
    2012 04:58:58 -0800 (PST)
    Path: news-archive.icm.edu.pl!news.icm.edu.pl!opal.futuro.pl!news.internetia.pl!newsf
    eed.pionier.net.pl!news.glorb.com!c7no24409712qap.0!news-out.google.com!gf5ni47
    967827qab.0!nntp.google.com!c7no23965652qap.0!postnews.google.com!glegroupsg200
    0goo.googlegroups.com!not-for-mail
    Newsgroups: pl.comp.programming
    Date: Tue, 13 Nov 2012 04:58:58 -0800 (PST)
    In-Reply-To: <k7tbmv$6se$1@zeus.man.szczecin.pl>
    Complaints-To: g...@g...com
    Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=193.189.80.39;
    posting-account=EexxQQoAAAAkOfWz0VZRKLcHNpXJZLB9
    NNTP-Posting-Host: 193.189.80.39
    References: <509ee300$0$26682$65785112@news.neostrada.pl>
    <k7olf5$rpm$1@news.task.gda.pl> <k7rnav$8eq$1@node2.news.atman.pl>
    <k7t76g$3f0$1@zeus.man.szczecin.pl>
    <4...@g...com>
    <k7tbmv$6se$1@zeus.man.szczecin.pl>
    User-Agent: G2/1.0
    MIME-Version: 1.0
    Message-ID: <4...@g...com>
    Subject: Re: Simpson vs. Niski Cotes
    From: Roman W <r...@g...com>
    Injection-Date: Tue, 13 Nov 2012 12:58:58 +0000
    Content-Type: text/plain; charset=ISO-8859-1
    Xref: news-archive.icm.edu.pl pl.comp.programming:200778
    [ ukryj 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: