Условие
Кватернионы (от лат. quaterni, по четыре) — система гиперкомплексных чисел, образующая векторное пространство размерностью четыре над полем вещественных чисел. Обычно обозначаются символом . Предложены Уильямом Гамильтоном в 1843 году.
Кватернионы удобны для описания изометрий трёх- и четырёхмерного евклидовых пространств, и поэтому получили широкое распространение в механике. Также их используют в вычислительной математике, например, при создании трёхмерной графики.
Источник: Кватернионы — Википедия.
Код на Java:
Описание класса:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
import java.util.*; import java.lang.*; import java.io.*; class Quaternion { private double a; private double b; private double c; private double d; public Quaternion() { a = 0; b = 0; c = 0; d = 0; } public Quaternion(double a) { this.a = a; b = 0; c = 0; d = 0; } public Quaternion(double a, double b, double c, double d) { this.a = a; this.b = b; this.c = c; this.d = d; } public Quaternion conjug() { return new Quaternion(a, -b, -c, -d); } public double abs() { return Math.sqrt(a * a + b * b + c * c + d * d); } public Quaternion inverse() throws ArithmeticException { return Quaternion.divide(this.conjug(), this.abs() * this.abs()); } public boolean isZero() { return (a == 0 && b == 0 && c == 0 && d == 0); } public static Quaternion sum(Quaternion a, Quaternion b) { return new Quaternion(a.a + b.a, a.b + b.b, a.c + b.c, a.d + b.d); } public static Quaternion sub(Quaternion a, Quaternion b) { return new Quaternion(a.a - b.a, a.b - b.b, a.c - b.c, a.d - b.d); } public static Quaternion mul(Quaternion a, double mult) { return new Quaternion(a.a * mult, a.b * mult, a.c * mult, a.d * mult); } public static Quaternion mul(Quaternion a, Quaternion b) { return new Quaternion(a.a * b.a - a.b * b.b - a.c * b.c - a.d * b.d, a.a * b.b + a.b * b.a + a.c * b.d - a.d * b.c, a.a * b.c - a.b * b.d + a.c * b.a + a.d * b.b, a.a * b.d + a.b * b.c - a.c * b.b + a.d * b.a); } public static Quaternion divide(Quaternion a, double divider) throws ArithmeticException { if (divider == 0) throw new ArithmeticException("Zero divider"); return new Quaternion(a.a / divider, a.b / divider, a.c / divider, a.d / divider); } public static Quaternion divide(Quaternion a, Quaternion b) throws ArithmeticException { if (b.isZero()) throw new ArithmeticException("Zero divider"); return Quaternion.mul(a, b.inverse()); } public String toString() { return new String(a + ((b < 0)? " - " : " + ") + Math.abs(b) + "*i" + ((c < 0)? " - " : " + ") + Math.abs(c) + "*j" + ((d < 0)? " - " : " + ") + Math.abs(d) + "*k\n"); } } |
Стандартное определение
Кватернионы можно определить как формальную сумму a + bi + cj + dk, где a, b, c, d — вещественные числа, а i, j, k — мнимые единицы со следующим свойством: i2 = j2 = k2 = ijk = −1.
Таким образом, таблица умножения базисных кватернионов — 1, i, j, k — выглядит так:
× | 1 | i | j | k |
1 | 1 | i | j | k |
i | i | -1 | k | -j |
j | j | -k | -1 | i |
k | k | j | -1 | -1 |
Сопряжение
Для кватерниона q сопряжённым называется:
Модуль
Так же, как и для комплексных чисел,
называется модулем q.
Обращение умножения (деление)
Кватернион, обратный по умножению к q, вычисляется так:
.
Основная программа:
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
class Main { public static void main (String[] args) { Quaternion qt1 = new Quaternion(); Quaternion qt2 = new Quaternion(5); Quaternion qt3 = new Quaternion(1, 2, 3, 4); Quaternion qt4 = new Quaternion(0.1, 1.4, -2.5, -1.7); if (!qt1.isZero()) { System.out.print(Quaternion.sum(qt3, qt4)); } else { System.out.print(Quaternion.mul(qt3, qt4)); } do { qt2 = Quaternion.sub(qt2, qt3); System.out.print(qt2); System.out.print(qt2.conjug()); System.out.print(qt2.inverse()); } while (qt2.isZero()); try { System.out.print(Quaternion.divide(qt3, qt4)); } catch (ArithmeticException e) { System.out.print(e.getMessage()); } System.out.print(Quaternion.mul(qt3, 17.2)); } } |
Ход выполнения
При выполнении происходит проверка функций класса: логических, арифметических, построения объектов, производных от исходного (таких, как сопряженное и обратное значение), функции строкового отображения объекта.
Вывод программы:
1 2 3 4 5 6 |
11.600000000000001 + 6.5*i + 6.8*j - 10.499999999999998*k 4.0 - 2.0*i - 3.0*j - 4.0*k 4.0 + 2.0*i + 3.0*j + 4.0*k 0.08888888888888888 + 0.04444444444444444*i + 0.06666666666666665*j + 0.08888888888888888*k -1.026102610261026 - 0.5490549054905489*i - 0.5580558055805579*j + 1.017101710171017*k 17.2 + 34.4*i + 51.599999999999994*j + 68.8*k |
Ссылки:
Рабочий код для тестирования на Ideone.com: Ideone.com