Монте Карло для двойного интеграла - 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;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д