Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2010, 13:04   #1
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Вопрос C++

Дамы и господа!!! Выручайте!!!
Надо найти площадь Q способом Монте Карло и способом
прямоугольника!
Метод Монте карло работает вроде правильно, а прямоугольника нет
Помогите разобраться!
Можно и на паскале!

Код:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <math.h>

#define n_MAX 100000L

double Karlo();
double MRect();

//////////////////////////////////////////////////////////////////////
double f1(double x){return 1+sqrt(1-x*x);}
double f2(double x){return 1-sqrt(1-x*x);}

//////////////////////////////////////////////////////////////////////
double main(int argc, char* argv[])
{
//	printf("Hello World!\n");
//	printf("\n%x",RAND_MAX);
//	getch();

	double z,s;
    z=Karlo();
	printf("\nz=%f",z);
	s=MRect();
	printf("\ns=%f",s);
    printf("\n");
	return 0;
}

//////////////////////////////////////////////////////////////////////

double Karlo(){
	long k,n;
	long t;
	double x,y,s;
	double a,b,c,d;
	double r=1; //radiys
    //------------------
	a=-1; b=1; c=0; d=2;
	srand(time(&t)%37);
	n=k=0;
	while (n<n_MAX){
		x=(double)rand()/RAND_MAX;
		y=(double)rand()/RAND_MAX;
		x=(b-a)*x+a;
		y=(d-c)*y+c;
		if (((x*x+pow(y-1,2)<=1) && (x>0) && (y<exp(-x))) ||
			((x*x+y*y<=1) && (x<0) && (y>exp(-x)))) k++;
		n++;
	}
	s=(double)k/n*(b-a)*(d-c);
	return s;
}
/////////////////////////////////////////////////////////////////////////
double MRect(){
	double a,a2,b,b2,x,dx,dy,s1,s2;
	int i,n;
	n=10000;
	a=-1; b=0;
	dx=(b-a)/n;
	s1=0; x=a; i=0;
	while (i<n) {
		dy=f1(x)-exp(-x);
        if (dy>0) {s1=s1+dy*x;}
		x=x+dx; i++;
	}
	a2=0; b2=1;
	dx=(b-a)/n;
	s2=0; x=a2; i=0;
	while (i<n) {
		dy=f2(x)-exp(-x);
		if (dy>0) {s2=s2+dy*x;}
		x=x+dx; i++;
	}
	return s1+s2;

}

Последний раз редактировалось sir.andrey; 10.09.2010 в 13:14.
sir.andrey вне форума Ответить с цитированием
Старый 10.09.2010, 14:50   #2
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
По умолчанию

Хотя бы напишите как действует этот метод с математической точки зрения!
sir.andrey вне форума Ответить с цитированием
Старый 10.09.2010, 16:22   #3
kogemrka
Форумчанин
 
Аватар для kogemrka
 
Регистрация: 08.01.2010
Сообщений: 165
По умолчанию

Какого "прямоугольника нет"? О чём вы?
kogemrka вне форума Ответить с цитированием
Старый 10.09.2010, 16:39   #4
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Восклицание

Цитата:
Сообщение от kogemrka Посмотреть сообщение
Какого "прямоугольника нет"? О чём вы?
Я имел в виду, что метод прямоугольника не работает!
sir.andrey вне форума Ответить с цитированием
Старый 11.09.2010, 05:37   #5
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Печаль

Помогите пожалуйста!
sir.andrey вне форума Ответить с цитированием
Старый 11.09.2010, 08:17   #6
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Восклицание

Проверьте пожалуйста метод прямоугольника.
Код:
double MRect(){
        double a,a2,b,b2,x,dx,dy,s1,s2;
        int i,n;
        n=1000000;
        a=-1; b=0;
        dx=(b-a)/n;
        s1=0; x=a; i=0;
        while (i<n) {
                dy=f1(x)-exp(-x);
        if (dy>0) {s1=s1+dy;}
                x=x+dx; i++;
        }
                s1*=dx;
        a2=0; b2=1;
        dx=(b-a)/n;
        s2=0; x=a2; i=0;
        while (i<n) {
                dy=f2(x)-exp(-x);
                if (dy>0) {s2=s2+dy;}
                x=x+dx; i++;
        }
                s2*=dx;
        return s1+s2;
 
}
sir.andrey вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц