Example #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)
            ));
        }
    }
Example #2
0
    /**
     *
     * @param Matrix $matrix_a
     *
     * @return bool
     */
    public static function is_positive_matrix(Matrix $matrix_a)
    {
        $is_positive_matrix = true;

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

        return $is_positive_matrix;
    }