4

C# を使用してサーフェスを補間したいと思います。状況は次のとおりです。

x、y、z 座標のセットが与えられます。ここで、より細かいグリッドを使用してこれらのポイント間を補間したいと思います。実際には、特定の点での z 座標を知りたいと思います。たとえば、x=2.2、y=1.6 z =?? です。

MatLab を使用して補間を解くことができましたが、c# を使用している間はうまくいきませんでした。

編集:

いくつか明確にする必要があると思います - 私の質問の仕方がわかりにくくて申し訳ありません

ここでは、いくつかのポイントからサーフェスを描画する方法を確認できます。

using System;
using System.Drawing;
using System.Windows.Forms;
using ILNumerics;
using ILNumerics.Drawing;
using ILNumerics.Drawing.Plotting; 

namespace Surface
{
   public partial class Form1 : Form
   {
      public Form1()
      {
         InitializeComponent();
      }

      private void ilPanel1_Load(object sender, EventArgs e)
      {
         using (ILScope.Enter())
         {
            ILArray<float>  R = ILMath.linspace<float>(0, 5, 5);
            ILArray<float> R1 = ILMath.linspace<float>(0, 25, 5);
            ILArray<float>  y = 1;
            ILArray<float>  x = ILMath.meshgrid(R, R, y);
            ILArray<float> z = ILMath.meshgrid(R * R, R, y);
            ILArray<float> Z = ILMath.zeros<float>(x.S[0], x.S[1], 3);

            Z[":;:;1"] = x;
            Z[":;:;2"] = y;
            Z[":;:;0"] = z;

             ilPanel1.Scene.Add(new ILPlotCube(twoDMode: false) {
                new ILSurface(Z, colormap: Colormaps.Cool) {
                    Colors = 1.4f * x * x * x + 0.13f * y * y,
                    Childs = { new ILColorbar() }
                }
            });
         }
      }
   }
}

x 座標と y 座標は 0 から 5 まで線形に分布し、z 座標は 2 次形状をしています。特定の x、y 座標での z 座標の値を取得したいと思います。たとえば、x=2.2、y=1.6 z =?? -これは私の表面の既知のポイントではありません。そのため、z座標の値を読み取ることができるように、「より細かい」グリッドでサーフェスを補間することをお勧めします...

4

2 に答える 2

1

関数の z 座標は、次の行で計算されます。

 ILArray<float> z = ILMath.meshgrid(R * R, R, y);

meshgrid は実際には 2 次元関数評価の X 座標と Y 座標を作成するために使用されるため、R * R の結果のみが z に入ります。その行の後、x、y、z は次のようになります。

x
<Single> [5,5]
[0]: 0,00000 1,25000 2,50000 3,75000 5,00000 
[1]: 0,00000 1,25000 2,50000 3,75000 5,00000 
[2]: 0,00000 1,25000 2,50000 3,75000 5,00000 
[3]: 0,00000 1,25000 2,50000 3,75000 5,00000 
[4]: 0,00000 1,25000 2,50000 3,75000 5,00000 

y
<Single> [5,5]
[0]: 0,00000 0,00000 0,00000 0,00000 0,00000 
[1]: 1,25000 1,25000 1,25000 1,25000 1,25000 
[2]: 2,50000 2,50000 2,50000 2,50000 2,50000 
[3]: 3,75000 3,75000 3,75000 3,75000 3,75000 
[4]: 5,00000 5,00000 5,00000 5,00000 5,00000 

z
<Single> [5,5]
[0]: 0,00000 1,56250 6,25000 14,06250 25,00000 
[1]: 0,00000 1,56250 6,25000 14,06250 25,00000 
[2]: 0,00000 1,56250 6,25000 14,06250 25,00000 
[3]: 0,00000 1,56250 6,25000 14,06250 25,00000 
[4]: 0,00000 1,56250 6,25000 14,06250 25,00000 

明らかに、z は x のみに依存します。これは、結果のサーフェスによって明らかになります。

水面

したがって、z の値は x * x になります。またはあなたの特定の例のために:

x=2.2, y=1.6 z =4.84

編集:基になる機能が不明な場合は、次のいずれかを実行できます

  • その関数を学習しようとする (ridge_regression() または pinv() を使用)、または
  • 隣接するグリッド ポイントのデータから補間します。

現在、ILNumerics には対応する関数 (「interp2」など) はありません。ただし、あなたの場合、補間する必要があるのは 1 つのポイントのみ (?) であり、隣接するグリッド ポイントを見つけて、一般的な補間方法の 1 つを使用できます。

編集:補間ツールボックスのリリースにより、作業が大幅に簡単になりました。任意の次元で高速かつ単一のラインで補間できるようになりました。

于 2013-09-19T20:22:25.050 に答える
1

さまざまな補間手法から選択できます。バイリニア補間から始めることをお勧めします:

http://en.wikipedia.org/wiki/Bilinear_interpolation

または、すべてのクワッドを 2 つの三角形に分割し、重心補間を使用します。

http://en.wikipedia.org/wiki/Barycentric_coordinate_system_(数学)

于 2013-09-17T11:41:22.053 に答える