Стаття
Інженерія · Чисельні методи · ⏱ ≈ 15 хв читання · Останнє оновлення: 23 червня 2026 р.

Метод скінченних елементів — структурний аналіз від перших принципів

Метод скінченних елементів (МСЕ) — це обчислювальний хребет фактично всієї сучасної структурної, теплової та гідравлічної інженерії. Він перетворює неперервне диференціальне рівняння на складній області у велику розріджену лінійну систему, поділяючи область на малі елементи, наближаючи розв'язок поліноміальними функціями форми та застосовуючи слабку форму Гальоркіна (метод, який переписує рівняння в інтегральному вигляді, щоб їх можна було наближено розв'язати за допомогою простих базисних функцій). У цій статті ми будуємо двовимірний розв'язувач МСЕ для плоского напруженого стану з нуля — від основ пружності до розрідженого складання та реалізації на JavaScript.

Коротко: Стаття крок за кроком будує розв'язувач методу скінченних елементів для плоского напруженого стану: виводяться рівняння пружності, вони перетворюються у слабку форму Гальоркіна, з трикутних функцій форми складаються матриці жорсткості елементів, застосовуються граничні умови, а з розв'язку відновлюються напруження за критерієм фон Мізеса — усе завершується робочим CST-розв'язувачем на JavaScript та порівнянням типів елементів у комерційних МСЕ-програмах.

1. Лінійна пружність та визначальні рівняння

Лінійна пружність припускає малі деформації, лінійний відгук матеріалу (закон Гука) та відсутність пластичної деформації. Рівняння рівноваги в 3D має вигляд:

Рівновага: ∂σ_ij/∂x_j + f_i = 0 (сума по j) Деформація–переміщення: ε_xx = ∂u/∂x, ε_yy = ∂v/∂y, γ_xy = ∂u/∂y + ∂v/∂x Закон Гука (плоский напружений стан, 2D): { σ_xx } E/(1−ν²) · [1 ν 0 ] { ε_xx } { σ_yy } = [ν 1 0 ] { ε_yy } { τ_xy } [0 0 (1−ν)/2 ] { γ_xy } D = E/(1−ν²) [1 ν 0; ν 1 0; 0 0 (1−ν)/2] Де: E = модуль Юнга, ν = коефіцієнт Пуассона (≈ 0.3 для сталі)

2. Слабка форма та метод Гальоркіна

Сильна форма: знайти u таке, що ∇·σ + f = 0 на Ω з u = ū на Γ_D (Діріхле) та σ·n = t̄ на Γ_N (Неймана) Помножити на пробну функцію v, проінтегрувати частинами: ∫_Ω ε(v)^T σ dΩ = ∫_Ω v·f dΩ + ∫_Γ_N v·t̄ dΓ Гальоркін: наблизити u ≈ Σ u_I · N_I(x) (той самий базис для u та v) N_I = функція форми для вузла I Матрична форма: K · u = f K_IJ = ∫_Ω B_I^T D B_J dΩ (матриця жорсткості) f_I = ∫_Ω N_I b dΩ + ∫_Γ_N N_I t̄ dΓ (вектор сил) B_I = [∂N_I/∂x 0 ] (оператор деформація–переміщення на вузол) [0 ∂N_I/∂y ] [∂N_I/∂y ∂N_I/∂x ]

3. Функції форми та ізопараметричні елементи

CST (трикутник зі сталою деформацією): найпростіший 2D-елемент, 3 вузли Площинні координати: N₁=ξ, N₂=η, N₃=1−ξ−η Деформація стала всередині елемента (звідси CST) LST (трикутник із лінійною деформацією): 6 вузлів (додає середини сторін), лінійна деформація Q4 (4-вузловий чотирикутник): білінійні функції форми N₁=(1−ξ)(1−η)/4, N₂=(1+ξ)(1−η)/4 N₃=(1+ξ)(1+η)/4, N₄=(1−ξ)(1+η)/4 (ξ,η ∈ [−1,1]) Ізопараметричне відображення: ті самі функції N відображають (ξ,η) → (x,y) x = Σ N_I(ξ,η) · x_I Якобіан: J = ∂(x,y)/∂(ξ,η) → B = J⁻¹ · ∂N/∂(ξ,η) Квадратура Гаусса для інтегрування: ∫ f(ξ,η)|J|dξdη ≈ Σ_g w_g · f(ξ_g, η_g) · |J(ξ_g,η_g)| Гаусс 2×2: ξ=±1/√3, w=1 (точно для лінійних задач Q4)

4. Матриця жорсткості елемента K_e

Для CST-елемента з вузлами (x₁,y₁),(x₂,y₂),(x₃,y₃): Площа A = ½|det[x₂−x₁ y₂−y₁; x₃−x₁ y₃−y₁]| b₁ = y₂−y₃, b₂ = y₃−y₁, b₃ = y₁−y₂ c₁ = x₃−x₂, c₂ = x₁−x₃, c₃ = x₂−x₁ B = (1/2A) [b₁ 0 b₂ 0 b₃ 0 ] (матриця 3×6) [0 c₁ 0 c₂ 0 c₃ ] [c₁ b₁ c₂ b₂ c₃ b₃ ] K_e = B^T · D · B · A · t (жорсткість елемента 6×6, t=товщина) Вузлові ступені вільності: кожен вузол має 2: [u₁ v₁ u₂ v₂ u₃ v₃] → K_e має розмір 6×6 для 2D-трикутника Для Q4: K_e = ∫₋₁¹∫₋₁¹ B(ξ,η)^T D B(ξ,η)|J| dξdη → 8×8

5. Глобальне складання та граничні умови

Складання: розподілити значення K_e в глобальну K за зв'язністю елементів Для кожного елемента e, кожної пари вузлів (I,J): K[dof_I][dof_J] += K_e[i][j] (додавання внесків) Глобальна K розріджена, симетрична, додатно напіввизначена Нумерація ступенів вільності: вузол i → глобальні ступені 2i, 2i+1 (для x, y) N вузлів → глобальна матриця жорсткості 2N × 2N Гранична умова Діріхле (зафіксоване переміщення = 0): Для зв'язаного ступеня d: задати K[d][d] = 1, K[d][j] = K[i][d] = 0, f[d] = ū_d (штрафний метод: натомість додати велике K p на діагональ — простіше реалізувати) Розв'язати: K u = f Прямий: факторизація Холецького (LAPACK dpotf2) для симетричних додатно визначених систем Ітеративний: метод спряжених градієнтів (PCG) для дуже великих систем

6. Відновлення напружень та критерій фон Мізеса

Напруження елемента з розв'язку u: σ_e = D · B · u_e (стале для CST-елемента) Еквівалентне напруження за фон Мізесом (критерій текучості): σ_VM = √(σ_xx² − σ_xx·σ_yy + σ_yy² + 3τ_xy²) Текучість при σ_VM ≥ σ_yield (250 MPa для конструкційної сталі) Усереднення вузлових напружень: кожен вузол спільний для кількох елементів σ_node = (1/V_node) Σ_e V_e · σ_e (середнє, зважене за об'ємом) Оцінювач похибки (Зенкевич-Чжу): η_e = ||σ_e − σ*_e|| / ||σ*|| де σ* — згладжене напруження η > поріг → подрібнити елемент (h-уточнення або p-уточнення) Збіжність: CST потребує дрібної сітки поблизу концентраторів напружень Похибка напружень ~ h^(p), де p=1 для CST, p=2 для LST

7. Розв'язувач CST-елементів на JavaScript

// Мінімальний 2D МСЕ для плоского напруженого стану з CST-трикутниками
class FEM2D {
  constructor(nodes, elements, E, nu, thickness = 1) {
    this.nodes    = nodes;    // [[x,y], ...] — вузли
    this.elements = elements; // [[n0,n1,n2], ...] — елементи
    this.t = thickness;
    this.D = planeStressD(E, nu);
    const ndof = 2 * nodes.length;
    this.K = Array.from({length: ndof}, () => new Float64Array(ndof));
    this.f = new Float64Array(ndof);
  }

  assemble() {
    for (const [n0, n1, n2] of this.elements) {
      const [Ke, Be, A] = cstElement(this.nodes[n0], this.nodes[n1],
                                         this.nodes[n2], this.D, this.t);
      const dofs = [2*n0, 2*n0+1, 2*n1, 2*n1+1, 2*n2, 2*n2+1];
      for (let i = 0; i < 6; i++)
        for (let j = 0; j < 6; j++)
          this.K[dofs[i]][dofs[j]] += Ke[i][j];
    }
  }

  applyFixed(nodeIndex, axis) { // axis: 0=x, 1=y // закріпити
    const d = 2 * nodeIndex + axis;
    const n = this.K.length;
    for (let j = 0; j < n; j++) this.K[d][j] = this.K[j][d] = 0;
    this.K[d][d] = 1;
    this.f[d] = 0;
  }

  applyForce(nodeIndex, fx, fy) {
    this.f[2*nodeIndex]   += fx;
    this.f[2*nodeIndex+1] += fy;
  }

  solve() { // Наївне виключення Гаусса (у продакшені використовуйте розріджений розв'язувач)
    const A = this.K.map(r => Array.from(r));
    const b = Array.from(this.f);
    const n = b.length;
    for (let p = 0; p < n; p++) {
      for (let i = p+1; i < n; i++) {
        const f = A[i][p] / A[p][p];
        for (let j = p; j < n; j++) A[i][j] -= f*A[p][j];
        b[i] -= f*b[p];
      }
    }
    const u = new Float64Array(n);
    for (let i = n-1; i >= 0; i--) {
      u[i] = b[i];
      for (let j = i+1; j < n; j++) u[i] -= A[i][j]*u[j];
      u[i] /= A[i][i];
    }
    return u;
  }
}

function planeStressD(E, nu) {
  const c = E / (1 - nu*nu);
  return [[c, c*nu, 0], [c*nu, c, 0], [0, 0, c*(1-nu)/2]];
}

function cstElement([x1,y1], [x2,y2], [x3,y3], D, t) {
  const A = 0.5 * Math.abs((x2-x1)*(y3-y1) - (x3-x1)*(y2-y1));
  const b = [y2-y3, y3-y1, y1-y2];
  const c = [x3-x2, x1-x3, x2-x1];
  // B має розмір 3×6
  const B = [
    [b[0],0,  b[1],0,  b[2],0  ],
    [0,  c[0],0,  c[1],0,  c[2]],
    [c[0],b[0],c[1],b[1],c[2],b[2]]
  ].map(row => row.map(v => v / (2*A)));
  // Ke = B^T D B A t  (6×6)
  const DB = matMul(D, B);  // 3×6
  const Ke = matMul(transpose(B), DB).map(row => row.map(v => v*A*t));
  return [Ke, B, A];
}

8. Типи елементів та програмне забезпечення

CST (T3)

3-вузловий трикутник, стала деформація. Простий у реалізації, потребує дуже дрібної сітки. Добрий для вивчення МСЕ.

LST (T6)

6-вузловий трикутник, лінійна деформація. Краща точність на елемент. Кращий для викривлених геометрій.

Q4 / Q8

4- або 8-вузловий чотирикутник. Q8 — робоча конячка комерційного МСЕ: точність другого порядку, інтегрування за Гауссом.

Hex20 (3D)

20-вузловий гексаедр, що використовується в Abaqus/Ansys для 3D механіки твердих тіл. Найточніший за співвідношенням на ступінь вільності.

Комерційні пакети МСЕ — Ansys, Abaqus, NASTRAN, LS-DYNA — додають контактну механіку, нелінійні матеріали, геометричну нелінійність, динамічний (модальний та перехідний) аналіз і мультифізичне поєднання. Серед відкритих альтернатив — FEniCS (Python, мова форм FEniCS), Code_Aster (загальний) та deal.II (шаблони C++ для адаптивних методів високого порядку).