понедельник, 21 июня 2010
UPD - функция вместо переменной. Здравствуйте. Есть программа по вычислению кратных интегралов методом Монте-Карло. Надо ее оптимизировать, сократив в разы.
читать дальше Вот самая последняя версия:
<?php
{
$iter = 10000; //количество итераций
$Xmax = array(1,1); //верхние границы
$Xmin = array(-1,-1); //нижние границы
$F = 'cos($x[0])*cos($x[1])'; //подынтегральное выражение
$F2 = '$x[0]+5-sin($x[1])>=2'; //выражение, определяющее границы функции (если такового нет, впишите 0)
}
$U = count($Xmin); //кратность интеграла
$Xint = array();
$x = array();
$SumH = 0;
for ($i = 0; $i <= $U; $i++)
{
$Xint[$i] = $Xmax[$i] - $Xmin[$i];
}
for ($j = 1; $j <= $iter; $j++)
{
for ($i = 0; $i <= $U; $i++)
{
$x[$i] = $Xmin[$i] + lcg_value() * $Xint[$i];
}
eval ("\$F1 = $F2;"); //левая часть выражения, определяющего границы функции
if ($F1 !== 0)
{
$InInt = false;
if ($F1) $InInt = true;
if (!$InInt) continue;
}
eval ("\$F3 = $F;");
$SumH += abs($F3);
}
$rez = 1;
for ($i = 0; $i <= $U-1; $i++)
{
$rez = $rez*$Xint[$i];
}
$rez = ($SumH*$rez)/ $iter;
echo ("Answer: $rez");
?>
UPD. Хочется избавится от эвала. Посоветовали вместо переменных $F и $F2 сделать функции. Кто знает, как это реализовать? Пробовал сделать функции сам, но все равно без эвала ничего не получилось
@темы:
Вопрос,
Алгоритм,
PHP
-
-
17.06.2010 в 17:06-
-
17.06.2010 в 17:14eval ("\$X1max = $X1ma;");
eval ("\$X2min = $X2mi;");
eval ("\$X2max = $X2ma;");
eval ("\$X3min = $X3mi;");
eval ("\$X3max = $X3ma;"); - а на кой тут eval? $X2max = $x2ma
А в целом: действительно переменные держать в массивах и записывать цикликом.
for($j = 1; $j < $U; $j++) { дальше все XNma записываются как Xmin[$j], Xmax[$j], Xma[$j] и т.п. }
-
-
18.06.2010 в 02:00//ini_set('display_errors',1);
//error_reporting(E_ALL);
$iter = 10000; //количество итераций
$Xmax = array(3,3,2); //верхние границы
$Xmin = array(1,1,1); //нижние границы
$U = count($Xmin); //кратность интеграла
$Xint = array();
$x = array();
$SumH = 0;
for ($i = 0; $i <= $U; $i++)
{
$Xint[$i] = $Xmax[$i] - $Xmin[$i];
}
for ($j = 1; $j <= $iter; $j++)
{
for ($i = 0; $i <= $U; $i++)
{
$x[$i] = $Xmin[$i] + lcg_value() * $Xint[$i];
}
$F = $x[0]+$x[1]+$x[2]; //подынтегральное выражение
$SumH += abs($F);
}
$rez = 1;
for ($i = 0; $i <= $U-1; $i++)
{
$rez = $rez*$Xint[$i];
}
$rez = ($SumH*$rez)/ $iter;
echo ("Answer: $rez");
?>
Собственно вот. Все работает, все отлично. Теперь осталось решить пару проблем - во-первых если в границах интегрирования находится х, то логично, что ответ выдает ноль. Как обойти? Далее - интересует вопрос ввода - можно ли как-то сделать, чтоб не вводить при каждой переменной $x[0]? а вводить как-то проще, например, х1 или хотя бы $x1?