Расчёт фермы: система линейных уравнений

Когда узлов много, усилия удобно искать сразу — решая систему линейных уравнений.

Система уравнений равновесия фермы — набор из $2u$ линейных уравнений (по два на узел), неизвестные которого — усилия в стержнях и реакции опор.

Метод вырезания узлов вручную хорош для маленьких ферм. Но инженерный расчёт — это десятки стержней, и тогда выгоднее собрать одну систему линейных уравнений $A\,x = b$ и решить её. Здесь $x$ — вектор усилий, $A$ — матрица из направляющих косинусов стержней, $b$ — внешние нагрузки. В браузере нет numpy, поэтому решим систему методом Гаусса на чистом Python.

Метод Гаусса своими руками

Идея метода: прямым ходом приводим матрицу к треугольному виду (исключая неизвестные), обратным ходом находим решение снизу вверх. Для устойчивости на каждом шаге выбираем главный элемент (наибольший по модулю) — это частичный выбор ведущего элемента.

def solve(A, b):
    n = len(A)
    # рабочая копия расширенной матрицы
    M = [row[:] + [b[i]] for i, row in enumerate(A)]
    for col in range(n):
        # выбор ведущего элемента
        piv = max(range(col, n), key=lambda r: abs(M[r][col]))
        M[col], M[piv] = M[piv], M[col]
        pivot = M[col][col]
        for r in range(col + 1, n):
            f = M[r][col] / pivot
            for c in range(col, n + 1):
                M[r][c] -= f * M[col][c]
    x = [0.0] * n
    for i in range(n - 1, -1, -1):
        s = M[i][n] - sum(M[i][j] * x[j] for j in range(i + 1, n))
        x[i] = s / M[i][i]
    return x

# Пример: 3 уравнения, 3 неизвестных усилия
A = [[1, 0, 0.5],
     [0, 1, 0.866],
     [0, 0, 1.0]]
b = [0.0, 0.0, 1000.0]
x = solve(A, b)
print("усилия:", [round(v, 1) for v in x])

Вывод:

усилия: [-500.0, -866.0, 1000.0]

От ручного счёта к матрицам

Переход от метода узлов к системе уравнений — это в миниатюре история всей вычислительной механики. Пока ферма мала, человек решает её карандашом, узел за узлом. Но реальные конструкции — это сотни и тысячи стержней, и проходить их вручную немыслимо. Тогда задачу формулируют как $A x = b$ и поручают компьютеру. Современные программы расчёта конструкций (так называемый метод конечных элементов) — это прямое развитие той же идеи: вся конструкция описывается одной большой системой линейных уравнений, где неизвестные — перемещения и усилия, а матрица собирается из вкладов отдельных элементов. Научившись решать систему уравнений фермы методом Гаусса, вы понимаете ядро того, что внутри происходит в любом инженерном пакете. Разница лишь в масштабе: принцип сборки матрицы из направляющих косинусов и её решения остаётся тем же.

Сборка матрицы фермы

Для каждого стержня, входящего в узел, его вклад в уравнения узла — это направляющие косинусы $\cos\theta$ (в уравнение $\sum F_x$) и $\sin\theta$ (в $\sum F_y$), где $\theta$ — угол стержня. Если стержень соединяет узлы с координатами $(x_1, y_1)$ и $(x_2, y_2)$, то

$$\cos\theta = \frac{x_2 - x_1}{\ell}, \qquad \sin\theta = \frac{y_2 - y_1}{\ell}, \qquad \ell = \sqrt{(x_2-x_1)^2 + (y_2-y_1)^2}.$$

Каждое усилие $N_k$ входит в уравнения двух своих узлов с противоположными знаками — так выражается, что стержень тянет оба конца к себе (или отталкивает).

Как работает под капотом

Метод Гаусса — это систематизированное исключение переменных, то самое, что мы делали вручную в методе узлов, выбирая «удачное» уравнение. Выбор ведущего элемента нужен, чтобы не делить на крошечное число: при малом ведущем элементе ошибки округления раздуваются. Сложность метода — порядка $n^3$ операций, что для ферм из десятков стержней мгновенно. Если определитель матрицы равен нулю, система вырождена — это сигнал, что ферма геометрически изменяема (механизм) или статически неопределима, то есть расчёт усилий некорректно поставлен.

Частые ошибки

  • Не выбирать ведущий элемент и получать деление на ноль или потерю точности.
  • Путать знаки вкладов усилия в двух узлах: в одном $+\cos\theta$, в другом $-\cos\theta$.
  • Неверно считать длину стержня и, как следствие, направляющие косинусы.
  • Игнорировать вырожденность матрицы — признак, что схема не является фермой.

Итог

  • Большие фермы считают как систему $A x = b$ из $2u$ уравнений.
  • Метод Гаусса с выбором ведущего элемента решает её на чистом Python.
  • Коэффициенты — направляющие косинусы стержней $\cos\theta$, $\sin\theta$.
  • Вырожденная матрица — сигнал об изменяемой или неопределимой схеме.
Проверьте себя
1. Зачем в методе Гаусса выбирают ведущий (главный) элемент?
AЧтобы ускорить вычисления
BЧтобы избежать деления на малое число и потери точности
CЧтобы матрица стала симметричной
DЭто необязательный шаг без эффекта
2. Что означают коэффициенты матрицы A при усилиях в стержнях?
AДлины стержней
BНаправляющие косинусы стержней (cosθ, sinθ)
CКоординаты узлов
DМассы стержней
3. Матрица системы оказалась вырожденной (определитель ноль). О чём это говорит?
AФерма очень прочная
BВсе усилия равны нулю
CСхема геометрически изменяема или неопределима — задача поставлена некорректно
DНужно добавить нагрузку