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;
}