Есть программа по вычислению двойных интегралов (за что огромное спасибо
mr Gray) на PHP. Надо ее преобразовать в PHP без хтмл, то есть с запуском из командной строки.
читать дальшеСобственно вот сама программа paste.org.ru/?vga6h3 . Задание параметров в программе реализовано через eval, теперь в этом не нуждаюсь, все параметры вводятся в исходный код напрямую. При запуске программы из коммандной строки надо, чтоб сразу выводился только ответ по параметрам, введенным в код. Вот мои жалкие попытки самому преобразовать, но ничего не выходит paste.org.ru/?r61d8p
@темы:
интеграл,
Вопрос,
PHP
$F = ($x*$y); //подынтегральное выражение
$F1 = (pow($x, 2)+4*pow($y, 2)); //левая часть выражения, определяющего границы функции
$znak = 3; //знак между правой и левой частями выражения, определяющего границы функции
$F2 = 1; //правая часть выражения, определяющего границы функции
$iter = 100000; //количество итераций
$Xmin = -5;
$Xmax = 5;
$Ymin = -5;
$Ymax = 5;
$Xint = $Xmax - $Xmin;
$Yint = $Ymax - $Ymin;
$SumH = 0;
for ($i = 1; $i <= $iter; $i++)
{
$x = $Xmin + lcg_value() * $Xint;
$y = $Ymin + lcg_value() * $Yint;
if (($F1= '0') && ($F2= '0'))
{
continue;
}
else
{
$InInt = false;
switch ($znak)
{
case 0: if ($F1 == $F2) $InInt = true; break;
case 1: if ($F1 < $F2) $InInt = true; break;
case 2: if ($F1 > $F2) $InInt = true; break;
case 3: if ($F1 <= $F2) $InInt = true; break;
case 4: if ($F1 >= $F2) $InInt = true; break;
}
if (!$InInt) continue;
}
$SumH += abs($F);
}
$rez = (($SumH * $Xint </
span>* $Yint) / $iter);
echo ("Answer: $rez");
?>
Уже запускается и выдает ответ, но ответ неправильный, всегда выводит ноль. Как исправить?
$F = '$x*$y'; //подынтегральное выражение
$F1 = 'pow($x, 2)+4*pow($y, 2)'; //левая часть выражения, определяющего границы функции
$znak = 3; //знак между правой и левой частями выражения, определяющего границы функции
$F2 = 1; //правая часть выражения, определяющего границы функции
$iter = 10000; //количество итераций
$Xmin = -5;
$Xmax = 5;
$Ymin = -5;
$Ymax = 5;
$Xint = $Xmax - $Xmin;
$Yint = $Ymax - $Ymin;
$SumH = 0;
for ($i = 1; $i <= $iter; $i++)
{
$x = $Xmin + lcg_value() * $Xint;
$y = $Ymin + lcg_value() * $Yint;
if (($F1= 0) && ($F2= 0))
{
continue;
}
else
{
$InInt = false;
switch ($znak)
{
case 0: if ($F1 == $F2) $InInt = true; break;
case 1: if ($F1 < $F2) $InInt = true; break;
case 2: if ($F1 > $F2) $InInt = true; break;
case 3: if ($F1 <= $F2) $InInt = true; break;
case 4: if ($F1 >= $F2) $InInt = true; break;
}
if (!$InInt) continue;
}
$SumH += abs($F);
}
$rez = ($SumH*$Xint*$Yint) / $iter;
echo ("Answer: $rez");
?>
Но все-равно выводит ноль. F2 тоже заключал - не получается
Нужно писать:
if (($F1==0) && ($F2==0))
Иначе обе переменные просто обнулятся.
Задание параметров в программе реализовано через eval, теперь в этом не нуждаюсь
Почему не нуждаетесь? $F1, $F2, $F нужно считать на каждом шаге с помощью eval. И работать уже с результатами: $F1xy, $F2xy, $Fxy
Если функции F1, F2 и F заданы жестко, напишите три PHP-функции, которые принимают на вход x и y, а возвращают значение функции. О том, как оформить эти функции, написамо в любом самоучителе по PHP.
if (($F1xy==0) && ($F2xy==0))
{
continue;
}
отвечает за то, чтоб если F1 и F2 равны нулю (то есть границы определяются не выражением, а самими границами), то чтоб этот кусок
else
{
$InInt = false;
switch ($znak)
{
case 0: if ($F1xy == $F2xy) $InInt = true; break;
case 1: if ($F1xy < $F2xy) $InInt = true; break;
case 2: if ($F1xy > $F2xy) $InInt = true; break;
case 3: if ($F1xy <= $F2xy) $InInt = true; break;
case 4: if ($F1xy >= $F2xy) $InInt = true; break;
}
if (!$InInt) continue;
не выполнялся. То есть я смог бы посчитать интеграл и обычный, просто в f1 и в f2 введя нули. На деле же почему-то если я ввожу туда нули, то ответ в любом случае получается ноль. В чем тут может быть ошибка?
{
continue;
}
Поставьте вместо continue оператор: $InInt = true;