#python #optimization #geometry #android-3.0-honeycomb #tessellation
#питон #оптимизация #геометрия #android-3.0-honeycomb #тесселяция
Вопрос:
У меня есть проблема с геометрией, и я подумал о том, чтобы использовать python для ее решения (у меня мало опыта). Мне нужен совет, как подойти к этой проблеме.
В приложении вы можете увидеть проблему. У меня есть домен L x B, и, учитывая размер ячейки шестиугольника (Ls), я нашел максимальное количество ячеек в прямом (n) и зигзагообразном (m) направлениях, чтобы охватить домен, оставаясь в нем. ErrorL и errorB-это ошибки, которые я совершаю между границей домена и ячейками, так как у меня есть целое число ячеек для использования, и эта ошибка должна быть сведена к минимуму.
Вот простой код (может быть, его можно получить намного проще, но он работает)
from scipy import optimize import numpy as np #case cells in L straight (n), in B zig zag (m) L = 500 B = 200 Ls = 10 Lz = Ls*(3**(0.5)/2) print('Ls =', Ls) print('Lz =', Lz) print('-------------') def errorL(n): return abs(L-(Ls*n Ls/2)) def errorB(m): return abs(B-(Lz*m Lz/3)) resultL = optimize.minimize_scalar(errorL) resultB = optimize.minimize_scalar(errorB) a = round(resultL.x) b = round(resultL.x)-1 c = round(resultB.x) d = round(resultB.x)-1 if (Ls*a Ls/2) lt;= L: print('n =', a) print('errorL =', errorL(a)) else: print('n =', b) print('errorL =', errorL(b)) if (Lz*c Lz/3) lt;= B: print('m =', c) print('errorB =', errorB(c)) else: print('m =', d) print('errorB =', errorB(d))
Это был пример с заданным размером ячейки Ls, теперь я хотел бы найти способ сохранить Ls в диапазоне [a,b] и найти лучшие Ls, n и m, чтобы минимизировать ошибки и ошибки. Каждая минимизация errorL и errorB зависит от двух переменных, но выбор Ls влияет на обе. Я начал писать задачу минимизации с двумя переменными, но я не уверен, как продолжить, учитывая ошибки errorL и errorB для минимизации с одной и той же переменной Ls. Кроме того, я хотел бы работать только с n и m в качестве целых чисел. Как я могу это сделать?
Любые предложения приветствуются.
Большое спасибо
д-р
Ответ №1:
При постоянном Ls
, вам не нужно решать задачу оптимизации для того, чтобы штрафовать m
и n
. Вы можете просто установить:
n = floor((L-Ls/2)/Ls) m = floor((B-Lz/3)/Lz)
и ошибки станут:
errorL = L-(Ls*n Ls/2) errorB = B-(Lz*m Lz/3)
и, конечно Lz
, равен sqrt(3)/2*Ls
Таким образом, оба значения ошибок становятся функциями только одной переменной, т. е. Ls
. Теперь вы можете определить единственную функцию затрат (например errorL*errorB
, или errorL errorB
) и свести ее к минимуму без учета затрат.. Ls