Пример #1
0
    public function solve()
    {
        if (!Matrix_Helper::is_symmetric_matrix($this->matrix_a))
            throw new MathException('Матрица не симметическая. Использовать метод квадратного корня нецелесообразно');

        if ($this->matrix_a->get_rows_count() != $this->vector_b->get_size())
            throw new MathException('Размеры матрицы и ветора должны быть одинаковыми');

        $n = $this->matrix_a->get_rows_count();
        
        
        // Находим D, S
        $matrix_d = new Matrix($n, $n);
        $matrix_s = new Matrix($n, $n);
        
        for ($i = 0; $i < $n; $i++)
        {
            $sum = new Scalar(Scalar::ZERO);
            
            for ($p = 0; $p <= $i-1; $p++)
                $sum = Scalar_Helper::sum(
                    $sum,
                    Scalar_Helper::multiply(
                        Scalar_Helper::sqr(
                            $matrix_s->get_item($p, $i)
                        ),
                        $matrix_d->get_item($p, $p)
                    )
                );
            
            // d[i, i]
            $matrix_d->set_item($i, $i,
                Scalar_Helper::sign(
                    Scalar_Helper::sub(
                        $this->matrix_a->get_item($i, $i),
                        $sum
                    )
                )
            );
            
            // s[i, i]
            $matrix_s->set_item($i, $i,
                Scalar_Helper::sqrt(
                    Scalar_Helper::abs(
                        Scalar_Helper::sub(
                            $this->matrix_a->get_item($i, $i),
                            $sum
                        )
                    )
                )
            );
            
            // s[i, j]
            for ($j = $i+1; $j < $n; $j++)
            {
                $sum = new Scalar(Scalar::ZERO);
                
                for ($p = 0; $p <= $i-1; $p++)
                    $sum = Scalar_Helper::sum(
                        $sum,
                        Scalar_Helper::multiply(
                            Scalar_Helper::multiply(
                                $matrix_s->get_item($p, $i),
                                $matrix_d->get_item($p, $p)
                            ),
                            $matrix_s->get_item($p, $j)
                        )
                    );
                
                // s[i, j]
                $matrix_s->set_item($i, $j,
                    Scalar_Helper::division(
                        Scalar_Helper::sub(
                            $this->matrix_a->get_item($i, $j),
                            $sum
                        ),
                        Scalar_Helper::multiply(
                            $matrix_d->get_item($i, $i),
                            $matrix_s->get_item($i, $i)
                        )
                    )
                );
            }
        }
        
        $matrix_b = Matrix_Helper::multiply(
            Matrix_Helper::transpose($matrix_s),
            $matrix_d
        );
        
        $vector_y = new Vector($n);
        
        for ($k = 0; $k < $n; $k++)
        {
            $sum = new Scalar(Scalar::ZERO);
            
            for ($s = 0; $s <= $k-1; $s++)
                $sum = Scalar_Helper::sum(
                    $sum,
                    Scalar_Helper::multiply(
                        $matrix_b->get_item($k, $s),
                        $vector_y->get_item($s)
                    )
                );
                
            $vector_y->set_item($k, Scalar_Helper::division(
                Scalar_Helper::sub(
                    $this->vector_b->get_item($k),
                    $sum
                ),
                $matrix_b->get_item($k, $k)
            ));
        }
        
        $this->vector_x = new Vector($n);
        for ($k = $n-1; $k >= 0; $k--)
        {
            $sum = new Scalar(Scalar::ZERO);
            
            for ($p = $k+1; $p < $n; $p++)
                $sum = Scalar_Helper::sum(
                    $sum,
                    Scalar_Helper::multiply(
                        $matrix_s->get_item($k, $p),
                        $this->vector_x->get_item($p)
                    )
                );
                
            $this->vector_x->set_item($k, Scalar_Helper::division(
                Scalar_Helper::sub(
                    $vector_y->get_item($k),
                    $sum
                ),
                $matrix_s->get_item($k, $k)
            ));
        }
    }
Пример #2
0
                'D' => $default_d_data,
                'C' => $default_c_data,
                'k' => $default_k,
                'B' => $default_b_data
            );
            break;
            
        case 'solve':
            try
            {
                $_GET['n'] = (int)$_GET['n'];
                $d = new Matrix($_GET['n'], $_GET['n'], $_GET['D']);
                $c = new Matrix($_GET['n'], $_GET['n'], $_GET['C']);
                $k = new Scalar($_GET['k']);

                $a = Matrix_Helper::sum($d, Matrix_Helper::multiply_on_scalar($c, $k));

                $b = new Vector($_GET['n'], $_GET['B']);

                $sms = new SquareMethod_Solver($a, $b);
                $sms->solve();
                $x = $sms->get_vector_x();

                $responce = array(
                    'A' => $a->to_array(),
                    'X' => $x->to_array()
                );
            }
            catch (Exception $e)
            {
                $responce = array(
Пример #3
0
    /**
     * Проверка матрицы на симметричность
     *
     * @param Matrix $matrix_a Матрица
     *
     * @return bool
     */
    public static function is_symmetric_matrix(Matrix $matrix_a)
    {
        if (!Matrix_Helper::is_square_matrix($matrix_a))
            throw new MathException('Матрица должна быть квадратной');

        $is_symmetric_matrix = true;

        for ($i = 0; $i < $matrix_a->get_rows_count(); $i++)
            for ($j = $i + 1; $j < $matrix_a->get_cols_count(); $j++)
                $is_symmetric_matrix = $is_symmetric_matrix && (Scalar_Helper::is_equal($matrix_a->get_item($i, $j), $matrix_a->get_item($j, $i)));

        return $is_symmetric_matrix;
    }