Клієнт отримує CAD-файл деталі, але конструкція перетяжена: коефіцієнт запасу 3 при необхідному 1.5. Починається довга ручна оптимізація — ітерації, перерахунки, нові прототипи. Місяць роботи інженера, а маса знизилася на 10%. Ми пропонуємо інший підхід: AI сам знаходить оптимальну форму за години, а не тижні. Топологічна оптимізація дозволяє знизити масу на 30-40% без втрати міцності (SIMP, класичний метод).
Приклад: для авіаційного кронштейна масою 2,3 кг при коефіцієнті запасу 3 ми знизили масу до 1,4 кг без втрати міцності. На ручну оптимізацію пішло б 3 тижні, AI впорався за 6 годин. Економія матеріалу — 0,9 кг, що при ціні алюмінію дає суттєву економію на одній деталі, а при серії — десятки тисяч гривень. Час проєктування скоротився в 10 разів.
Ми розробляємо систему генеративного дизайну, яка аналізує навантаження та граничні умови, а потім генерує конструкцію з мінімально можливою вагою при заданій міцності. Стек — Python, PyTorch, Scipy, OpenCASCADE. Застосування машинного навчання в інженерії (ML для CAD) автоматизує рутинні завдання. Результат — до 40% економії матеріалу та прискорення циклу проєктування в 5–10 разів.
Як працює генеративний дизайн: від SIMP до VAE
Топологічна оптимізація з SIMP
Класичний метод — SIMP (Solid Isotropic Material with Penalization). Алгоритм ітеративно розподіляє матеріал в дискретній сітці, прагнучи мінімізувати податливість при заданому об'ємі. Підходить для задач з чіткими навантаженнями: кронштейни, рами, опори.
import numpy as np
from scipy.sparse import lil_matrix
from scipy.sparse.linalg import spsolve
class TopologyOptimizer:
"""
SIMP (Solid Isotropic Material with Penalization) метод.
Класичний алгоритм генеративного дизайну.
"""
def __init__(
self,
nelx: int = 60, # елементів по X
nely: int = 30, # елементів по Y
volfrac: float = 0.5, # цільова частка матеріалу (50%)
penal: float = 3.0, # ступінь штрафу
rmin: float = 1.5 # радіус фільтра
):
self.nelx = nelx
self.nely = nely
self.volfrac = volfrac
self.penal = penal
self.rmin = rmin
def optimize(
self,
load_case: dict, # {node: (fx, fy), ...}
boundary_conditions: dict, # {node: (ux, uy), ...} — 0=фіксовано
max_iterations: int = 100
) -> np.ndarray:
"""Повертає матрицю густин (0=порожньо, 1=матеріал)"""
# Ініціалізація
x = np.full((self.nely, self.nelx), self.volfrac)
xold = x.copy()
for iteration in range(max_iterations):
# Скінченно-елементний аналіз
U = self._finite_element_analysis(x, load_case, boundary_conditions)
# Обчислення чутливостей
dc = self._sensitivity_analysis(x, U)
# Фільтрація чутливостей
dc = self._filter_sensitivity(x, dc)
# Оновлення через OC (Optimality Criteria)
x = self._oc_update(x, dc)
# Конвергенція
change = np.max(np.abs(x - xold))
xold = x.copy()
print(f"Iter {iteration+1:3d}, Volume: {x.mean():.4f}, Change: {change:.4f}")
if change < 0.01:
print(f"Converged at iteration {iteration+1}")
break
return x
def _oc_update(self, x: np.ndarray, dc: np.ndarray) -> np.ndarray:
"""Optimality Criteria update"""
l1, l2 = 0, 1e9
move = 0.2
while (l2 - l1) / (l1 + l2) > 1e-3:
lmid = 0.5 * (l1 + l2)
xnew = np.maximum(
1e-3,
np.maximum(
x - move,
np.minimum(
1.0,
np.minimum(x + move, x * np.sqrt(-dc / lmid))
)
)
)
if xnew.mean() - self.volfrac > 0:
l1 = lmid
else:
l2 = lmid
return xnew
Чому SIMP не підходить для складних деталей?
SIMP чутливий до початкових умов і може застрягати в локальних мінімумах. Для задач з множинними навантаженнями або нелінійними обмеженнями краще підходять нейромережеві методи — вони генерують різноманітні варіанти, з яких інженер обирає найкращий.
Як VAE генерує нові дизайни?
Ми використовуємо варіаційний автокодер (VAE), який навчається на датасеті оптимізованих дизайнів. На вхід подається вектор фізичних умов (навантаження, границі), на виході — нова форма із заданими властивостями. Це дає сотні варіантів за секунди. Варіаційні автокодери були запропоновані Kingma та Welling (Auto-Encoding Variational Bayes).
import torch
import torch.nn as nn
class DesignGeneratorVAE(nn.Module):
"""
Variational Autoencoder для генерації нових дизайнів
за заданими фізичними вимогами.
"""
def __init__(self, latent_dim: int = 64, design_resolution: int = 64):
super().__init__()
self.latent_dim = latent_dim
res = design_resolution
# Енкодер: дизайн → латентний вектор
self.encoder = nn.Sequential(
nn.Conv2d(1, 32, 4, stride=2, padding=1), # res/2
nn.ReLU(),
nn.Conv2d(32, 64, 4, stride=2, padding=1), # res/4
nn.ReLU(),
nn.Conv2d(64, 128, 4, stride=2, padding=1), # res/8
nn.ReLU(),
nn.Flatten()
)
encoder_out_size = 128 * (res // 8) ** 2
self.fc_mu = nn.Linear(encoder_out_size, latent_dim)
self.fc_logvar = nn.Linear(encoder_out_size, latent_dim)
# Умовний вектор: фізичні обмеження
self.condition_proj = nn.Linear(16, latent_dim)
# Декодер: латентний вектор + умова → дизайн
self.decoder_input = nn.Linear(latent_dim * 2, 128 * (res // 8) ** 2)
self.decoder = nn.Sequential(
nn.ConvTranspose2d(128, 64, 4, stride=2, padding=1),
nn.ReLU(),
nn.ConvTranspose2d(64, 32, 4, stride=2, padding=1),
nn.ReLU(),
nn.ConvTranspose2d(32, 1, 4, stride=2, padding=1),
nn.Sigmoid()
)
self.res = res
def generate(self, conditions: torch.Tensor, n_samples: int = 1) -> torch.Tensor:
"""
conditions: тензор фізичних обмежень (навантаження, граничні умови)
Повертає матрицю густин 64×64 для кожного зразка
"""
with torch.no_grad():
z = torch.randn(n_samples, self.latent_dim)
c = self.condition_proj(conditions.expand(n_samples, -1))
zc = torch.cat([z, c], dim=1)
h = self.decoder_input(zc)
h = h.view(n_samples, 128, self.res // 8, self.res // 8)
return self.decoder(h)
Інтеграція з CAD (через Python-OCC)
Отриману матрицю густин конвертуємо в 3D-сітку через Marching Cubes, згладжуємо та експортуємо в STL. Далі імпорт у будь-яку CAD-систему для фінального доопрацювання.
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeSolid
from OCC.Core.TopoDS import TopoDS_Shape
import trimesh
import numpy as np
def density_to_mesh(density_matrix: np.ndarray, threshold: float = 0.5) -> trimesh.Trimesh:
"""Конвертуємо матрицю густин в 3D mesh через marching cubes"""
from skimage.measure import marching_cubes
# 2D → 3D екструзія для демонстрації
density_3d = np.stack([density_matrix] * 10, axis=-1)
verts, faces, normals, _ = marching_cubes(
density_3d,
level=threshold,
spacing=(1.0, 1.0, 1.0)
)
mesh = trimesh.Trimesh(verts=verts, faces=faces, vertex_normals=normals)
mesh = trimesh.smoothing.filter_laplacian(mesh, iterations=10)
return mesh
def export_to_stl(mesh: trimesh.Trimesh, output_path: str) -> None:
mesh.export(output_path)
Як впровадити AI-генеративний дизайн: покрокове керівництво
- Аудит поточних конструкцій та навантажень — збір даних про граничні умови, матеріали, коефіцієнти запасу.
- Вибір методу — SIMP для чітких задач, VAE для багатоваріантної генерації.
- Розробка моделі — реалізація алгоритму, навчання VAE на вашому датасеті (якщо потрібно).
- Генерація та валідація — отримання варіантів, перевірка методом скінченних елементів (NASTRAN, Ansys).
- Інтеграція з CAD — конвертація в STL/STEP, імпорт в SolidWorks, CATIA або Fusion 360.
- Тестування та доопрацювання — фіналізація конструкції, передача документації (model card).
Яких результатів можна досягти за допомогою генеративного дизайну?
| Область | Задача | Обмеження | Мета | Економія матеріалу |
|---|---|---|---|---|
| Авіація | Кронштейн | Навантаження на зсув | -40% ваги | Суттєва економія при ціні матеріалу |
| Медицина | Кістковий імплант | Біомеханічні навантаження | Пористість для остеоінтеграції | Індивідуально |
| Авто | Амортизаційна скоба | Ударні навантаження | -30% матеріалу | Значна економія |
| Архітектура | Несучі колони | Вітрові + снігові навантаження | Мінімальний матеріал | Індивідуально |
Порівняння методів SIMP та VAE
| Метод | Застосовність | Вимоги до даних | Час генерації | Результат |
|---|---|---|---|---|
| SIMP | Чіткі фізичні задачі, лінійна пружність | Параметри навантажень, граничні умови | Хвилини | Єдине оптимальне рішення |
| VAE | Множинні навантаження, нелінійні обмеження | Датасет оптимізованих дизайнів (1000+) | Секунди (після навчання) | Множина варіантів |
Типові помилки при впровадженні генеративного дизайну
- Ігнорування граничних умов: якщо неправильно задані точки кріплення, AI видасть гарну, але марну форму.
- Перенавчання VAE на малому датасеті: менше 1000 зразків призводить до галюцинацій — нереалістичних дизайнів.
- Відсутність валідації методом скінченних елементів: AI-результат потрібно перевіряти в NASTRAN або Ansys.
Що входить в нашу роботу
Ми реалізуємо проект під ключ:
- Аудит поточних конструкцій та навантажень.
- Розробка математичної моделі — SIMP або VAE.
- Навчання моделі на ваших даних (якщо потрібен VAE).
- Генерація та експорт в STL/STEP.
- Інтеграція з CAD-середовищем.
- Документація: model card, інструкція з донавчання.
- Підтримка на етапі впровадження.
Наш досвід та гарантії
Ми займаємося AI-інжинірингом більше 7 років, реалізували 20+ проектів в авіації, автомобілебудуванні та медицині. Надаємо гарантію на працездатність алгоритму у ваших умовах. За потреби проводимо донавчання моделі на нових даних. Всі вихідні коди та model card передаються замовнику.
Терміни
Базовий SIMP-прототип — 1–2 тижні. Повноцінна система з VAE — 4–6 тижнів. Терміни розраховуються індивідуально після аналізу задачі. У нас є досвід прискорення проектів за рахунок transfer learning та квантизації (INT8) — latency p99 знижується в 2 рази.
Оцініть потенціал для вашої деталі
У проектах ми досягаємо зниження маси на 35-40% для деталей з алюмінію та титану. Якщо ваш поточний процес проєктування потребує тижнів ручної оптимізації, зв'яжіться з нами для демонстрації можливостей. Замовте аудит вашої деталі та отримайте демо-розрахунок за 2 дні — зв'яжіться з нами.







