2013-09-17 5 views
4

Я хотел бы интерполировать поверхность с помощью C#. Возможны следующие ситуации:Interpolate 3d surface ilnumerics

Дается набор координат x, y, z. Теперь я хотел бы интерполировать между этими точками, используя тонкую сетку. На самом деле мне хотелось бы знать координату z в определенной точке, например. x = 2,2, y = 1,6 z =.

Я смог решить интерполяцию с помощью MatLab, но не был успешным при использовании C# .. Кроме того, мне удалось обработать поверхности с помощью ilnumerics и попытался найти некоторую информацию на своей домашней странице.

EDIT:

Я думаю, что нужно уточнить некоторые вещи - извините за путаницу способ задавать свой вопрос

здесь вы можете увидеть, как я рисую поверхность из некоторых пунктов:

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 имеет квадратичную форму. Я хотел бы теперь оценить значение координаты z при определенной координате x, y, например. x = 2,2, y = 1,6 z = - что определенно не является точкой знаний на моей поверхности. Поэтому я подумал, что было бы хорошей идеей интерполировать поверхность с «более тонкой» сеткой, чтобы я мог считывать значение координаты z ...

+0

Если у вас были проблемы с кодом, отправьте код. Возможно, вместе с вашим работающим кодом MatLab. – weston

+0

Привет, в первую очередь спасибо за ваш повтор. Я проблема, с которой кто-то решил с MatLab, не совсем то же самое, но вы можете проверить эту ссылку: http://stackoverflow.com/questions/8195404/interpolation-curve-to -surface Существует отношение для известных координат z, а не в моем случае ... – gabs

+0

Предлагаю вам прочитать [помощь] (http://stackoverflow.com/help) относительно вопроса. Вы так и не поняли, что невозможно решить проблему, и вы не можете помочь, не давая вам полного рабочего кода. – weston

ответ

1

апликатов вашей функции вычисляется в этой строке :

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

Поскольку meshgrid на самом деле используется для создания X и Y для оценки двумерной функции, только результат R * R переходит в 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 

Очевидно, г это зависит только от х, которая получает ясно результирующей поверхности:

Surface

Таким образом, значение от z будет: x * x. Или для конкретного примера:

x=2.2, y=1.6 z =4.84 

Edit: В случае, если основная функция не известна, вы можете либо

  • пытаются узнать, что функция (с помощью ridge_regression() или pinv()), или
  • Интерполировать данные соседних точек сетки.

В настоящее время в ILNumerics не существует соответствующей функции (например, «interp2»). Однако в вашем случае - когда нужно интерполировать только одну точку (?), Можно найти соседние точки сетки и использовать один из общих методов интерполяции.

Редактировать: С выпуском interpolation toolbox все стало значительно проще. Теперь вы можете интерполировать в любом измерении с высокой скоростью и с одной строкой.

+0

Спасибо за объяснение .. В моем примере я предполагал знать отношение для z-координаты. Но на самом деле «только» имеет набор точек, представленных в координатах x, y, z. Эти точки следует интерполировать с помощью поверхности, которая должна обеспечивать координату z в любой точке поверхности ... – gabs

+0

Эй Хеймо, у меня есть множество точек - примерно 25 баллов. Из этих точек я хотел бы рассчитать поверхность, где все точки должны быть на поверхности. Таким образом, с интерполированной поверхностью в руке должно быть возможно рассчитать координату z между этими «контрольными точками». Есть ли какая-либо функция или метод, который определяет поверхность из некоторых заданных точек? – gabs

+1

Вам нужна функция, которая генерирует сетку из заданных точек. Обычный генератор сетки представляет собой триангуляцию delaunay: http://en.wikipedia.org/wiki/Delaunay_triangulation В настоящее время нет такой функции, предоставляемой базовым пакетом ILNumerics. –

1

Существуют различные методы интерполяции на выбор. Я хотел бы предложить начать с билинейной интерполяцией:

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

или разделить каждый четырехугольник на два треугольник и использовать барицентрическую интерполяцию:

http://en.wikipedia.org/wiki/Barycentric_coordinate_system_(mathematics)

+0

Эй, спасибо за ответ, но мне не нужен какой-либо метод интерполяции. Как я уже говорил, я смог решить проблему в MatLab, и теперь я спрашиваю, есть ли у кого-то идея, как решить проблему с помощью C# ... – gabs

+0

«Мне не нужен какой-либо метод интерполяции»? Вы сказали, он работал в Матлабе. Почему бы не пойти так же на C#, как в Matlab? Твоя проблема еще не ясна. –

+1

Если понимание C# является реальной проблемой, я бы предложил вам прочитать некоторые уроки C#. Это должно быть хорошим: http://msdn.microsoft.com/en-us/library/aa288436(v=vs.71).aspx. Не забудьте заглянуть в массивы: http://msdn.microsoft.com/en-us/library/aa288453(v=vs.71).aspx – Enigma

Смежные вопросы