eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingSimpson vs. Niski Cotes
Ilość wypowiedzi w tym wątku: 185

  • 31. Data: 2012-11-12 21:48:30
    Temat: Re: Simpson vs. Niski Cotes
    Od: bartekltg <b...@g...com>

    W dniu 2012-11-11 17:58, Baranosiu pisze:
    > Dnia 10.11.2012 slawek <s...@h...pl> napisał/a:
    >> W kontekście rozmaitych forumowych "specjalistów" od metod numerycznych -
    >> zabawne, jak tym razem będą wyjaśniać trywialny w istocie rezultat...
    >>
    >> exact 0.5022749400837604
    >> tapez 0.5022749194207212
    >> simpson 0.5022738634614975
    >>

    Hmm... Nawet z tak prostą operacją jak dodanie słupka iloczynów
    nie dał sobie rady? Niemożliwe. Chociaż...

    > [...]
    > Akurat w tym przypadku tak, ale weź inny przedział całkowania (na
    > przykład -10..10 tak żeby wpływ funkcji wykładniczej był nieco
    > bardziej znaczący) i już simpson może wypaść lepiej.

    Sławek schrzaniał algorytm i tyle. Pewnie źle dobrał
    epsilon maszynowy;)



    Wrzucam porównanie kilku podstawowych metod.
    Newtona_Cotesa do 6 punktowych,
    (za stopień 0 robi 'midpoint', dwupunktowa to trapezy,
    trzypunktowa - simpson), kwadratury Gaussa 2-6 punktowe
    i kwadratury Lobatto, (czyli takie, które mają wezły
    na brzegach, ale pozostałe są tak dobrane, by wyciągnąć
    największy rząd) operte na 4 do 7 węzłów.
    (znów 2 to trapez, 3 to simpson).

    Węzły N-C są równoodległe, pozostałe to pierwiastki pewnych
    wielomianów. Wielomiany te wyznaczane są numerycznie z definicji
    rekurencyjnej. Tak samo są wyszukiwane pierwiastki. Wszystko
    za pomocą double, dlatego też nie można przesadzać z rzędem
    metody - prowadzi to do błędów, o których potem.

    Wagi dobierane są wprost z definicji. W_j to całka na rozpatrywanym
    przedziale z wielomianu który zeruje się na wszystkich węzłach,
    poza x_j, gdzie przyjmuje wartość 1. Całka z wielomianu liczona
    algebraicznie;)

    Następnie tworzymy węzły i wagi dla kwadratury złożonej z określonej
    liczby powtórzeń na przedziale do całkowania. Jeśli podstawowa
    kwadratura miała węzły na obu brzegach, w złożonej będą one zespolone
    w jeden (o wadze równej sumie).


    Takie podejście umożliwia testowanie wielu różnych metod bez rozbijania
    się na przypadki.

    Na wykres wrzucamy błąd względny w funkcji ilości wywołań
    funkcji podcałkowej (nie ilości przedziałów, a rzeczywista
    ilość wywołań). Skala log log.
    Wartość dokładna wyliczona przez wolfrem alpha;)


    Wątkowy przykład, sin(x) exp(-x) na [0,5]
    http://w18.wrzuta.pl/obraz/70M5xduXyOU/sin_exp

    Wersja zagęszczona, sin(10*x) exp(-x) na [0,5]
    http://w18.wrzuta.pl/obraz/0SDBiKFZnw0/sin10_exp


    Co widać?

    Simpson i 3/8 oraz midpoint i trapezy czy metody N-C 5 i 6 punktowe
    sa tego samego rzędu.
    Oczywiście pierwsza para zbiega znacznie szybciej. Dokładność
    20 punktowego złożonego Simpsona trapez osiąga dla 200 punktów.

    Coś więcej o tym napisać? Niska kwadratura oczko wyższa jest
    oczko lepsza. Dość oczywiste, eksperyment potwierdził, tyle.


    Dla tego przykładu "lżejsze" metody z każdej pary
    mają ciut lepszą stałą. W sumie nie takie dziwne, podobne
    oszacowanie na błąd, a rozkłada się on na 3 lub 4 punkty.

    Co jeszcze? Dwupunktowy Gauss działa jak N-C na 3 i 4 punktach,
    teoria znów górą.

    O, i ciekawostka nawiązująca do niedawnego wątku o dokładności
    numerycznej. Zamiast pracowicie przepisywać współczynniki
    węzłów i wag zbudowałem maszynkę, która je wyznacza,
    a to obejmowało rekurencyjne wyznaczanie współczynników
    wielomianów (odejmowanie!) i wyliczanie wartości tych
    wielomianów (schemat hornera, ale znów możliwa strata
    dokładności przez odejmowania) wyznaczone wagi mogą być
    obarczone błędem większym niż dokładność numeryczna double.
    Tym większym, im wyższy rząd.

    I doskonale widać to na wykresie. Metody oparte na większej
    liczbie punktów zbiegają szybciej, ale wynik stabilizuje się
    na gorszej dokładności.


    Kody
    https://skydrive.live.com/redir?resid=25C9E1E8909658
    1!2201&authkey=!AGMwPjeQhRXoDe0


    A jak już ciekawostkami. Była taka funkcja użyta
    przez Rungego do pokazania kłopotów z interpolacją
    wielomianową:
    http://en.wikipedia.org/wiki/Runge%27s_phenomenon

    No to hop:
    testuj_calke(@(x)1./(1+25*x.^2),-1,1,0.5493603067780
    0634434450877,20,500)

    http://w18.wrzuta.pl/obraz/8lIeKjKRUs4/runge

    :-)



    pzdr
    bartekltg



  • 32. Data: 2012-11-12 21:55:23
    Temat: Re: Simpson vs. Niski Cotes
    Od: PK <P...@n...com>

    On 2012-11-12, slawek <h...@s...pl> wrote:
    > Forumowe trolle-specjaliści na wszystkim się znają... tylko akurat na
    > pl.comp.programming nie odróżniają Fortranu od C, nie potrafią policzyć
    > samodzielnie numerycznie całki, itd. itp.

    Akurat nie brakuje speców od numeryki, którym wszyscy na tej grupie
    moglibyśmy najwyżej temperować ołówki, a którzy mogliby C od Fortrana
    nie odróżnić, więc w czym problem?

    pozdrawiam,
    PK


  • 33. Data: 2012-11-12 21:57:00
    Temat: Re: Simpson vs. Niski Cotes
    Od: bartekltg <b...@g...com>

    W dniu 2012-11-11 18:44, AK pisze:
    > PS2: Masz racje. Przedzial i funkcje tez sobie dobral "pod przyklad"

    Nie. Schrzanił implementację.

    Jego przykład:
    http://c.wrzuta.pl/wi4888/9c4c1562000019e750a147f7/s
    in_exp

    Trapez to zielona *, simpson to czerwona *.
    Wszytko zgodnie z teorią.

    pzdr
    bartekltg





  • 34. Data: 2012-11-12 21:58:48
    Temat: Re: Simpson vs. Niski Cotes
    Od: bartekltg <b...@g...com>

    W dniu 2012-11-12 21:48, bartekltg pisze:
    >
    > Wątkowy przykład, sin(x) exp(-x) na [0,5]
    > http://w18.wrzuta.pl/obraz/70M5xduXyOU/sin_exp


    Na w szelki wypadek, bo dokopanie do rozsądnej
    rozdzielczości zrobiło się nieintuicyjne :

    http://c.wrzuta.pl/wi4888/9c4c1562000019e750a147f7/s
    in_exp


    > Wersja zagęszczona, sin(10*x) exp(-x) na [0,5]
    > http://w18.wrzuta.pl/obraz/0SDBiKFZnw0/sin10_exp


    http://c.wrzuta.pl/wi19003/0b599d75000065a450a147f6/
    sin10_exp

    pzdr
    bartekltg


  • 35. Data: 2012-11-13 09:09:05
    Temat: Re: Simpson vs. Niski Cotes
    Od: kenobi <p...@g...com>

    Przedstawie moze dla jasnosci modelową 'sytuację
    z dresem', modelowa sytuacja dresiarska jest calkiem prosta i wyglada mw tak:

    1. przychodzi ktos i mowi cos na temat, czesto z sensem, czasem z mniejszy sensem a
    czasem zadaje tylko pytania, ale trzyma sie tamatu i generalnie dyskusja jest
    przedmiotowa i sklanialaby do dyskusji utrzymanej w przedmiotowym nurcie

    2. teraz pojawia sie dres,

    dres rzuca cos w stylu 'ty jestes głupi czy tylko udajesz' ew cos jeszcze bardzij
    durnego,
    uzywa tez oczywiscie slowa wytrycha pt 'troll';
    dres nie jest zainteresowany normalnymi zagadnieniami, ew sygnalizuje tylko ze
    jestes glupi i to co mowisz jest glupie
    nie jest jednak w stanie sie do tego odniesc

    Dresy produkują odzielny nurt na grupie, obok
    tego prawdziwego i merytorycznego produkują
    swoisty nurt jełopienia wypełniony jełopieniem
    i dowalactwem


  • 36. Data: 2012-11-13 09:23:58
    Temat: Re: Simpson vs. Niski Cotes
    Od: kenobi <p...@g...com>

    >
    > Dresy produkują odzielny nurt na grupie, obok
    > tego prawdziwego i merytorycznego produkują
    > swoisty nurt jełopienia wypełniony jełopieniem
    > i dowalactwem

    Moze pozniej jeszcze dopracuje wyraźniejsze
    kryterium (mnie cale te nurty dresiarskie
    glownie meczą) w każdym razie dresa
    łatwo jest poznac po własnie zmianie nurtu
    z normalnego merytorycznego na dowałki,
    czyli poznac mozna dosyc prosto

    Nie wszystko oczywiscie co nie jest scisle programistyczne nie jest merytoryczne, bo
    jakies dygresje nt wlasnych doswiadczen
    itp tez są merytoryczne, jednak to co jest
    ufundowane na dowale jest jełopieniem i dresiarstwem w 100% (mz wynika tio z tego
    ze czesc ludzi jest po prostu dresiarzami
    i lubią przyjełopić, na durnote ciezko cos poradzic)



  • 37. Data: 2012-11-13 10:12:42
    Temat: Re: Simpson vs. Niski Cotes
    Od: "AK" <n...@n...com>

    Użytkownik "kenobi" <p...@g...com> napisał:

    > Moze pozniej jeszcze dopracuje wyraźniejsze kryterium

    Spojrz w lustro. Tam masz prawzor dresa.

    AK




  • 38. Data: 2012-11-13 10:19:20
    Temat: Re: Simpson vs. Niski Cotes
    Od: "AK" <n...@n...com>

    Użytkownik "bartekltg" <b...@g...com> napisał:

    >W dniu 2012-11-11 18:44, AK pisze:
    >> PS2: Masz racje. Przedzial i funkcje tez sobie dobral "pod przyklad"
    >
    > Nie. Schrzanił implementację.

    Faktycznie (nie do wiary).
    Nie zauwazylem. Prawde mowiac nie wglebialem sie. Szkoda mi bylo czasu.
    Tym wieksze uznanie dla Ciebie za tak porzadne podejscie do tematu.
    Zreszta bardzo przydatne i uczace.
    Szczery szacunek i podziekowanie.

    PS: Wlasciwie po Twym poscie powinno z wiadomej strony nastapic milczenie.
    Nie liczylby jednak na to. Te duet (slawek, kenobi) jest wyjatkowo odporny na
    fakty :)

    AK


  • 39. Data: 2012-11-13 11:25:20
    Temat: Re: Simpson vs. Niski Cotes
    Od: "slawek" <h...@s...pl>

    Użytkownik "bartekltg" napisał w wiadomości grup
    dyskusyjnych:k7rnav$8eq$...@n...news.atman.pl...

    >Sławek schrzaniał algorytm i tyle. Pewnie źle dobrał
    >epsilon maszynowy;)

    A konkretnie - poza błędem w komentarzu?

    >Takie podejście umożliwia testowanie wielu różnych metod bez rozbijania
    >się na przypadki.

    Niestety, pomijając dość nonszalancki kod źródłowy (np. "karma_dla_plota"
    jako identyfikator, używanie iloczynu Kroneckera choć można prościej, brak
    komentarzy, niezbyt przemyślane to i owo... oczywiście /trochę/ się
    czepiam), takie podejście ma jedną istotną wadę/zaletę - ukrywa samo
    sumowanie jako liczenie długości wektora przez Matlab/Octave. Czyli
    zasadnicza część algorytmu jest poza kontrolą - choć może to być i zaleta
    ("sumowanie słupka").

    >Na wykres wrzucamy błąd względny w funkcji ilości wywołań
    >funkcji podcałkowej (nie ilości przedziałów, a rzeczywista
    >ilość wywołań). Skala log log.

    Totalne niezrozumienie problemu: tobie nadal wydaje się, że możesz sam sobie
    określać ile razy i w jakich "węzłach" wywołasz sobie funkcję f(x). A tym
    razem problem był i jest taki, że masz z góry zadany ciąg par (x,y), dla
    ułatwienia x[n] = n * h. Mając takie - i tylko takie - dane masz obliczyć
    możliwie dokładnie całkę - np. po to, aby mieć wartość skuteczną (tj.
    średnią całkową). Jawna postać f(x) jest tylko do wygenerowania danych i
    ewentualnie analitycznego oszacowania "prawdziwej" wartości - algorytm
    całkujący nie ma i nie może mieć do niej dostępu.

    Ok, jest z tym pewien /ekstra/ problem - wartość całki liczonej analitycznie
    nie jest aż tak dobrym oszacowaniem - przecież jest to nic innego, niż całka
    z funkcji interpolującej dane, a ta interpolacja może nie odpowiadać
    rzeczywistości (fakt, że dla każdego n zachodzi y[n] = f(x[n]) niczego nie
    przesądza). W istocie rzeczy "naprawdę prawdziwa" wartość całki jest
    niemożliwa do obliczenia - bo dyskretne dane są określone na zbiorze o
    mierze zero i takie tam. Ale to już jest trochę "przefilozofowane".

    >Wartość dokładna wyliczona przez wolfrem alpha;)

    Nie "wolfrem alpha", ale ale Wolfram Alpha - że złośliwie skomentuję. FYI,
    ja preferuję normalną Mathematicę, bo Alfa się komercjalizuje (nic dziwnego)
    i przestaje być tak wygodna jak była - silnik do całkowania mają zapewne ten
    sam. Sympatyczne w Alpha było/jest to, że można wygenerować szczegółowy opis
    rozwiązania.

    >wielomianów (schemat hornera, ale znów możliwa strata
    >dokładności przez odejmowania) wyznaczone wagi mogą być
    >obarczone błędem większym niż dokładność numeryczna double.

    A nie da się ich liczyć analitycznie, tj. na liczbach int? Mathematica nie
    ma z tym trudności.


  • 40. Data: 2012-11-13 11:53:39
    Temat: Re: Simpson vs. Niski Cotes
    Od: Roman W <r...@g...com>

    W dniu wtorek, 13 listopada 2012 10:33:09 UTC użytkownik slawek napisał:
    > Użytkownik "bartekltg" napisał w wiadomości grup
    > dyskusyjnych:k7rnav$8eq$...@n...news.atman.pl...
    >
    > >Sławek schrzaniał algorytm i tyle. Pewnie źle dobrał
    > >epsilon maszynowy;)
    >
    > A konkretnie - poza błędem w komentarzu?

    Poprawnie zaimplementowany Simpson (wg.
    http://en.wikipedia.org/wiki/Simpson%27s_rule#Compos
    ite_Simpson.27s_rule) daje wartosc, dla Twoich danych, 0.5022749400837603, czyli
    znacznie blizej prawdziwej wartosci niz Twoje
    trapezy.

    Kod ponizej (C++):

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

    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;
    double sum = f(x0) + f(x1);
    for (size_t j = 1; j < k; ++j) {
    sum += 2 * f(x0 + 2 * j * h);
    }
    for (size_t j = 1; j <= k; ++j) {
    sum += 4 * f(x0 + (2 * j - 1) * h);
    }
    return h * sum / 3.0;
    }

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


    RW

strony : 1 ... 3 . [ 4 ] . 5 ... 10 ... 19


Szukaj w grupach

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: