Computer >> Máy Tính >  >> Lập trình >> C ++

Biểu diễn một tập hợp điểm cho trước bằng đường thẳng tốt nhất có thể có trong C ++

Thảo luận Cách biểu diễn một tập hợp các điểm bằng một đoạn thẳng tốt nhất có thể. Chúng ta đã cho các giá trị (x, y) của một tập hợp các điểm và chúng ta cần tìm đường thẳng tốt nhất y =mx + c, Vì vậy, tất cả những gì chúng ta cần là tìm giá trị của m và c, chẳng hạn

Input: no_of_points = 4
x1 = 2, y1 = 3,
x2 = 5, y2 = 6,
x3 = 1, y3 = 3,
x4 = 4, y4 = 5.

Output: m = 0.8, c = 1.85
Explanation: If we apply the value of m and c in the equation y = mx + c for any point (xi, yi) it would give the best straight line covering all the points.
Putting value of m and c in (x2,y2),
L.H.S : mx + c = 0.8 * 5 + 1.85 = 5.85
R.H.S : y = 6 which is nearly equal to L.H.S.

Input: no_of_points = 3
x1 = 3, y1 = 6,
x2 = 2, y2 = 4,
x3 = 1, y3 = 3,

Output: m = 1.5,c = 1.33

Phương pháp tiếp cận để tìm giải pháp

Để giải bài toán này, chúng ta cần tìm các giá trị của m và c. Sẽ có một giải pháp duy nhất khi số điểm là 2, Nhưng khi không có điểm nào lớn hơn hai, các giải pháp có thể tồn tại hoặc có thể không.

Hãy lấy số điểm là n,

Vì vậy, chúng ta sẽ có n phương trình, fn =mxn + c

Để phương trình này phù hợp nhất, chúng ta cần tìm giá trị của fi, bằng hoặc gần với yi.

Hãy lấy Z =(fi - yi) 2; bây giờ, chúng ta cần đặt giá trị này tối thiểu cho tất cả các điểm. Chúng tôi đã bình phương thuật ngữ (fi - yi) để loại bỏ các thuật ngữ phủ định.

Đối với Z là tối thiểu, điều này phải thỏa mãn,

𝜹 (Z) / 𝜹 (m) =0 và 𝜹 (Z) / 𝜹 (c) =0.

Khi giải các phương trình này,

sigma (y) =m * sigma (x) + no_of_points * c và

sigma (xy) =m * sigma (x2) + c * sigma (x).

Đó là,

m =(no_of_points * sigma (xy) - sigma (x) 8 sigma (y)) / (n * sigma (x2) - sigma (x2)) và

c =(sigma (y) - m * sigma (x)) / no_of_points.

Vì vậy, bây giờ chúng ta có một công thức trực tiếp để tìm m và c của phương trình cuối cùng.

Ví dụ

Mã C ++ cho phương pháp tiếp cận trên

#include <cmath>
#include <iostream>
using namespace std;
int main(){
   int X[] = { 3, 2, 1 };
   int Y[] = { 6, 4, 3};
   int no_of_points = sizeof(X) / sizeof(X[0]);
   float m, c;
   int sum_of_X = 0, sum_of_X2 = 0, sum_of_Y = 0, sum_of_XY = 0;
   // calculating all the terms of the equation.
   for (int i = 0; i < no_of_points; i++) {
      sum_of_X = sum_of_X + X[i];
      sum_of_X2 = sum_of_X2 + pow(X[i],2);
      sum_of_Y = sum_of_Y + Y[i];
      sum_of_XY = sum_of_XY + (X[i] * Y[i]);
   }
   // calculating value of m and c using formula.
   m = (no_of_points * sum_of_XY - sum_of_X * sum_of_Y) / (no_of_points * sum_of_X2 - pow(sum_of_X,2));
   c = (sum_of_Y - m * sum_of_X) / no_of_points;
   cout << "m = " << m;
   cout << "\nc = " << c;
   return 0;
}

Đầu ra

m = 1.5
c = 1.33333

Kết luận

Trong hướng dẫn này, chúng ta đã thảo luận về việc tìm đường thẳng phù hợp nhất để biểu diễn một tập hợp điểm nhất định. Chúng ta đã thảo luận về một cách tiếp cận đơn giản bằng cách suy ra công thức của m và c, sau đó áp dụng nó một cách đơn giản. Chúng tôi cũng đã thảo luận về chương trình C ++ cho vấn đề này mà chúng tôi có thể làm với các ngôn ngữ lập trình như C, Java, Python, v.v. Chúng tôi hy vọng bạn thấy hướng dẫn này hữu ích.