преобразование с ++ в php - PullRequest
0 голосов
/ 17 июня 2009

Я написал LU, написанный на c ++, и мне нужно добавить тот же код в php, я сделал это, но он работает, но в php у меня разные результаты. Основные расчеты в C ++:

 for (int i=0;i<m;i++)
    {
         for (int j=0;j<m;j++)
         {
             cout << tab1[i][j]<<"\t";    
         }   
         cout <<endl;
    }

      for (int i=0;i<m;i++)
    {
         for (int j=0;j<m;j++)
         {

             if (i==j) 
              {
                       tab2[i][j]=1;
                       tab3[i][j]=0;
                       }
              else
              {
                       tab3[i][j]=0;
                       tab2[i][j]=0;
                       }

         }   
    }
       //glowne dzielenie tego co mamy do rozlozenia
    for (int i=0;i<m;i++)
    {   

        for (int j=0;j<m;j++)
        {
            for (int k=0;k<m;k++)
            {
                pom+=tab2[i][k]*tab3[k][j];   
                pomoc+=tab2[j][k]*tab3[k][i];    
            }    
           if (i<=j)
            tab3[i][j]=tab1[i][j]-pom;

           if (j>=i)
            tab2[j][i]=(tab1[j][i]-pomoc)/tab3[i][i];

            pom=0;
            pomoc=0;
        }    
    }

и в php это выглядит так:

 $w= sizeof($this->input['macierz_1']);
        $pom=0;         $pomoc=0;

                            for ($i=1;$i<=$w;$i++)
                {
                for ($j=1;$j<=$w;$j++)
                    {

                        if ($i==$j) 
                        {
                                $tab2[$i][$j]=1;
                                $tab3[$i][$j]=0;
                                }
                    else
                        {
                                $tab3[$i][$j]=0;
                                $tab2[$i][$j]=0;
                                }

                    }   
                }

        //glowne dzielenie tego co mamy do rozlozenia
        for ($i=1;$i<=$w;$i++)
            {   
            for ($j=1;$j<=$w;$j++)
                {
                    for ($k=1;$k<=$w;$k++)
                        {
                        $pom+=$tab2[$i][$k]*$tab3[$k][$j];  
                        $pomoc+=$tab2[$j][$k]*$tab3[$k][$i];


                        }    
                    if ($i<=$j)
                        $tab3[$i][$j]=($this->input['macierz_1'][$i][$j])-$pom;


                    if ($j>=$i)

                    $tab2[$j][$i]=(($this->input['macierz_1'][$i][$j])-$pomoc)/$tab3[$i][$i];


                    $pom=0;
                    $pomoc=0;

                }    
            }
            echo '<b>Macierz wynikowa L:<br> </b>';
        $this->formularz($w,$w,'macierz_L',$tab2);
                echo '<b>Macierz wynikowa U: <br> </b>';
        $this->formularz($w,$w,'macierz_U',$tab3);
                }

Я знаю, что я начал arry в php form 1, а не 0, и в целом все в порядке. Может кто-нибудь сказать мне, где я сделал mastake или дать algorytm LU в php, что он работает?

Ответы [ 3 ]

1 голос
/ 17 июня 2009
  1. Что такое LU?
  2. Что именно вы имеете в виду под ошибкой. Ошибка времени выполнения, неожиданный вывод, программа не завершает работу?

На первый взгляд, ваш PHP-код выглядит правильно для меня.

Вы должны быть немного яснее, иначе людям будет трудно помочь вам.

0 голосов
/ 17 июня 2009

Этот пример помогает? http://au.php.net/manual/en/function.array.php#49054

Майкл Дот Боммарито в Gmail Dot Com

15 января 2005 г. 03:14

На тот случай, если кто-нибудь еще попросит помощи в написании функции разложения LU, вот простой пример.

N.B. Предполагается, что все массивы начинаются с индекса 1, а не с 0. Это не сложно изменить, но убедитесь, что вы указали массив (1 => ...), а не только массив (...).

Кроме того, эта функция оптимизирована для учета только переменных элементов матриц. Поскольку $ L будет нижней треугольной матрицей, нет необходимости вычислять элементы диагонали или верхнего треугольника; аналогично с $ U.

Эта функция также не проверяет, является ли входная матрица неособой.

/*
 * LU Decomposition
 * @param $A initial matrix (1...m x 1...n)
 * @param $L lower triangular matrix, passed by reference
 * @param $U upper triangular matrix, passed by reference
*/
function LUDecompose($A, &$L, &$U) 
{
    $m = sizeof($A);
    $n = sizeof($A[1]);

    for ( $i = 1; $i <= $m; $i++ ) {
        $U[$i][$i] = $A[$i][$i];

        for ( $j = $i + 1; $j <= $m; $j++ ) {
            $L[$j][$i] = $A[$j][$i] / $U[$i][$i];
            $U[$i][$j] = $A[$i][$j];
        }
        for ( $j = $i + 1; $j <= $m; $j++ ) {
            for ( $k = $i + 1; $k <= $m; $k++ ) {
              $A[$j][$k] = $A[$j][$k] - ($L[$j][$i] * $U[$i][$k]);
            }
        }
    }

    return;
}
0 голосов
/ 17 июня 2009
  1. LU это числовой метод с Lover и Upper decay. Он знаком с исключением Гауса для массива.
  2. Я не запускаю прогу eny errorrs, но результат не тот, который должен быть. Они разные
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...