/** * Умножение вектора на скаляр * * @param Vector $vector_a Вектор * @param Scalar $scalar_a Скаляр * * @return Vector */ public static function multiply_on_scalar(Vector $vector_a, Scalar $scalar_b) { // Создаем итоговый вектор $vector_res = new Vector($vector_a->get_size()); // Производим умножение вектора на скаляр for ($i = 0; $i < $vector_a->get_size(); $i++) $vector_res->set_item($i, Scalar_Helper::multiply($vector_a->get_item($i), $scalar_b)); // Возвращаем результат return $vector_res; }
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) )); } }
/** * Вычисление корня от скаляра * * @param Scalar $scalar_a Скаляр * * @return Scalar */ public static function sqrt(Scalar $scalar_a) { if (!Scalar_Helper::is_positive($scalar_a)) throw new MathException('Не могу вычислить скаляр из отрицательного числа: ' . $scalar_a); return new Scalar(sqrt($scalar_a->get_value())); }
/** * * @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; }