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

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

Метод скінченних елементів (МСЕ) — це обчислювальний хребет фактично всієї сучасної структурної, теплової та гідравлічної інженерії. Він перетворює неперервне диференціальне рівняння на складній області у велику розріджену лінійну систему, поділяючи область на малі елементи, наближаючи розв'язок поліноміальними функціями форми та застосовуючи слабку форму Гальоркіна. У цій статті ми будуємо двовимірний розв'язувач МСЕ для плоского напруженого стану з нуля — від основ пружності до розрідженого складання та реалізації на 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++ для адаптивних методів високого порядку).