Metoda Monte Carlo całki podwójne (wyjasnienie kodu)

0

Witam, potrzebuje wyjasnien na temat kodu napisanego w c++, co w poszegolnych linijkach sie dzieje. A także gdy próbuje skompilować wywala mi błąd w linijce " srand((unsigned)time(NULL));" Dlaczego?
oto kod:

#include <iostream>
#include <math.h>
using namespace std;

double f(double x, double y)
{

return 1/((y+x+1)*(y+x+1));

}

int main()
{
int N = 5000000;
int i;
double s,xp,xk,dx,dy,yp,yk;
cout << "Podaj poczatek przedzialu x: " << endl;
cin >> xp;
cout << "Podaj koniec przedzialu x: " << endl;
cin >> xk;
cout << "Podaj poczatek przedzialu y: " << endl;
cin >> yp;
cout << "Podaj koniec przedzialu y: " << endl;
cin >> yk;
srand((unsigned)time(NULL));
dx = (xk-xp);
dy = (yk-yp);
for (int j = 0; j<200; j++){
s = 0;
for (i=1;i<=N;i++) {
s += f(xp+((double)rand()/(double)(RAND_MAX)*dx),yp+((double)rand()/(double)(RAND_MAX)dy));
}
s = (dx
dy / N) *s;
cout << "Wartosc calki wynosi : " << s << endl;
}
system("pause");
}

a także pojawia sie taki komunikat:
<image>1111jpg_epersqx.jpg</image>
Za każda pomoc serdecznie dziekuje

0

No bez jaj...
Jak nie rozumiesz cudzego kodu to postaraj się go stworzyć samodzielnie ;)
Natomiast odnośnie błędów to przyda Ci się umiejętność czytania, czego one dotyczą.

0

nie jestem programista, i nie chce być, to nie jest mój kod i dlatego probuje go sobie wytłumaczyć lecz nie rozumiem nadal. Wiem że trzeba zadeklarować zmienne ale w jaki sposb w jezyku c++?

0

Przy srand((unsigned)time(NULL)), może wywalać Tobie błąd dla tego że nie masz dodanych odpowiednich bibliotek. Dodaj biblioteke <ctime> oraz <cstdlib> i to powinno załatwić sprawe.

0

Pomijam też fakt że dodawanie bibliotek wygląda tak #include<nazwa biblioteki="biblioteki">, u Ciebie brakuje tez #, nie wiem czy to dla tego że przy kopiowaniu "zjadłeś" czy po prostu nie napisałeś.
Tak czy inaczej dodaj biblioteki #include<ctime>, #include<cstdlib> no i do tych co już masz dopisz tylko # przed słowem include.

0

zapozyczylem ten program z tego forum lecz innego tematu , i chce go przerobić po tych radach co pewien uzytkownik dodal, lecz to sa moje poczatki w c++ i nie wiem dokladnie jak to zrobić: czy ktos by mi pomogł?
http://4programmers.net/Forum/C_i_C++/144223-Metoda_Monte_Carlo_calki_podwojne

Ps. to jest bład gdy kopiowalem :)

1

Dostałeś zadanie, jak go przerobisz nie samodzielnie to kolejne zadanie będzie nadal twoimi początkami, z tym że kolejne już samodzielnie nie zrobisz bo będzie dla ciebie zbyt trudne.

0

popracowałem troche i wyszło mi coś takiego:
#include <iostream>
#include <math.h>
#include <cstdlib>
#include <ctime>
using namespace std;

double f(double x, double y)
{

return 1/((y+x+1)*(y+x+1));

}

int main()
{
int N = 5000000;
int i;
int w;
double s=0;
double xp,xk,dx,dy,yp,yk,x,y;
srand(time(NULL));
do{
cout<<"Czy obszar liczenia calki jest prostokatny czy nieprostokatny:"<<endl;
cout<<"1 - prostokatny"<<endl<<"2 - nieprostokatny"<<endl<<"3 - zakoncz "<<endl;
cin>>w;
switch(w){
case 1:
cout << "Podaj poczatek przedzialu x: " << endl;
cin >> xp;//poczatek przedzialu na osi X
cout << "Podaj koniec przedzialu x: " << endl;
cin >> xk;//koniec przedzialu na osi X
cout << "Podaj poczatek przedzialu y: " << endl;
cin >> yp;//poczatek przedzialu na osi Y
cout << "Podaj koniec przedzialu y: " << endl;
cin >> yk;//koniec przedzialu na osi Y
dx = (xk-xp);//roznica pomiedzy poczatkiem a koncem na X
dy = (yk-yp);//roznica pomiedzy poczatkiem a koncem na Y
for (i=1;i<=N;i++)
{
s += f(xp+((double)rand()/(double)(RAND_MAX)*dx),yp+((double)rand()/(double)(RAND_MAX)dy));
}
s = (dx
dy / N) *s;
cout << "Wartosc calki wynosi : " << s << endl;
break;
case 2:
cout << "Podaj poczatek przedzialu x: " << endl;
cin >> xp;//poczatek przedzialu na osi X
cout << "Podaj koniec przedzialu x: " << endl;
cin >> xk;//koniec przedzialu na osi X
cout << "Podaj poczatek przedzialu y: " << endl;
cin >> yp;//poczatek przedzialu na osi Y
cout << "Podaj koniec przedzialu y: " << endl;
cin >> yk;//koniec przedzialu na osi Y
dx = (xk-xp);//roznica pomiedzy poczatkiem a koncem na X
dy = (yk-yp);//roznica pomiedzy poczatkiem a koncem na Y
for (i=1;i<=N;i++)
{
x = xp+((double)rand()/(double)(RAND_MAX)*dx); //sprawdzenie czy
y = yp+((double)rand()/(double)(RAND_MAX)dy); // punkty należą do obszaru
if (y <= 1/x && y >= 0 )//warunki z zadania
{
s += f(x,y);
}
else
{
s += 0;
}
}
s = (dx
dy / N) *s;
cout << "Wartosc calki wynosi : " << s << endl;
break;
case 3:
cout<<"koniec"<<endl;
break;
}
}while(w<3 && w>0);

system("pause");

}

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