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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2012, 02:14   #1
Astaroth~
Новичок
Джуниор
 
Регистрация: 10.09.2010
Сообщений: 1
По умолчанию Двойной интеграл. Монте-Карло

Дан кратный интеграл, см вложения.


Интеграл беру не до бесконечности, а ограничиваю XENDVALUE, YENDVALUE

q0,z0, L, r - константы

Нужна помощь, пожалуйста проверьте мою версию реализации, дайте советы.
Заранее спасибо.

Код:
public static double f2(double u, double z, double r, double z0)
{ //f2(du, dz, r, z0)
     double p, x;
      double sechsqr, zz0;
      x = (r * r + u * u + z * z) / (2.0 * r * u);
      p = x - Math.Sqrt(x * x - 1.0);
 
   
       return u * (-(q0* Math.Exp(-u / L) * Math.Pow(Math.Cosh(z / z0), -2.0)) / L) *
             2.0 * (alglib.ellipticintegralk(p) - alglib.ellipticintegrale(p)) / (Math.PI * Math.Sqrt(r * u * p));
 
 }
 
 // x = du, y = dz, z = f
public static double MMC2D(double N, double r, double z0, double XBEGINVALUE, double
   YBEGINVALUE, double ZBEGINVALUE, double XENDVALUE, double YENDVALUE, double ZENDVALUE)
{
        double du, dz, f;
        double result;
 
        double ratio = 0.0;
        Random rndt = new Random(1243);
        Random rnd = new Random(rndt.Next());
 
        for (double i = 0; i < N; i++)
        {
             rnd.NextDouble();
 
             du = XBEGINVALUE + XENDVALUE * rnd.NextDouble();
             dz = YBEGINVALUE + YENDVALUE * rnd.NextDouble();
             f = ZBEGINVALUE + ZENDVALUE * rnd.NextDouble();
 
             r += (f <= f2(du, dz, r, z0)) ? 1.0 : 0.0;
          }
                      
          ratio = r / N;
          result = ratio * (XENDVALUE - XBEGINVALUE) * (YENDVALUE - YBEGINVALUE) *(ZENDVALUE - ZBEGINVALUE);
          return result;
}
Вызов

Код:
double result= MMC2D(100000.0, R , h, 0.0, 0.0, 0.0, A, B, C);
 
double result2 = 4.0 * Math.PI * result;
Изображения
Тип файла: jpg 2012-05-23_004609.jpg (15.1 Кб, 158 просмотров)
Тип файла: jpg 2012-05-23_004621.jpg (3.4 Кб, 96 просмотров)
Тип файла: jpg 2012-05-23_004827.jpg (6.4 Кб, 96 просмотров)
Astaroth~ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод Монте-Карло Sasha124 Помощь студентам 6 11.01.2011 05:45
Монте карло KJIOyH Помощь студентам 21 07.09.2010 13:20
Метод Монте-Карло LiptonICE Помощь студентам 6 07.05.2010 20:37
методом монте-карло Uskoff Microsoft Office Excel 1 15.01.2010 14:27
Найти интеграл методом Монте-карло ___LORD___ Общие вопросы C/C++ 2 13.05.2009 21:24