Написать библиотеку для работы с линейной алгеброй. Результат следует
оформить в виде отдельного модуля (пакета). Назвать можно, например, Math.
Реализовать несколько классов для работы:
• Вектора размерности 2, 3, 4 (это отдельные классы). Для них должны
быть:
– Операции сложения и вычитания
– Умножения и деления на скаляр
57
– Вычисления длины
– Нормализации
– Скалярного произведения
– Векторного произведения (Для вектора размерности 3)
• Матрицы размерности 3х3, 4х4 (это отдельные классы). Для них должны
быть:
– Операции сложения и вычитания
– Умножения на соответствующий вектор 3 или 4. Здесь и дальше по
курсу работаем с векторами-столбцами
– Перемножения матриц
– Транспонирования
– Быстрого задания единичной и нулевой матрицы (через конструктор
или метод)
Особенно важно покрыть весь код тестами, чтобы нажатием пары кнопок
можно было доказать, что он рабочий. Стоит также добавить обработку ошибок (например, деление на ноль).
Желающие могут добавить (возможно, частично) для существующих классов
пункты из следующего списка - поощрается дополнительными баллами:
• Вычисление определителя матриц
• Вычисление обратной матрицы
• Решение систем методом Гаусса
используя принципы ооп. код пиши на java. вот мои классы: package org.example.Math; вот мои классы: package org.example.Math;

public abstract class Vector {
    protected double[] A;

    public Vector(double[] a) {
        this.A = a;
    }

    public abstract double length();

    public abstract Vector normalize();


}
package org.example.Math;

import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;

public class Vector2D extends Vector {

    public Vector2D(double x, double y) {
        super( new double[]{x, y});
    }

    @Override
    public double length() {
        return Math.sqrt(A[0] * A[0] + A[1] * A[1]);
    }

    @Override
    public Vector normalize() {
        double len = length();
        return new Vector2D(A[0] / len, A[1] / len);
    }

    public static Vector2D add(Vector v1, Vector v2) {
        return new Vector2D(v1.A[0] + v2.A[0], v1.A[1] + v2.A[1]);
    }

    public static Vector2D subtract(Vector v1, Vector v2) {
        return new Vector2D(v1.A[0] - v2.A[0], v1.A[1] - v2.A[1]);
    }

    public static Vector2D multiply(Vector first, double scalar) {
        if (!(first instanceof Vector2D)) throw new IllegalArgumentException("Vectors must be of the same type");
        Vector2D v = (Vector2D) first;
        return new Vector2D(v.A[0] * scalar, v.A[1] * scalar);
    }

    
    public static Vector2D divide(Vector v, double scalar) {
        if (!(v instanceof Vector2D)) throw new IllegalArgumentException("Vectors must be of the same type");
        Vector2D other = (Vector2D) v;
        if (scalar == 0) throw new ArithmeticException("Division by zero");
        return new Vector2D(other.A[0] / scalar, other.A[1] / scalar);
    }

    public static double dotProduct(Vector v1, Vector v2) {
        if (!(v1 instanceof Vector2D) || !(v2 instanceof Vector2D)) throw new IllegalArgumentException("Vectors must be of the same type");
        v1 = (Vector2D) v1;
        v2 = (Vector2D) v2;
        return v2.A[0] * v1.A[0] + v2.A[1] * v1.A[1];
    }
}