Obliczanie całki metodą Monte Carlo I bez wykresu - jak?`

0

Jak to zrobić? Czy da się obliczyć przybliżoną wartość calki metoda Monte Carlo 1 bez rysowania jej wykresu? Nigdzie nie znalazlem zadnych przykladow na to:(

0

Nadaje się do działu algorytmy.
A kto ci każe rysować jawny wykres do metody monte carlo? To co tak na prawdę robi metoda mc ma interpretacje na wykresie, ale nie musisz rysować jawnego wykresu.

Najprościej to można opisać:
calka(a, b, iter_n, func)
{
wynik = 0;
for i=1 to iter_n
x = losowa liczba z przedziału [a, b]
wynik += func(x);

return wynik;
}

0

a co nam po sumie?

trafienia=0
for i:= 1 ... n
    x= losowa( a, b )
    y= losowa( ymin, ymax )
    if y <= f(x) 
        trafienia++
return (ymax - ymin)*(b - a ) * trafienia / n
0

To rozumiem, ale to jest DRUGA metoda monte carlo, mi chodzi o pierwszą: http://www.algorytm.org/procedury-numeryczne/calkowanie-numeryczne-metoda-monte-carlo-i.html. Czy tu sie da obejsc bez rysowania wykresu? To co podajecie to metoda druga, a ja juz umiem liczyc:)

0

(jeżeli umiesz liczyć, to nadużywasz liczby mnogiej) sorki #32#32 ale :)
byłoby dobrze gdybyś doprecyzował co oznacza pierwsza, a co druga

0

No tu jest pierwsza: http://www.algorytm.org/procedury-numeryczne/calkowanie-numeryczne-metoda-monte-carlo-i.html a tu druga: http://www.algorytm.org/procedury-numeryczne/calkowanie-numeryczne-metoda-monte-carlo-ii.html ... o ile druga umiem obliczyc, to z pierwsza nie zawsze jest latwo, bo trzeba rysowac wykres, a on moze byc dosyc zlozony czasami, a ja chcialbym w jakis sposob uniknac rysowania wykresu

P.S. nie rozumiem o co Ci chodzi z ta liczba mnoga, ale nie wazne w sumie

0

rozumiem chyba, #32#32 ale kiedy to zadziała? i czym to różni się od "metody prostokątów"?

0

Masz przecież jasno podane - "pierwsza" metoda (http://www.algorytm.org/procedury-numeryczne/calkowanie-numeryczne-metoda-monte-carlo-i.html) WYMAGA znajomości zakresu wartości funkcji, czyli jej maksimum i minimum w tym przedziale, co dla Ciebie jest równoznaczne z rysowaniem wykresu. Nie przeskoczysz tu poznania tego zakresu wartości, możesz go sobie wyliczyć z pochodnych (plus krańce przedziału) i będziesz happy.

0

Xitami właściwie już odpowiedział, można jeszcze uogólnić na funkcję, która przyjmuje wartości < 0 zgodnie z:

Całka oznaczona – intuicyjnie: pole powierzchni między wykresem funkcji f(x) w pewnym przedziale [a,b], a osią odciętych, wzięte ze znakiem plus dla dodatnich wartości funkcji i minus dla ujemnych.

http://pl.wikipedia.org/wiki/Ca%C5%82ka

0

Pokaż jaką funkcje chcesz całkować! Jeśli ma czynnik n \cdot exp{-cosDodatnie} (n - czynnik normalizacyjny) to wtedy losuje się zmienną całkowania o rozkładzie opisanym tym czynnikiem.
Całkę się liczy sumując jedynie pozostałą cześć tej funkcji dla wartości argumentu funkcji wylosowanych zgodnie z tym rozkładem.

Ogólnie to jest bardzo dobry sposób jeśli możesz odseparować od funkcji coś co pełni rolę opisu rozkładu zmiennej i potrafisz w prosty sposób generować ten rozkład.

0
double losowa(double a, double b){
        return (double)rand()/RAND_MAX*(b-a)+a; }
 
double f(double x){
        return x*x/3; }
 
main(){
        double a=-1, b=2; 
        int i, n=1000000;
        double traf=2, x, y, ymax=f(a), ymin=f(b);
        i=n;
        while( i-- ) {
                x=losowa( a, b );
                y= f(x);
                if( y>=losowa(ymin, ymax) ) 
                        traf++;
                if( y>ymax ) ymax=y;
                if( y<ymin ) ymin=y; }
        return ! printf("%f", (b-a)*(ymax-ymin)*traf/n + (b-a)*ymin);}

1 użytkowników online, w tym zalogowanych: 0, gości: 1