Cho hai vectơ A và B chứa thành phần x, y, z, nhiệm vụ là tìm tích vô hướng (dot product) và tích có hướng (cross product) của hai vectơ cho trước.
Vectơ là gì?
Trong toán học, lượng có độ lớn và hướng gọi là vectơ, ngược lại lượng chỉ có độ lớn gọi là scaler. Điểm bắt đầu của vectơ gọi là điểm đầu, điểm kết thúc gọi là điểm cuối. Khoảng cách giữa điểm đầu và điểm cuối là độ lớn của vectơ.
Các loại vectơ –
- Vectơ đơn vị – Vectơ có độ lớn bằng 1.
- Vectơ không – Còn gọi là vectơ NULL vì điểm đầu và điểm cuối trùng nhau.
- Vectơ đồng gốc – Hai hoặc nhiều vectơ có cùng điểm đầu.
- Vectơ song song – Hai hoặc nhiều vectơ song song với cùng một đường thẳng.
- Vectơ bằng nhau – Hai vectơ có cùng độ lớn và hướng.
Tích vô hướng (Dot Product) là gì?
Tích vô hướng còn gọi là tích scaler, định nghĩa như sau –
Cho hai vectơ A = a1*i + a2*j + a3*k và B = b1*i + b2*j + b3*k, với i, j, k là vectơ đơn vị (giá trị 1) và x, y, z là hướng. Tích vô hướng = a1*b1 + a2*b2 + a3*b3
Đầu vào: A = 2*i + 7*j + 2*k, B = 3*i + 1*j + 5*k Đầu ra: 2*3 + 7*1 + 2*5 = 23
Tích có hướng (Cross Product) là gì?
Tích có hướng còn gọi là tích vector, định nghĩa như sau –
Cho hai vectơ A = a1*i + a2*j + a3*k và B = b1*i + b2*j + b3*k. Tích có hướng = (a2*b3 - a3*b2)*i - (a1*b3 - a3*b1)*j + (a1*b2 - a2*b1)*k, trong đó các hệ số là hệ số của vectơ đơn vị i, j, k.
Đầu vào: A = 2*i + 7*j + 2*k, B = 3*i + 1*j + 5*k Đầu ra: (7*5 - 2*1)i + (2*5 - 2*3)j - (2*1 - 7*3)k
Thuật toán
Bắt đầu
Bước 1 -> Khai báo hàm tính tích vô hướng
int dot_product(int vector_a[], int vector_b[])
Khai báo int product = 0
Vòng lặp Với i = 0 đến i < size và i++
Gán product = product + vector_a[i] * vector_b[i]
Kết thúc
trả về product
Bước 2 -> Khai báo hàm tính tích có hướng
void cross_product(int vector_a[], int vector_b[], int temp[])
Gán temp[0] = vector_a[1] * vector_b[2] - vector_a[2] * vector_b[1]
Gán temp[1] = -(vector_a[0] * vector_b[2] - vector_a[2] * vector_b[0])
Gán temp[2] = vector_a[0] * vector_b[1] - vector_a[1] * vector_b[0]
Bước 3 -> Trong main()
Khai báo vectơ int vector_a[] = {4, 2, -1}
Khai báo vectơ int vector_b[] = {5, 7, 1}
Khai báo biến int temp[size]
Gọi hàm dot_product(vector_a, vector_b)
Gọi hàm cross_product(vector_a, vector_b)
Vòng lặp Với i = 0 đến i < size và i++
In temp[i]
Kết thúc
Kết thúc
Ví dụ mã C++
#include <bits/stdc++.h>
#define size 3
using namespace std;
// Hàm tính tích vô hướng
int dot_product(int vector_a[], int vector_b[]) {
int product = 0;
for (int i = 0; i < size; i++)
product = product + vector_a[i] * vector_b[i];
return product;
}
// Hàm tính tích có hướng
void cross_product(int vector_a[], int vector_b[], int temp[]) {
temp[0] = vector_a[1] * vector_b[2] - vector_a[2] * vector_b[1];
temp[1] = -(vector_a[0] * vector_b[2] - vector_a[2] * vector_b[0]);
temp[2] = vector_a[0] * vector_b[1] - vector_a[1] * vector_b[0];
}
int main() {
int vector_a[] = {4, 2, -1};
int vector_b[] = {5, 7, 1};
int temp[size];
cout << "Tích vô hướng:";
cout << dot_product(vector_a, vector_b) << endl;
cout << "Tích có hướng:";
cross_product(vector_a, vector_b, temp);
for (int i = 0; i < size; i++)
cout << temp[i] << " ";
return 0;
}
Đầu ra
Tích vô hướng: 33 Tích có hướng: 9 -9 18