Я пытаюсь написать программу, которая использует уравнения умножает 2 кватерниона. Вот мои 2 начальных кватерниона:
q1 = 2 − i + j + 3k, и
q2 = −1 + i + 4j − 2k
Я разрешаю пользователю вводить свои собственные числа, представляющие каждый верхний компонент от a1 до a4 и нижние компоненты от b1 до b4, например:
cout << "Enter the [A1] value: ";
cin >> a1;
cout << "Enter the [A2] value: ";
cin >> a2;
cout << "Enter the [A3] value: ";
cin >> a3;
cout << "Enter the [A4] value: ";
cin >> a4;
cout << "Enter the [B1] value: ";
cin >> b1;
cout << "Enter the [B2] value: ";
cin >> b2;
cout << "Enter the [B3] value: ";
cin >> b3;
cout << "Enter the [B4] value: ";
cin >> b4;
Затем я умножаю a1 на каждый элемент "b", a2 на каждый элемент "b" и так далее, затем я сохраняю эти новые значения в переменных, я следил за таблицей и помеял каждую новую переменную, чтобы я знал, представляет ли она либо ij или k:
multiplec1 = b1 * a1; // num
multiplec2 = b2 * a1; // i
multiplec3 = b3 * a1; // j
multiplec4 = b4 * a1; // k
multiplec5 = b1 * a2; // -i
multiplec5 = -multiplec5;
multiplec6 = b2 * a2; // num
multiplec7 = b3 * a2; // k
multiplec8 = b4 * a2; // -j
multiplec6 = -multiplec6;
multiplec9 = b1 * a3; // j
multiplec10 = b2 * a3; // -k
multiplec10 = -multiplec10;
multiplec11 = b3 * a3; // num
multiplec12 = b4 * a3; // i
multiplec13 = b1 * a4; // num
multiplec14 = b2 * a4; // i
multiplec15 = b3 * a4; // j
multiplec16 = b4 * a4; // k
Наконец, я складываю все подходящие значения ijk:
finalint = multiplec1 + multiplec6 + multiplec11 + multiplec15;
finalI = multiplec2 + multiplec5 + multiplec12 + multiplec14;
finalJ = multiplec3 + multiplec8 + multiplec9 + multiplec15;
finalK = multiplec4 + multiplec7 + multiplec10 + multiplec16;
по какой-то причине, когда я показываю свои переменные "final", числа кажутся совершенно другими, чем те, которые я сделал на бумаге, поэтому я уверен, что делаю здесь что-то не так, но я не уверен, что именно.
Может ли кто-нибудь помочь мне выяснить, где в моих расчетах я ошибся и почему получаю неправильные значения?
[РЕДАКТИРОВАТЬ]
Вот значения, которые я должен получить:
9 -11i - 7j - 12k
Но почему-то вместо этого получаю:
15 2i 21j -15к
Пожалуйста, опубликуйте ожидаемые числа и полученные числа.
@StephenNewell Да, у меня есть, и значения умножения кажутся хорошими до и после, похоже, когда я обновляю "конечные" переменные, я считаю
Я только что обновил свой вопрос, показывая вам @MaxVollmer
Поскольку вы знаете, как использовать отладчик, это должно быть легко. Добавьте несколько временных переменных для каждого этапа окончательных вычислений, затем пройдите через отладчик, чтобы проверить их. Сравните эти результаты с тем, что вы рассчитали вручную, и вы сможете точно определить, в чем именно вы и программа отличаетесь.





Я думаю, что самым удивительным здесь является то, что и ваши бумажные вычисления, и ваша программа ошибочны одновременно, но по-разному. Фактически
2−i+j+3k, умноженный на −1+i+4j−2k, получается 1 - 11 i + 8 j - 12 k и логика
1 = -2 +1 -4 +6 = 2*(-1) + (-i)*i + j*4j + 3k*(-2k)
-11*i = (+2 +1 -2 -12)*i = 2*i + (-i)*(-1) + j*(-2k) + 3k*4j
8*j = (+8 -1 -2 +3)*j = 2*4j +j*(-1) + (-i)*(-2k) + 3k*i
-12*k = (-4 -3 -4 -1)*k = 2*(-2k) + (3k)*(-1) + (-i)*4j + j*i
Обратите внимание, что для кватернионов умножение некоммутативно. Например, i*j = k, а j*i = -k. Вы можете найти полный таблица умножения в вики). Поэтому сравните свой код с этой таблицей, потому что там довольно много ошибок.
Вы использовали отладчик для проверки своей работы на ходу?