/** * Сумма векторов * * @param Vector $vector_a Первый вектор * @param Vector $vector_b Второй вектор * * @return Vector */ public static function sum(Vector $vector_a, Vector $vector_b) { // Проверяем совпадение размеров if ($vector_a->get_size() != $vector_b->get_size()) throw new MathException('Векторы должны быть одного размера'); // Создаем итоговый вектор $res_vector = new Vector($vector_a->get_size()); // Производим суммирование векторов for ($i = 0; $i < $vector_a->get_size(); $i++) $res_vector->set_item($i, Scalar_Helper::sum($vector_a->get_item($i), $vector_b->get_item($i))); // Возвращаем результат return $res_vector; }
public static function multiply(Matrix $matrix_a, Matrix $matrix_b) { $n = $matrix_a->get_rows_count(); $c = new Matrix($n, $n); for ($i = 0; $i < $n; $i++) for ($j = 0; $j < $n; $j++) { $sum = new Scalar(Scalar::ZERO); for ($r = 0; $r < $n; $r++) $sum = Scalar_Helper::sum( $sum, Scalar_Helper::multiply( $matrix_a->get_item($i, $r), $matrix_b->get_item($r, $j) ) ); $c->set_item($i, $j, $sum); } return $c; }
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) )); } }