Есть программа по вычислению двойных интегралов (за что огромное спасибо mr Gray) на PHP. Надо ее преобразовать в PHP без хтмл, то есть с запуском из командной строки. читать дальше

@темы: интеграл, Вопрос, PHP

Комментарии
01.06.2010 в 13:14

Немного исправил код, теперь он выглядит так:

 <?php
     $F 
= ($x*$y); //подынтегральное выражение
     
$F1 = (pow($x2)+4*pow($y2)); //левая часть выражения, определяющего границы функции
     
$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");   
 
?>


Уже запускается и выдает ответ, но ответ неправильный, всегда выводит ноль. Как исправить?
01.06.2010 в 14:37

Параметр "F" - это строка, и он имеет вид: '$x*$y' (строку заключаем в кавычки). А вы пишете: $F = ($x*$y); - это уже не строка, а число 0*0 = 0. C F1 и F2 то же самое.
01.06.2010 в 15:26

Спасибо :)
01.06.2010 в 16:21

Не получается. Вот обновил код:

 <?php
     $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 ((
$F10) && ($F20))   
{
       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 тоже заключал - не получается
01.06.2010 в 17:50

if (($F1= 0) && ($F2= 0))
Нужно писать:
if (($F1==0) && ($F2==0))
Иначе обе переменные просто обнулятся.
01.06.2010 в 17:55

сделал - ответ все-равно ноль
01.06.2010 в 18:16

Только что заметил, что из программы пропал eval :)
Задание параметров в программе реализовано через eval, теперь в этом не нуждаюсь
Почему не нуждаетесь? $F1, $F2, $F нужно считать на каждом шаге с помощью eval. И работать уже с результатами: $F1xy, $F2xy, $Fxy
Если функции F1, F2 и F заданы жестко, напишите три PHP-функции, которые принимают на вход x и y, а возвращают значение функции. О том, как оформить эти функции, написамо в любом самоучителе по PHP.
01.06.2010 в 19:16

Не знаю почему, но на eval преподователь смотрит очень косо:vv:
01.06.2010 в 19:22

В общем вернул эвал - все заработало, спасибо еще раз))
01.06.2010 в 20:43

новая проблема :) В цикле, как я понял, вот этот кусок кода

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 введя нули. На деле же почему-то если я ввожу туда нули, то ответ в любом случае получается ноль. В чем тут может быть ошибка?
01.06.2010 в 21:07

if (($F1xy==0) && ($F2xy==0))
{
continue;
}

Поставьте вместо continue оператор: $InInt = true;
01.06.2010 в 21:19

Всё работает, спасибо =) А почему до этого не работало? Ведь переменная InInt вообще определялась в else, то есть если бы else не сработал, то ее попросту не могло быть и программа бы работала?
01.06.2010 в 22:05

Я спутался... нужно было просто убрать continue (чтобы не перескакивать на следующую итерацию). Переменную InInt тут действительно менять не нужно.