C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

与えられた点のセットをC++で可能な限り最良の直線で表す


可能な限り最良の直線で点のセットを表す方法について話し合います。一連の点の値(x、y)が与えられ、最適な直線y =mx + cを見つける必要があります。したがって、必要なのは、たとえばmとcの値を見つけることだけです。

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

解決策を見つけるためのアプローチ

この問題を解決するには、mとcの値を見つける必要があります。ポイントの数が2の場合、独自の解決策がありますが、2を超えるポイントがない場合、解決策が存在する場合と存在しない場合があります。

ポイント数をnとします

したがって、n個の方程式があります。fn=mxn + c

この方程式が最適であるためには、yiに等しいかそれに近いfiの値を見つける必要があります。

Z =(fi --yi)2;ここで、この値をすべてのポイントで最小にする必要があります。負の項を削除するために、項(fi --yi)を2乗しました。

Zを最小にするには、これが満たす必要があります。

𝜹(Z)/𝜹(m)=0および𝜹(Z)/𝜹(c)=0。

これらの方程式を解くことについて

sigma(y)=m * sigma(x)+ no_of_points * c、および

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

つまり、

m =(no_of_points * sigma(xy)-sigma(x)8 sigma(y))/(n * sigma(x2)-sigma(x2))、および

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

これで、最終的な方程式のmとcを見つけるための直接式ができました。

上記のアプローチのC++コード

#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;
}

出力

m = 1.5
c = 1.33333

結論

このチュートリアルでは、特定の点のセットを表すのに最適な直線を見つける方法について説明しました。最初にmとcの式を導き出し、次にそれを単純に適用することによって、簡単なアプローチについて説明しました。また、C、Java、Pythonなどのプログラミング言語で実行できるこの問題のC++プログラムについても説明しました。このチュートリアルがお役に立てば幸いです。


  1. C++でのライン上の最大ポイント

    2D平面があるとします。同じ直線上にある点の最大数を見つける必要があります。したがって、ポイントが次のような場合- それから4つのポイントがあります これを解決するには、次の手順に従います- n:=ポイントの数、n <3の場合、nを返します ans:=2 1からn–1の範囲のiの場合 カウント:=0 インデックスiとi– 1から2つのポイントを取ります。これらは、p1、p2です。 p1ポイントとp2ポイントが同じ場合、 0からn–1の範囲のjの場合 points [j] .x=p1.xおよびpoints[j].y =p1.yの場合、

  2. C++で特定のポイントセットの単純な閉じたパスを検索します

    一連のポイントがあると考えてください。すべてのポイントをカバーする単純な閉じたパスを見つける必要があります。ポイントが以下のようであり、次の画像がそれらのポイント上で閉じたパスを作成していると仮定します。 パスを取得するには、次の手順に従う必要があります- 左下の点をPとして見つけます Pを中心に反時計回りに極角に基づいて他のn– 1点を並べ替えます。2点の極角が同じである場合は、距離が最短になるように配置します。 ソートされたポイントのリストをトラバースし、パスを作成します 例 #include <bits/stdc++.h> using names