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) )); } }
'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(
/** * Проверка матрицы на симметричность * * @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; }