1. ホーム
  2. c#

2次元補間における三乗法のmatlabでの実装原理(個人的意見です)

2022-03-01 01:27:12

matlabのヘルパープログラムを調べると、離散データのグリッディングには以下の5つの方法があるようです。 

griddata(... , METHOD) ここで、METHODは以下のうちの1つです。
        nearest' - ニアレストネイバ補間
        linear' - 直線補間(デフォルト).
        natural' - 自然な近傍補間を行います。
        cubic' - キュービック補間(2Dのみ)
        v4' - MATLAB 4 グリデータ法(2Dのみ)

この記事では、3乗の実装原理を紹介します。

matlabのヘルプノートによると。

補間方法を定義します。「最近接法」と「線形法」があります。
    は、0次導関数と1次導関数にそれぞれ不連続性があります。
    一方、「cubic」と「v4」メソッドは滑らかなサーフェイスを生成します。
    すべての

v4'以外のメソッドはデローナリの三角形分割をベースにしているので、キュービックメソッドも例外ではないという意味です。つまり、matlabのcubicメソッドは、Delaunaryベースの三角形分割をしたものです。

ステップ

1. 凸包アルゴリズムを参照し、離散座標に基づく離散点の凸包を得る。

2. Delaunary Triangular Networkを構築する。

3. 格子点法に従って格子点の座標を求める。

 離散点の制御範囲に従ってグラトリを行い、次に縦・横座標のグラトリ間隔、または離散点の制御範囲に従ってグラトリを行い、次に縦・横座標のノード数など、必要に応じてグラトリを行うことができます。

4. 補間する点はデローナリーの三角形内にあることが要求されるため、補間領域内のすべての格子点をトラバースし、補間する点が位置する三角形内の3点を基準に三次補間を用いて補間する点の座標上の値を算出する。

注:三次補間、および三次補間によって何を意味するのかに特定の導入を見つけなかった、この記事で使用される方法は、同じライン上にない3点に基づいて平面をフィットし、そして平面上の任意の座標上の点の値を求めることができます。(あるいはこれを三次補間と呼ぶ)。

matlabの結果と比較すると、統計は以下のようになります。

補間結果はmatlabの結果と非常に高い一致を示し、統計的特徴から差分の中央値は0.6mmと、やはり非常に高い精度を示していることがわかります。

制御領域の比較。

matlab

この方法


アタッチメントです。

平面フィッティング機能。

// 点の法線方程式で平面方程式を求め、求める点の座標を補間する。

void CubicInterpolation(value[] triScatters,ref value target)
        { <未定義
            double x1 = triScatters[0].lon;
            double y1 = triScatters[0].lat;
            double z1 = triScatters[0].v;

            double x2 = triScatters[1].lon;
            double y2 = triScatters[1].lat;
            double z2 = triScatters[1].v;

            double x3 = triScatters[2].lon;
            double y3 = triScatters[2].lat;
            double z3 = triScatters[2].v;

            double x = target.lon;
            double y = target.lat;

            target.v = (-((y3 - y1) * (z2 - z1) - (z3 - z1) * (y2 - y1))) * (x - x1) - ((z3 - z1) * (x2 - x1) - (x3 - x1) * (z2 - z1)) * (y - y1)) / ((x3 - x1) * (y2 - y1) - (y3 - y1) * (x2 - x1))) + z1 ;


        }

// 点が凸包の内部にあるかどうかを判断する

/// <まとめ>
        /// 点が凸包の中にあるかどうかを判断する
        /// 原理 凸包の各点と決定したい点のベクトルを「順に」形成し、最後の点のベクトルが最初の点のベクトルとフォーク積を形成するように、2つの積を順にフォークする
        /// 点が凸包の中にある場合はフォーク積の符号が同じになり、そうでない場合は全く同じにはならない。
        /// </summary>
        /// <param name="boxPoints">Discrete convex packet points</param>
        /// <param name="x">決定したい点のx座標</param>
        /// <param name="y">y 座標を決定する点</param>
        /// <returns></returns>
        bool isInRegion(List<value> boxPoints,double x,double y)
        { <未定義
            double[] cj = new double[boxPoints.Count];
            for(int i=0;i<boxPoints.Count;i++)
            { <未定義
                double x1=0, y1=0, x2=0, y2=0;
                // 終点と始点がつながっている
                if(i==boxPoints.Count-1)
                { <未定義
                    x1 = boxPoints[i].lon - x;
                    y1 = boxPoints[i].lat - y;
                    x2 = boxPoints[0].lon - x。
                    y2 = boxPoints[0].lat - y;
                }
                さもなければ
                { <未定義
                    x1 = boxPoints[i].lon - x;
                    y1 = boxPoints[i].lat - y;
                    x2 = boxPoints[i + 1].lon - x。
                    y2 = boxPoints[i + 1].lat - y;
                }
                double chaji = x1 * y2 - x2 * y1;
                cj[i ] = chaji;
                //凸包の外側
                if (i>0&&(cj[i] * cj[i - 1] < 0))
                { <未定義
                    は false を返します。
                }
            }
            はtrueを返します。
        }