Монте Карло для двойного интеграла - 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;

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


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

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

14   голосов , оценка 3.857 из 5
Похожие ответы