посчитать интеграл, метод Монте-Карло
Собственно задание: написать программу, которая считает интеграл 1-x*x на интервале [-1;1] методом Монте-Карло (на лекциях этой темы не было).
Препод сказал, что нужно сгенерировать 2 случ. числа, координаты точки, по x [-1,1], по y [0.1], и смотреть, попадает точка в область, ограниченную функцией или нет, как делать дальше я пока не додумался; Сгенерировать от 0 до 1 получилось вот так:
Код:
double x = (rand())/RAND_MAX*1.0
Как сгенерировать от -1 до 1 не знаю, ибо если просто число можно умножить на "-1", а для диапазона - ??
Листинг:
Код:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
double func(double x)
{
return 1-x*x;
}
int main()
{
int point_a = -1;
int point_b = 1;
int number_of_random=0;
double s=0;
printf("how much random points? ");
scanf("%ld",&number_of_random);
srand((unsigned)time(NULL));
for (int i=0;i<number_of_random;i++)
{
s+=func(point_a+((double)rand()/RAND_MAX*(point_b-point_a)));
}
s=s/(double)number_of_random*(point_b-point_a);
printf("\nintegral %f \n",s);
return 0;
}
#include <stdio.h>
#include <time.h>
double func(double x)
{
return 1-x*x;
}
int main()
{
int point_a = -1;
int point_b = 1;
int number_of_random=0;
double s=0;
printf("how much random points? ");
scanf("%ld",&number_of_random);
srand((unsigned)time(NULL));
for (int i=0;i<number_of_random;i++)
{
s+=func(point_a+((double)rand()/RAND_MAX*(point_b-point_a)));
}
s=s/(double)number_of_random*(point_b-point_a);
printf("\nintegral %f \n",s);
return 0;
}
Цитата: Shim
Как сгенерировать от -1 до 1 не знаю, ибо если просто число можно умножить на "-1", а для диапазона - ??
А для диапозона это будет выглядеть так:
Код:
x = 2.0*rand()/RAND_MAX-1.0;
а можно какую нибудь подсказку, как дальше делать ? а то у меня совсем без вариантов.. :confused:
Код:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
double func(double x)
{
return 1-x*x;
}
int main()
{
int point_a = -1;
int point_b = 1;
int number_of_random=0;
double s=0;
double x;
double y;
printf("how much random points? ");
scanf("%ld",&number_of_random);
srand((unsigned)time(NULL));
for (int i=0;i<number_of_random;i++)
{
x = 2.0*rand()/RAND_MAX-1.0; //генерируем x в интервале [-1,1]
y = 2.0*rand()/RAND_MAX-1.0; //генерируем y в интервале [-1,1]
//если сгенерированное число попало в площадь, ограниченную кривой
//на данной координате значение интеграла увеличивается на 1
if(fabs(y)<func(x)) s+=1
}
//Делим полученное значение интеграла на общее число "выбросов"
//метода монте-карло
s=s/(double)number_of_random*(point_b-point_a);
printf("\nintegral %f \n",s);
return 0;
}
#include <stdio.h>
#include <time.h>
#include <math.h>
double func(double x)
{
return 1-x*x;
}
int main()
{
int point_a = -1;
int point_b = 1;
int number_of_random=0;
double s=0;
double x;
double y;
printf("how much random points? ");
scanf("%ld",&number_of_random);
srand((unsigned)time(NULL));
for (int i=0;i<number_of_random;i++)
{
x = 2.0*rand()/RAND_MAX-1.0; //генерируем x в интервале [-1,1]
y = 2.0*rand()/RAND_MAX-1.0; //генерируем y в интервале [-1,1]
//если сгенерированное число попало в площадь, ограниченную кривой
//на данной координате значение интеграла увеличивается на 1
if(fabs(y)<func(x)) s+=1
}
//Делим полученное значение интеграла на общее число "выбросов"
//метода монте-карло
s=s/(double)number_of_random*(point_b-point_a);
printf("\nintegral %f \n",s);
return 0;
}
Цитата: e-XperT
Надо так
Большущее спасибо, мне по y нужно (0;1), вот так правильно ? :o
Код:
y = rand()/RAND_MAX*1.0
[SIZE="3"]
update: вопрос исчерпан, всем кто помогал большое спасибо)[/SIZE]