Całkowanie dowolnego wielomianu metodą Monte Carlo

0

Witam, w październiku rozpocząłem studiowanie fizyki ogólnej i jestem początkujący w świecie programowania. Na zaliczenie wstępu z c++ mam przygotować program rozwiązujący dowolny problem numeryczny. Zdecydowałem się na całkowanie dowolnego wielomianu metodą monte carlo. Napisałem już program, który kompilator przyjmuje bez problemów natomiast przy wyborze dokładności wyznaczania max/min funkcji program się zatrzymuje. Byłbym wdzięczny za jakiekolwiek wskazówki jak uporać się z tym problemem.

#include <iostream>
#include <cstdlib>
#include <time.h>
#include <cmath>
#include <stdio.h>
 
 
// *****CAŁKOWANIE DOWOLNEGO WIELOMIANU METODĄ MONTE CARLO*****//
 
 
using namespace std;
 
 
//wartosc funkcji w punkcie x
long double Wartoscfunkcji( int*wspolczynniki, int n, long double x )
{
    long double funkcja = 0;
   
    for(int i=0; i<n; i++)
   
         funkcja +=((long double)wspolczynniki[i]) *((long double) pow(x,(long double)( n-i-1)));
   
    return funkcja;
}
 
int main()
{
    int ilosc, an, i, b, c, n;
//wczytanie wielomianu  
    cout << "Podaj stopien najwyzszej potegi: " << endl;
    cin >> an;
   
    int * wspolczynniki = new int[ an ];
   
    for(i=0;i<=an;i++)
    {
        if(i==0) cout << "Podaj wartosc wyrazu wolnego: " << endl; else
        cout << "Podaj wspolczynnik " << i << "stopnia wielomianu" << endl;
        cin >> wspolczynniki[i];
    }
   //wczytanie przedzialu calkowania
    cout << "Podaj poczatek przedzialu calkowania: " << endl;
    cin >> b;
   
    cout << "Podaj koniec przedzialu calkowania: " << endl;
    cin >> c;
   
   
    cout << "Wprowadzony wielomian to: " << endl;
    for(i=an;i>=0;i--)
    {
        if(i==0) cout << wspolczynniki[i]; else
        cout << wspolczynniki[i] << "x^" << i;
        if(i>0)
        if(wspolczynniki[i]>=0) cout << "+"; else cout << "-";
    }
   
    cout << endl << "Podaj dokladnosc wyznaczania max/min funkcji: ";
    cin >> n;
   
//wyznaczanie maximum i minimum funckji w danym przedziale
    long double wartosc = 0, maximum = 0, minimum = 0, krok = 1/n;
   
    for( double i=b;i<=c;i=i+krok)
    {
        wartosc=Wartoscfunkcji(wspolczynniki, an, i);
       
        if(wartosc>maximum) maximum=wartosc;
       
        if(wartosc<minimum) minimum=wartosc;
     
    }
     cout << "maximum funkcji w przedziale wynosi " << maximum;
       cout << "minimum funkcji w przedziale wynosi " << minimum;
    long double wysokosc, szerokosc;
   
    szerokosc =(long double)(c-b);
    wysokosc = maximum - minimum;
   
    cout << "Podaj liczbe losowań: " << endl;
    cin >> ilosc;
   //losowanie punktow z przedzialu
    long double X, Y;
    int licznik;
   
    for(i=0; i<ilosc;i++)
    {
        X =((long double) rand() /(RAND_MAX))*(c-b)+b;
        Y =((long double) rand() /(RAND_MAX))*(wysokosc-szerokosc)+szerokosc;
       
        wartosc = Wartoscfunkcji(wspolczynniki,an,i); 
       //sprawdzenie czy punkt lezy pod wykresem funkcji
        if(Y>0 && wartosc>0 && Y<=wartosc) licznik++;
       
        if(Y<0 && wartosc<0 && Y>=wartosc) licznik--;
       
    }
   
  //wyznaczenie pola powierzchni pod wykresem
 
    long double P;
   
    P =(szerokosc*wysokosc) *(long double) licznik /(long double) ilosc;
   
    cout << "Punkty trafione: " << licznik << endl;
    cout << "Wartość calki: " << P << endl;
   
    getchar();
    getchar();
    return 0;
}
0

Spróbuj:

krok = 1/(double)n;
0

Nic to nie zmieniło - program nadal zatrzymuje się w tym samym miejscu.

0

Tak na pierwszy rzut oka:

    int * wspolczynniki = new int[ an ];
 
    for(i=0;i<=an;i++)

Alokujesz tablicę mającą an elementów, chociaż potem korzystasz z niej, jak gdyby miała ich an+1.

Btw, time.h i stdio.h to nagłówki pozostałe po C, które w C++ nazywają się odpowiednio ctime oraz cstdio, stajesz sobie z tego sprawę, oczywiście?

0
Patryk27 napisał(a):

Alokujesz tablicę mającą an elementów, chociaż potem korzystasz z niej, jak gdyby miała ich an+1.

Nie bardzo rozumiem co masz na myśli. Wprowadzając wartości wspołczynników w tej pętli wszystko działa tak jak powinno.

0

Wychodzisz poza zakres tablicy, przyjrzyj się.

int * wspolczynniki = new int[ an ];
 
for(i=0;i<=an;i++)
{
 /* ... */
 cin >> wspolczynniki[i];
}
0

Okej, poprawiłem ale nie zmieniło to wiele, bo program tak jak pisałem wcześniej sypie się przy wyznaczaniu dokładności max/min funkcji. Dla wartości 1 program o dziwo idzie dalej ale dla każdej innej pada.

0

Przestepuj kod debuggerem i sprawdź, o co dokładnie chodzi.
Btw:

 if(Y<0 && wartosc<0 && Y>=wartosc) licznik--;

Jesteś pewien, że ten warunek się kiedyś sprawdzi?</del> - okej, mój błąd z tym; jest "kilka" liczb będących rozwiązaniem :P

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