Монте Карло для двойного интеграла - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Нужно найти двойной интеграл методом Монте Карло. Уже неделю лазил по нете, нашел пару программ на Pascal но у всех нашел ошибки и так и не разобрался как должно быть правильно. пока что ищу следующее: 4 8x / / | | | | sqrt(x+y) / / 0 3x по примеру на паскале писал, но он не правильный, потому считает интеграл даже когда верхний предел МЕНЬШЕ нижней. сюда даю код на паскале сначала и то что уже написал на С . омогите написать рабочий код, может быть даже иная ф-я главное кратный интеграл и метод Монте Карло!
Листинг программы
  1. program MonteCarlo;
  2. uses
  3. crt;
  4. const k=100;
  5. Var a,b,c,d,ng,vg,x,y,s,integral : real;
  6. n,i,j : integer;
  7. integr:array[1..k]of real;
  8. Function f(x,y:real):real;
  9. Begin
  10. f:=Sqrt(x+y);
  11. end;
  12. Function nm(x:real):real;
  13. Begin
  14. nm:=3*x;
  15. end;
  16. Function vm(x:real):real;
  17. Begin
  18. vm:=8*x;
  19. end;
  20. BEGIN
  21. clrscr;
  22. writeln('Vvedit znachennya granyts integruvannya ');
  23. write('a='); readln(a);
  24. write('b='); readln(b);
  25. writeln('Vvedit chyslo vyprobuvan:');
  26. readln(n);
  27. c:=nm(a);
  28. d:=vm(b);
  29. randomize;
  30. for j:=1 to k do
  31. begin
  32. s:=0; integral:=0;
  33. For i:=1 to n do
  34. begin
  35. x:=a+(b-a)*random;
  36. y:=c+(d-c)*random;
  37. ng:=nm(x);
  38. vg:=vm(x);
  39. If (y <= vg) and(y >= ng) then s:=s + f(x, y);
  40. end;
  41. integr[j]:=(b-a)*(d-c)*s/n;
  42. writeln(integr[j]:10:4);
  43. end;
  44. for j:=1 to k do
  45. Integral:=integral+ integr[j];
  46. writeln('Userednenyy integral=',(integral/k):10:4);
  47. readln;
  48. END.
МОЙ КОД:
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <windows.h>
  4. #include <math.h>
  5. #include <time.h>
  6. #include <stdlib.h>
  7.  
  8. int debug(int a)
  9. {
  10. if((a>-32768) && (a<32767))
  11. ;
  12. else{
  13. printf("\n\t \t Ви ввели невірний символ! \n \t \t Необхідно було ввести ціле число \n \n");
  14. getch();
  15. exit(1);
  16. }
  17. return 0;
  18. }
  19.  
  20. void main()
  21. {
  22. SetConsoleOutputCP(1251);
  23.  
  24. double a,b;
  25. int end;
  26. double x,y;
  27. unsigned int n;
  28. double rezult=0;
  29. srand(time(NULL));
  30.  
  31. printf("\n\t верхня межа =");
  32. scanf("%lf",&a);
  33. debug(a);
  34. printf("\t нижня межа =");
  35. scanf("%lf",&b);
  36. debug(b);
  37.  
  38. inv: printf("\t Введіть кількість випробувань \n");
  39. printf("\t n=");
  40. scanf("%d",&n);
  41. if((n<0) || (n>65535))
  42. {
  43. printf("\n\tВи ввели невірне число, кількість може бути від 0 до 65535\n");
  44. goto inv;
  45. }
  46.  
  47. double c,d;
  48. c=8*a;
  49. d=3*b;
  50.  
  51. double sum=0;
  52. double chek1,chek2;
  53. int i;
  54.  
  55. for(i=0;i<n;i++)
  56. {
  57. x=b+(a-b)*rand();
  58. y=d+(c-d)*rand();
  59.  
  60. chek1=8*x;
  61. chek2=3*x;
  62.  
  63. if( (y>chek2) && (y<chek1))
  64. sum=sum+sqrt(x+y);
  65. }
  66. rezult=sum/n;
  67. printf("\n \t результат виконання програми : %8.3lf \n\n\n",rezult);
  68. getch();
  69. }
Народ HELP !
Help !
НАРОД ХЕЛПППП ПЛЗЗЗЗЗ !!!!

Решение задачи: «Монте Карло для двойного интеграла»

textual
Листинг программы
  1.         rezult=sum*(a-b)*(c-d)/n;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.857 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы