Используете ли вы самую последнюю версию OpenAeroStruct? Произошло недавнее изменение, которое переименовало некоторые переменные. Код на сайте соответствует этой новой версии.
Попробуйте использовать новейшую версию OAS, которая доступна здесь: https://github.com/mdolab/OpenAeroStruct
Пошаговый код работает локально на моей машине и удаленно с этой новой версией.
Попробуйте также билинейную интерполяцию или бикубическую интерполяцию.
Рассмотрение значения точек доступно в четырех углах квадрата единичной длины, интерполированным значением в любой точке (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
В зависимости от того, хотите ли вы выполнить интерполяцию между ABC или ABCD, алгоритм изменится.
Для интерполяции между ABC (что, я полагаю, именно то, что вы хотите сделать, поскольку вы рисуете диагональ), вам нужно будет найти барицентрические координаты P относительно положений ABC x и y, а затем применить барицентрическую координату к высоте (z здесь предполагается) составляющая этих треугольников.
А как насчет того, чтобы пойти этим путем: найдите u
и v
, чтобы
P = B + u(A-B) + v(C-B)
Если вы напишете это , вы увидите, что это линейная система 2x2 с неизвестными u
и v
, так что я думаю, вы знаете, как действовать дальше.
О, и как только у вас есть u
и v
, вы используете ту же точную формулу, что и выше, для высоты, только на этот раз A, B, C, P
будет высотой в этих точках.
Вот явный пример, основанный на функциях формы.
Рассмотрим функции:
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.