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