Монте Карло для двойного интеграла - C (СИ)
Формулировка задачи:
Нужно найти двойной интеграл методом Монте Карло. Уже неделю лазил по нете, нашел пару программ на Pascal но у всех нашел ошибки и так и не разобрался как должно быть правильно. пока что ищу следующее:
4 8x
/ /
| |
| | sqrt(x+y)
/ /
0 3x
по примеру на паскале писал, но он не правильный, потому считает интеграл даже когда верхний предел МЕНЬШЕ нижней.
сюда даю код на паскале сначала и то что уже написал на С .
омогите написать рабочий код, может быть даже иная ф-я главное кратный интеграл и метод Монте Карло!
МОЙ КОД:
program MonteCarlo;
uses
crt;
const k=100;
Var a,b,c,d,ng,vg,x,y,s,integral : real;
n,i,j : integer;
integr:array[1..k]of real;
Function f(x,y:real):real;
Begin
f:=Sqrt(x+y);
end;
Function nm(x:real):real;
Begin
nm:=3*x;
end;
Function vm(x:real):real;
Begin
vm:=8*x;
end;
BEGIN
clrscr;
writeln('Vvedit znachennya granyts integruvannya ');
write('a='); readln(a);
write('b='); readln(b);
writeln('Vvedit chyslo vyprobuvan:');
readln(n);
c:=nm(a);
d:=vm(b);
randomize;
for j:=1 to k do
begin
s:=0; integral:=0;
For i:=1 to n do
begin
x:=a+(b-a)*random;
y:=c+(d-c)*random;
ng:=nm(x);
vg:=vm(x);
If (y <= vg) and(y >= ng) then s:=s + f(x, y);
end;
integr[j]:=(b-a)*(d-c)*s/n;
writeln(integr[j]:10:4);
end;
for j:=1 to k do
Integral:=integral+ integr[j];
writeln('Userednenyy integral=',(integral/k):10:4);
readln;
END.#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
int debug(int a)
{
if((a>-32768) && (a<32767))
;
else{
printf("\n\t \t Ви ввели невірний символ! \n \t \t Необхідно було ввести ціле число \n \n");
getch();
exit(1);
}
return 0;
}
void main()
{
SetConsoleOutputCP(1251);
double a,b;
int end;
double x,y;
unsigned int n;
double rezult=0;
srand(time(NULL));
printf("\n\t верхня межа =");
scanf("%lf",&a);
debug(a);
printf("\t нижня межа =");
scanf("%lf",&b);
debug(b);
inv: printf("\t Введіть кількість випробувань \n");
printf("\t n=");
scanf("%d",&n);
if((n<0) || (n>65535))
{
printf("\n\tВи ввели невірне число, кількість може бути від 0 до 65535\n");
goto inv;
}
double c,d;
c=8*a;
d=3*b;
double sum=0;
double chek1,chek2;
int i;
for(i=0;i<n;i++)
{
x=b+(a-b)*rand();
y=d+(c-d)*rand();
chek1=8*x;
chek2=3*x;
if( (y>chek2) && (y<chek1))
sum=sum+sqrt(x+y);
}
rezult=sum/n;
printf("\n \t результат виконання програми : %8.3lf \n\n\n",rezult);
getch();
}
Народ HELP !
Help !
НАРОД ХЕЛПППП ПЛЗЗЗЗЗ !!!!
Решение задачи: «Монте Карло для двойного интеграла»
textual
Листинг программы
rezult=sum*(a-b)*(c-d)/n;