Całkowanie numeryczne metodą Monte Carlo

0

Witam. Mam za zadanie napisać program obliczający całki oznaczone metodą Monte Carlo i nie wiem w jaki sposób go zacząć. Czy ktoś może kiedyś pisał już taki program i może pomóc? :(

1

Wiesz coś o metodzie Monte Carlo? Jest jedną z prostszych.
Umiesz programować?

Google wystawia bardzo uzyteczne wyniki w już w pierwszych pozycjach

5

Zrób generator 500-znakowych ciągów znaków, a wygenerujesz poprawny program.
Wg koncepcji Everett-a poprawny wynik powinieneś osiągnąć już w pierwszym kroku - o ile jesteś w odpowiednim wszechświecie.
Zobacz także http://wiki.c2.com/?QuantumBogoSort

0

A co już napisałeś?
Masz chociaż public static void main ?

5

@raczkujący_informatyk to akurat jest proste jak budowa cepa:

  • robisz sobie prostokąt ograniczający krzywą którą chcesz całkować w granicach całkowania (czyli granice całkowania to zakres X a min/max funkcji to zakres Y)
  • dużo dużo razy w pętli losujesz dowolny punkt w tym prostokącie
  • zliczasz ile raz punkt wypadł pod krzywą (A) i ile razy wypadł nad krzywą (B)
  • pole prostokąta chyba umiesz policzyć, x*y
  • pole pod krzywą wynosi xy(A/(A+B))

Czyli jeśli pole prostokąta to 10, a np. 12.3% punktów wypadło ci pod krzywą, to pole pod krzywą to około 1.23
Im więcej punktów wylosujesz tym dokładniejsza będzie aproksymacja.

0
AnyKtokolwiek napisał(a):

Wiesz coś o metodzie Monte Carlo? Jest jedną z prostszych.
Umiesz programować?

Google wystawia bardzo uzyteczne wyniki w już w pierwszych pozycjach

Może i jest prosta, jednak dla kogoś kto zaczyna programować niekoniecznie, proszę o wyrozumiałość, nie szukam gotowego programu, lecz wskazówek w jaki sposób mogę go wykonać - raczkujący_informatyk 8 minut temu

void main () .... Jak na razie nie pokazałeś na ŻADNEJ własnej aktywności. Jeśli bycie "informatykiem" umieszczasz w jakiejś swojej perspektywie, rycie za informacją, wiedzą, próby i błędy, pogłębianie wiedzy jest podstawą.
Na tym etapie ma dla Ciebie propozycję: zmień ksywkę na* skamlający_informatyk*

0

Podstawowe pytanie, czy rozumiesz tę metodę? Zanim zaczniesz to pisać jako kod, musisz ogarnąć co się tam dzieje 'na papierze'.
Jeśli tak:

  • rozpisz nam krok po kroku co się według Ciebie tam dzieje. Dzięki temu będziesz miał podstawe do zamiany tego na kod

Jeśli nie:

  • zacznij od zrozumienia zagadnienia.
0

Odpowiadaj w postach, jeśli tyczy się to tematu.

Coś wydaje mi się, że Twój komentarz to słowa @Shalom a nie Twoje ;)

Czy jest to Twój pierwszy program, że nie wiesz jak definiować funkcje? W javie to się nazywa metoda. Angielski znasz? Wystarczy wpisać słowa kluczowe w google i od razu znajdziesz odpowiedź. Słowa kluczowe: java, monte carlo, integral.

Jeden z wyników: http://people.cs.pitt.edu/~ramirez/cs1538/handouts/Monte.java

Kod jest zrobiony dla konkretnych funkcji, ale nic nie stoi na przeszkodzie, aby przerobić go żeby przyjmował za argument dowolna funkcję podcałkową razem z granicami.

0

Słowa są moje, ponieważ tak właśnie rozumiem tę metodę. Nie jest to pierwszy program, lecz drugi, stąd pytanie.
Właśnie na myśli miałam obliczanie dla dowolnej funkcji, nie konkretnej, co sprawia mi kłopot.

3

Do tej pory nie pokazałaś nawet kodu, który policzy całkę dla konkretnej funkcji. Jak to zrobisz, to wtedy myśl o przerobieniu tego na dowolną funkcję :)

0
public interace DowolnaFunkcja (
    public double f(double x);
}

puclic class KonkretnaFunkcja extends DowolnaFunkcja  {
   public double f(double x){
        return 0.7*x*x;
   }
}

I całkowanie uzależniasz od interfejsu DowolnaFunkcja
BTW ze wszech miar całkowanie w wydzielonej metodzie, albo jeszcze lepiej wydzielonej klasie, nie w main();

Formalna nazwa w językach ściśle obiektowych jak Java to **funktor **(przynajmniej ja tak znam), jest obiektowym wyrażeniem koncepcji funkcji

0

Dziękuję za pomoc. Spróbuję wszystko zrobić od nowa

1

@AnyKtokolwiek ja bym w ogóle dał tam Function<Double,Double> bo taki interfejs java już posiada ;) Można nawet użyć go przez lambde:

double integrate(Function<Double,Double> function, int pointsNumber);
//
integrate(x->2*x*x+1, 100);

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