Интерполяция высоты для точки в сетке на основе дискретной функции высоты

Используете ли вы самую последнюю версию OpenAeroStruct? Произошло недавнее изменение, которое переименовало некоторые переменные. Код на сайте соответствует этой новой версии.

Попробуйте использовать новейшую версию OAS, которая доступна здесь: https://github.com/mdolab/OpenAeroStruct

Пошаговый код работает локально на моей машине и удаленно с этой новой версией.

5
задан Glorfindel 4 July 2019 в 22:06
поделиться

5 ответов

3
ответ дан 14 December 2019 в 19:09
поделиться

Рассмотрение значения точек доступно в четырех углах квадрата единичной длины, интерполированным значением в любой точке (x, y) в квадрате дают:

f(x,y) = [ (1-y)f(0,0) + yf(0,1) ](1-x) + [ (1-y)f(1,0)+y(f(1,1)) ]x

, Если квадрат имеет длину кроме 1, скажите, что L затем f (x, y) дают:

  f(x,y) = [ (L-y)f(0,0) + yf(0,L) ](L-x)/L^2 + [ (L-y)f(L,0)+y(f(L,L)) ]x/L^2

изображение

0
ответ дан 14 December 2019 в 19:09
поделиться

В зависимости от того, хотите ли вы выполнить интерполяцию между ABC или ABCD, алгоритм изменится.

Для интерполяции между ABC (что, я полагаю, именно то, что вы хотите сделать, поскольку вы рисуете диагональ), вам нужно будет найти барицентрические координаты P относительно положений ABC x и y, а затем применить барицентрическую координату к высоте (z здесь предполагается) составляющая этих треугольников.

1
ответ дан 14 December 2019 в 19:09
поделиться

А как насчет того, чтобы пойти этим путем: найдите u и v , чтобы

  P = B + u(A-B) + v(C-B)

Если вы напишете это , вы увидите, что это линейная система 2x2 с неизвестными u и v , так что я думаю, вы знаете, как действовать дальше.

О, и как только у вас есть u и v , вы используете ту же точную формулу, что и выше, для высоты, только на этот раз A, B, C, P будет высотой в этих точках.

1
ответ дан 14 December 2019 в 19:09
поделиться

Вот явный пример, основанный на функциях формы.

Рассмотрим функции:

u1 (x, z) = (x-x_b) / (x_c-x_b)

Имеется u1 (x_b, z_b) = u1 (x_a, z_a) = 0 (потому что x_a = x_b) и u1 (x_c, z_c) = u1 (x_d, z_d) = 1

u2 (x, z) = 1 - u1 (x, z)

Теперь у нас есть u2 (x_b, z_b) = u2 (x_a, z_a) = 1 и u2 (x_c, z_c) = u2 (x_d, z_d) = 0

v1 (x, z) = (z-z_b) / (z_a-z_b)

Это функция удовлетворяет v1 (x_a, z_a) = v1 (x_d, z_d) = 1 и v1 (x_b, z_b) = v1 (x_c, z_c) = 0

v2 (x, z) = 1 - v1 (x, z )

У нас есть v2 (x_a, z_a) = v2 (x_d, z_d) = 0 и v2 (x_b, z_b) = v2 (x_c, z_c) = 1

Теперь давайте создадим новые функции следующим образом:

S_D (x, z) = u1 (x, z) * v1 (x, z)

Получаем S_D (x_d, z_d) = 1 и S_D (x_a, z_a) = S_D (x_b, z_b) = S_D (x_c, z_c) = 0

S_C (x, z) = u1 (x, z) * v2 (x, z)

Получаем S_C (x_c, z_c) = 1 и S_C (x_a, z_a) = S_C (x_b, z_b) = S_C (x_d, z_d) = 0

S_A (x, z) = u2 (x, z) * v1 (x, z)

Получаем S_A (x_a, z_a) = 1 и S_A (x_b, z_b) = S_A (x_c, z_c) = S_A (x_d, z_d) = 0

S_B (x, z) = u2 (x, z) * v2 (x, z)

Получаем S_B (x_b, z_b) = 1 и S_B (x_a, z_a) = S_B (x_c, z_c) = S_B (x_d, z_d) = 0

Теперь определите вашу интерполирующую функцию как

H (x, z) = h_a * S_A (x, z) + h_b * S_B (x, z) + h_c * S_C (x, z) + h_d * S_D ( x, z),

где h_a - высота в точке A, h_b - высота в точке B и так далее.

Вы можете легко проверить, что H действительно является интерполирующей функцией:

H (x_a, z_a) = h_a, H (x_b, z_b) = h_b, H (x_c, z_c) = h_c и H (x_d, z_d) ) = h_d.

Теперь, чтобы аппроксимировать высоту в точке P, все, что вам нужно сделать, это вычислить H в этой точке:

h_p = H (x_p, z_p)

Функции S обычно называют «форма функции ".Есть одна такая функция для каждого узла, от которого вы хотите, чтобы ваше интерполированное значение зависело, и в этом случае все они удовлетворяют свойству дельты Кронекера (они принимают значение один на одном узле и ноль на всех остальных узлах).

Есть много способов построить функции формы для заданного набора узлов. Если я правильно помню, построение функций 2D-формы путем умножения функций 1D-формы (как мы сделали в этом случае) называется «тензорным произведением функций» (в данном случае это просто, потому что сетка прямоугольная). В итоге мы получили четыре функции (по одной на узел), все они являются линейными комбинациями {1, x, z, xz}.

Если вы хотите использовать только три точки для интерполяции, тогда вы сможете легко построить три функции формы как линейные комбинации только {1, x, z}, но вы потеряете 25% информации о высоте. обеспечивается сеткой, и ваш интерполянт не будет гладким внутри прямоугольника, когда h_b! = h_d.

0
ответ дан 14 December 2019 в 19:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: