Оптимизация программы.

TERAB1T

Новичок
Оптимизация программы.

Здравствуйте. Есть программа по вычислению кратных интегралов методом Монте-Карло. Надо ее оптимизировать, сократив в разы. Вот она http://paste.org.ru/?ztr6me Итак, что мне нужно сделать:

1.) $X1mi = -2; //нижняя граница x1
$X1ma = 2; //верхняя граница x1
$X2mi = -2; //нижняя граница x2
$X2ma = 2; //верхняя граница x2
....
Вот этого быть не должно. Программа на данный момент умеет решать только до 12тикратного интеграла. В будущем должна решать и дальше. Теперь все это должно быть записано в виде двух массивов:
array1 (...) - здесь элементы массива - верхние границы интегрирования
array2 (...) - здесь соответственно нижние

2.) Кратность интеграла у меня в программе задается, а в идеале должны высчитываться из подсчета количества элементов любого из массивов автоматически.

3.) Самое сложное. Как видите, я пошел легким путем и разбил программу на 12 подпрограмм (берется кратность и по ней выполняется соответствующая подпрограмма). Оказалось, так делать нельзя. Как видите, в каждой новой подпрограмме всего-лишь добавляется некоторое количество элементов. Так вот я думаю, что тут нужно сделать цикл, выполняющийся количество раз, соответствующее кратности интеграла, при каждом действии которого прибавлялись элементы, нужные именно для этой кратности.

Собственно всё, и теперь вопрос к вам - как бы это все реализовать?
 

mity

Новичок
И Вы ещё пишите почему это медленно работает ?
PHP:
Зачем ?
eval ("\$X1min = $X1mi;");

Так не проще?
$X1min = $X1mi;
PHP вообще не предназначен для сложных математических вычислений.

Проще будет написать внешнею программу, скажем на C++, и вызывать её через exec()

По поводу алгоритмов, попробуйте задать свой вопрос на http://forum.algolist.ru/
 

TERAB1T

Новичок
Я не спрашиваю, почему оно медленно работает =) Работает оно в пределах нормы. Мне просто надо сократить код, так как преподаватель сильно к этому придирается, и написать нужно именно на PHP
 

zerkms

TDD infected
Команда форума
PHP:
         try
       {
         eval ("\$X1min = $X1mi;");
         eval ("\$X1max = $X1ma;");
       }
       catch (Exception $e)
       {
         continue;  
       }
При каких условиях в этом коде будет выполнена ветка continue?
 

TERAB1T

Новичок
Автор оригинала: zerkms
PHP:
         try
       {
         eval ("\$X1min = $X1mi;");
         eval ("\$X1max = $X1ma;");
       }
       catch (Exception $e)
       {
         continue;  
       }
При каких условиях в этом коде будет выполнена ветка continue?
Если не будет ошибки. Странно, но без трай-кетч эвал не работал
 

dimagolov

Новичок
вообще фееричный код.

кто-то там спрашивал в соседней ветке, как готовить код так, чтобы никто не мог в нем разабраться? :)

TERAB1T, кто тебе рассказал про eval? откуда ты его взял?
 

AmdY

Пью пиво
Команда форума
респект преподу. не перевелись ещё нормальные учителя на руси.

убирай трай-кэтчи ВСЕ и евалы тоже. сунь $X{n} и т.д. в массивы и будет тебе счастье
 

fixxxer

К.О.
Партнер клуба
очень похоже, что у ТС был опыт программирования исключительно на шелл-скриптах)
 

dimagolov

Новичок
AmdY, забыл добавить, что после "сунь $X{n} и т.д. в массивы" все блоки if (... == 3) {} elseif (.. == 4) можно будет свернуть в один блок с размерностью в качестве параметра. вернее даже не так. размерность можно определять по размерности полученных массивов с исходными данными.
 

TERAB1T

Новичок
эвалы остались с тех пор, как код этот был еще в хтмл исполняемым. Там эвалы нжны были потому, что функция подынтегральная вводилась в окне браузера, а не в исходный код. Сейчас эвалы убрать не проблема, но проблема, как видно из моего первого поста, не в этом

-~{}~ 17.06.10 19:15:

Автор оригинала: zerkms
TERAB1T
try {} catch {} не ловит ошибки
хм, может не так выразился, он ловит исключения... Или я не прав?

-~{}~ 17.06.10 19:29:

Автор оригинала: dimagolov
AmdY, забыл добавить, что после "сунь $X{n} и т.д. в массивы" все блоки if (... == 3) {} elseif (.. == 4) можно будет свернуть в один блок с размерностью в качестве параметра. вернее даже не так. размерность можно определять по размерности полученных массивов с исходными данными.
Собственно это я и описал в первом посте, как задание, которое мне нужно сделать :)

-~{}~ 17.06.10 19:45:

http://paste.org.ru/?6cda3w - вот, сократил все по максимуму, оставил только обычные и двойные интегралы, убрал за ненадобностью эвалы и соответственно лишние переменные. Теперь не работает - возвращает ответ ноль. Почему? Вроде все правильно сделал
 

dimagolov

Новичок
эвалы остались с тех пор, как код этот был еще в хтмл исполняемым.
это SSI что ли? или JS? так в JS тоже есть массивы и эвалы нахрен не нужны

хм, может не так выразился, он ловит исключения... Или я не прав?
в отличии от JS, в PHP ошибки не возбуждют исключений, а твой код их тоже не возбуждает. то есть ловить нечего.

Собственно это я и описал в первом посте, как задание, которое мне нужно сделать
значит, тема исчерпана, раз тебе уже рассказали как выполнять задание. вперед и с песней, делай, что тебе было сказано, в результате будет нужный преподу код. не надеешься же ты, что кто-то сделает это за тебя?

-~{}~ 17.06.10 12:47:

http://phpfaq.ru/debug

-~{}~ 17.06.10 12:48:

ты упустил совет про массивы
 

TERAB1T

Новичок
Автор оригинала: dimagolov
это SSI что ли? или JS? так в JS тоже есть массивы и эвалы нахрен не нужны
изначально выглядело так - в браузере есть несколько полей, в которые надо ввести функции, есть кнопка, на которую нажимаешь и выводится ответ. Так вот для этих полей эвал и нужен был, чтоб введенное преобразовывалось в строку для дальнейшего исполнения. Без эвала никак.

Автор оригинала: dimagolov
в отличии от JS, в PHP ошибки не возбуждют исключений, а твой код их тоже не возбуждает. то есть ловить нечего.
Может и так, но по неведомым мне причинам без трай-кетчей код не работал.

Автор оригинала: dimagolov
значит, тема исчерпана, раз тебе уже рассказали как выполнять задание. вперед и с песней, делай, что тебе было сказано, в результате будет нужный преподу код. не надеешься же ты, что кто-то сделает это за тебя?
Препод, который мне задал это - не препод по информатике, а препод по матану. То есть мое задание было такое - сделать на пхп программу, считающую кратные интегралы. Всё. Никаких брифингов и пояснений перед началом - получил задание и делай. Сначала програму написал на пхп с хтмл, то есть запускаемая через сервер в браузере. Ему не подошло, захотел, чтоб исполнялась в коммандной строке с вводом параметров в исходный код. Переделал - принес ему, его комментарий был в виде "много букв, сложный код, упрощай". Всё. Задания описанные в первом посте поставил перед собой я сам, так как знаю, что это можно сделать, но пхп я знаю очень поверхностно, поэтому именно технически не знаю, как это реализовать. Плюс сам алгоритм не могу придумать, который убрал бы эти многочисленные ифы для каждой кратности.

Автор оригинала: dimagolov
http://phpfaq.ru/debug
ошибок никаких нет, программа выполняется и выводит ответ. Только вот ответ этот ноль.

Автор оригинала: dimagolov
ты упустил совет про массивы
массивы пока не делал, попробовал сначала просто сократить код по советам данным выше и тут сразу такой косяк
 

dimagolov

Новичок
изначально выглядело так - в браузере есть несколько полей, в которые надо ввести функции, есть кнопка, на которую нажимаешь и выводится ответ. Так вот для этих полей эвал и нужен был, чтоб введенное преобразовывалось в строку для дальнейшего исполнения. Без эвала никак.
можно и без эвала, но с ним действительно, проще.
Может и так, но по неведомым мне причинам без трай-кетчей код не работал.
шаманством занимайся в стороне от программирования, а тут занимайся отладкой.
ошибок никаких нет, программа выполняется и выводит ответ. Только вот ответ этот ноль.
отладка это не только выявление синтаксических ошибок, но и анализ переменных программы на наличие ожидаемых значений.
Плюс сам алгоритм не могу придумать, который убрал бы эти многочисленные ифы для каждой кратности.
тебе, деревянному, в надцатый раз повторяю, сделай массивы. как их сделаешь, то сразу станет понятно, как избавиться от if-ов и определять кратность по полученным массивам, которые, понятно, в циклах надо будет обрабатывать.

п.с. ты вообще что-то о мат-индукции слышал? вот тебе и нужно имея выражение для F(1), F(2) и т.д. получить выражение для F(n)
 

TERAB1T

Новичок
PHP:
 <?php
//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?
 

melo

однажды
так там выше есть ссылка, он вроде по форумам ходит, готовое решение ищет.
 

TERAB1T

Новичок
Автор оригинала: melo
так там выше есть ссылка, он вроде по форумам ходит, готовое решение ищет.
Сами новичками не были? Родились уже с заложенными знаниями по программированию? Мне нужно было в краткие сроки написать программу, как мне иначе было поступить, если в пхп я полным нулем был? Я ищу не готовое решение, а помощи в составлении программы. Или в наше время зазорно просить у других людей помощи? Мой предыдущий пост - готовая оптимизированная программа, поищи такую же в инете, найдешь?

-~{}~ 18.06.10 16:02:

Код написанный МНОЙ сейчас я прекрасно понимаю, и могу закомментировать хоть каждую строчку в программе и прекрасно знаю, что она делает. Так что может хватит стёба?
 
Сверху