Теоретические основы, аналитическое составление расчетных уравнений и матричная СЛАУ
Проекция силы на ось — скалярная величина, равная произведению модуля силы на косинус угла между направлением вектора силы и положительным направлением оси:
b = c · cos(α) ⇒ Fx = ± F · cos(α) a = c · sin(α) ⇒ Fy = ± F · sin(α)Система сил называется сходящейся, если линии действия всех сил пересекаются в одной точке (в шарнирном узле).
Необходимым и достаточным условием статического равновесия плоской системы сходящихся сил является равенство нулю векторной суммы всех сил (главного вектора): ∑ Fi = 0. В аналитической форме это выражается двумя скалярными уравнениями проекций на произвольные непараллельные координатные оси Ox и Oy:
Для каждого узла плоской фермы составляются строго два уравнения равновесия. Поэтому на каждом шаге расчета вырезается узел, содержащий не более двух стержней с неизвестными усилиями.
Конструкция закреплена на жестком основании шарнирами E, D, C и нагружена в шарнире A горизонтальной силой P = 100 кН. Заданы геометрические углы: ∠DFA = 135°, ∠ABD = 60°, ∠DCB = 60°, ∠BDC = 30°, ∠DFE = 30°.
A · S = B наглядно раскрывает внутреннюю механику работы решателей (solvers):
det(A) ≠ 0 напрямую связано с кинематической неизменяемостью рассчитываемой оснастки или станины.Начинаем с узла A, так как к нему подходят только два стержня AB и AF. Для упрощения уравнений ось y направляем вдоль стержня AB, а ось x — перпендикулярно ей.
Уравнения равновесия узла A:
К узлу F подходят три стержня. Усилие SAF уже известно из предыдущего узла. Проекции составляются на традиционные оси декартовой системы:
Уравнения равновесия узла F:
Для узла B координатные оси направляются вдоль стержней BD (ось x) и BC (ось y). Стержень AB составляет с продолжением оси y угол 30°.
Уравнения равновесия узла B:
При автоматизации статического расчета шарнирно-стержневых конструкций на языке Julia в среде Engee инженер может применить один из двух фундаментальных подходов к построению алгоритма:
Данный подход алгоритмически повторяет классический ручной метод вырезания узлов. Расчет организуется как последовательное решение отдельных систем уравнений размерности 2 × 2 по цепочке: от узла с двумя неизвестными к последующим узлам.
A_A * S_A = B_A), из которой определяются усилия SAF и SAB. Полученные скалярные величины подставляются в правые части уравнений следующих узлов (F, затем B).Второй, более строгий и универсальный с инженерной точки зрения подход заключается в объединении уравнений проекций всех подвижных шарниров в единую глобальную систему линейных алгебраических уравнений:
где:
6 × 6, строки которой соответствуют уравнениям проекций (2 уравнения на каждый из 3 внутренних узлов):
| cos(15°) | 0 | 0 | 0 | 0 | 0 |
| -sin(15°) | 1 | 0 | 0 | 0 | 0 |
| cos(45°) | 0 | -sin(30°) | 0 | 0 | 0 |
| sin(45°) | 0 | -cos(30°) | -1 | 0 | 0 |
| 0 | sin(30°) | 0 | 0 | 1 | 0 |
| 0 | -cos(30°) | 0 | 0 | 0 | 1 |
Влияние выбора на программный код: При пошаговом расчете скрипт содержит несколько последовательных вызовов решения локальных систем, тогда как при глобальном матричном методе весь расчет выполняется компактно и векторно в одну строчку через встроенный оператор левого деления Julia:
| Стержень | Усилие S, кН | Характер работы |
|---|---|---|
| AF | +51.76 | Растяжение |
| AB | -73.21 | Сжатие |
| FE | +73.21 | Растяжение |
| FD | -26.79 | Сжатие |
| DB | +36.60 | Растяжение |
| BC | -63.40 | Сжатие |
Для проверки правильности найденных усилий мысленно отделяем конструкцию от основания горизонтальным сечением. Действие рассеченных стержней FE, FD, DB и BC заменяем соответствующими силами, направленными по внешним нормалям к сечениям стержней (вниз к неподвижным опорам).
Для проверки правильности решения составляются уравнения проекций всех сил, приложенных к отсеченной конструкции, на глобальные оси Ox и Oy:
Подставляем найденные численные значения усилий:
Тождественное обращение сумм проекций в ноль строго подтверждает статическую уравновешенность фермы и безошибочность расчета всех усилий.
В условиях вариантов индивидуальных заданий указаны только углы между стержнями и не заданы линейные размеры (длины элементов). В соответствии с законами геометрического подобия, распределение усилий в статически определимой ферме не зависит от масштаба (абсолютных длин стержней), а определяется исключительно их взаимной угловой ориентацией.
Методика геометрического построения расчетной схемы:
Перед переходом к программному расчету на Julia в среде Engee необходимо выполнить фундаментальную проверку системы уравнений на корректность и статическую разрешимость.
1. Критерий статической определимости фермы:
Для системы из K рассчитываемых подвижных шарниров число независимых скалярных уравнений статики равно 2 × K. Чтобы система имела единственное решение, число неизвестных усилий N (число стержней) должно строго равняться числу уравнений:
В рассматриваемом классе задач: 3 внутренних узла (A, F, B) × 2 уравнения = 6 уравнений, что в точности соответствует 6 неизвестным усилиям стержней.
2. Теорема Кронекера — Капелли:
Система линейных уравнений A · S = B совместна (имеет хотя бы одно решение) тогда и только тогда, когда ранг основной матрицы A равен рангу расширенной матрицы [A | B]:
Для того чтобы решение было единственным (конструкция является кинематически неизменяемой жесткой фермой, а не механизмом со степенями свободы), ранг матрицы должен быть полным и равняться числу неизвестных:
det(A) = 0), а ранг окажется меньше числа стержней. В среде Julia оператор A \ B в этом случае выдаст предупреждение о вырожденности матрицы (SingularMatrixException). Всегда проверяйте равенство количества уравнений числу неизвестных и полноту ранга матрицы.
Наиболее распространенная алгоритмическая ошибка при первом написании расчетных программ — передача градусов в функции, ожидающие радианы.
В языке Julia (как и в большинстве вычислительных сред) базовые тригонометрические функции cos(x) и sin(x) принимают аргумент исключительно в радианах. Так, выражение cos(30) вернет 0.15425... вместо ожидаемого 0.86602..., что приведет к полностью неверному расчету усилий.
cosd(30) → возвращает 0.866025...sind(30) → возвращает 0.5cos(deg2rad(30)). Применение функций cosd() и sind() исключает промежуточное накопление погрешностей округления числа π.
Чтобы не запутаться со знаками и индексами при сведении уравнений в матрицу 6 × 6, строго придерживайтесь следующего инженерного алгоритма:
S = [S_AB, S_AC, S_AD, S_BD, S_BC, S_CD]. Номер столбца матрицы A навсегда закрепляется за соответствующим стержнем.∑ S_i · cos(α_i) = -P_x).После составления расчетных уравнений сверьте правильность вашей аналитической модели с контрольными эталонными ответами заданий (все усилия приведены в кН; знак «+» — растяжение, знак «−» — сжатие):
| № вар. | P, кН | SAB | SAC (или SAD) | SBD | SBC | SCD | SCE |
|---|---|---|---|---|---|---|---|
| 1 | 1 | -1.115 | -0.816 | -0.558 | +0.966 | -0.472 | -0.106 |
| 2 | 2 | +1.414 | -1.414 | +1.000 | -1.000 | +0.732 | -1.932 |
| 3 | 3 | +2.196 | -1.553 | -3.804 | +2.196 | +5.660 | -3.928 |
| 4 | 4 | +2.828 | -2.828 | -2.000 | +2.000 | -3.464 | +2.000 |
| 5 | 5 | +8.660 | -10.000 | -17.321 | +15.000 | +7.500 | +12.990 |
| 6 | 6 | -5.379 | -4.392 | -7.608 | +10.392 | -7.856 | +5.321 |
| 7 | 7 | +5.715 | -2.092 | -4.950 | +2.858 | -2.475 | +1.429 |
| 8 | 8 | +5.657 | -5.657 | -4.000 | +4.000 | -3.586 | +2.928 |
| 9 | 9 | +9.000 | -12.728 | +9.000 | 0.000 | -8.069 | +6.588 |
| 10 | 10 | +17.321 | -20.000 | +20.000 | -10.000 | -34.641 | +40.000 |
Примечание: Небольшие расхождения в третьем знаке после запятой (±0.002 кН) допустимы и обусловлены промежуточными округлениями тригонометрических функций при ручном счете.
00 - Начало работы (Engee Старт) и выполните ячейку инициализации окружения (для проверки подключения библиотек и ядра Julia).Lab1_Truss_Фамилия.ipynb, в котором на занятии будет реализован программный расчет фермы.Для выполнения лабораторной работы нет необходимости проходить все интерактивные курсы целиком. Достаточно изучить 4 ключевых блока (ориентировочное время прохождения — 1–1.5 часа суммарно):
sin, cos, sqrt) и работа с числовой константой pi.
@variables S_AF S_AB ... без предварительного присвоения им чисел, формирование аналитических зависимостей.
~ (тильда, например: eq1 = ... ~ 0) и нахождение корней СЛАУ штатной функцией Symbolics.solve_for([уравнения], [переменные]).
Реализация статического анализа: аналитический (символьный) метод и матричный метод СЛАУ
Сценарий расчета реализуется в интерактивном скрипте Engee (Notebook). Программа вводится последовательно секторами. После записи каждого сектора выполняется его компиляция (сочетание клавиш Shift + Enter) с проверкой отсутствия ошибок в окне вывода.
Загрузка модуля аналитических вычислений Symbolics, обеспечивающего работу с нечисловыми переменными и решение символьных систем уравнений.
using SymbolicsUndefVarError: Symbolics not defined, дождитесь завершения начальной инициализации ядра Julia (индикатор выполнения ячейки должен смениться с [*] на порядковый номер).Ввод числовых значений внешних нагрузок согласно индивидуальному расчетному варианту.
# ИСХОДНЫЕ ДАННЫЕ P = 100.0 # Модуль сосредоточенной силы, кН
100.0 (запятая интерпретирует выражение как кортеж).Определение буквенных неизвестных для усилий в стержнях фермы с помощью макроса @variables.
# Объявление символьных неизвестных усилий @variables S_AF S_AB S_FE S_FD S_DB S_BC
@variables разделяются исключительно пробелами (без запятых).S_AB и s_ab являются программно разными идентификаторами.Запись шести скалярных уравнений статического равновесия внутренних шарниров с использованием оператора символьного равенства ~ и тригонометрических функций для углов в градусах cosd(), sind().
# Узел A eq1 = S_AF * cosd(15) - P * sind(30) ~ 0 eq2 = -S_AF * sind(15) + S_AB + P * cosd(30) ~ 0 # Узел F eq3 = -S_FE * sind(30) + S_AF * cosd(45) ~ 0 eq4 = -S_FE * cosd(30) - S_FD + S_AF * sind(45) ~ 0 # Узел B eq5 = S_DB + S_AB * sind(30) ~ 0 eq6 = S_BC - S_AB * cosd(30) ~ 0 # Решение системы уравнений eqs = [eq1, eq2, eq3, eq4, eq5, eq6] vars = [S_AF, S_AB, S_FE, S_FD, S_DB, S_BC] sol = Symbolics.solve_for(eqs, vars)
~ 0. Использование одиночного знака = вызовет ошибку синтаксиса.* обязателен между скаляром и функцией: пишите P * sind(30), а не Psind(30).d у функций cosd, sind (расчет в градусах).Приведение символьных корней к числовому формату с плавающей точкой Float64, вывод результатов и статическая проверка равновесия отсеченной фермы по уравнениям проекций на глобальные оси.
# Преобразование корней в формат Float64 S_AF_val = Float64(sol[1]) S_AB_val = Float64(sol[2]) S_FE_val = Float64(sol[3]) S_FD_val = Float64(sol[4]) S_DB_val = Float64(sol[5]) S_BC_val = Float64(sol[6]) # Вывод найденных усилий println("S_AF = ", round(S_AF_val, digits=3), " кН") println("S_AB = ", round(S_AB_val, digits=3), " кН") println("S_FE = ", round(S_FE_val, digits=3), " кН") println("S_FD = ", round(S_FD_val, digits=3), " кН") println("S_DB = ", round(S_DB_val, digits=3), " кН") println("S_BC = ", round(S_BC_val, digits=3), " кН") # Уравнения статической проверки конструкции в целом Fx = -S_FE_val * cosd(60) - S_DB_val * cosd(30) + S_BC_val * cosd(60) + P Fy = -S_FE_val * sind(60) - S_FD_val - S_DB_val * sind(30) - S_BC_val * sind(60) println("Fx = ", round(Fx, digits=4)) println("Fy = ", round(Fy, digits=4))
Fx и Fy должны быть равны 0.0. Наличие невязки свидетельствует об ошибке в знаках проекций при составлении уравнений проверки.Подключение стандартного модуля LinearAlgebra для выполнения матричных декомпозиций и анализа ранга системы.
using LinearAlgebraВвод внешней нагрузки и формирование матрицы направляющих косинусов A [6×6] и вектора внешних сил B [6×1]. Порядок столбцов матрицы строго соответствует вектору усилий: [S_AF, S_AB, S_FE, S_FD, S_DB, S_BC].
# ИСХОДНЫЕ ДАННЫЕ P = 100.0 # Матрица коэффициентов A [6x6] A = [ cosd(15) 0.0 0.0 0.0 0.0 0.0 ; -sind(15) 1.0 0.0 0.0 0.0 0.0 ; cosd(45) 0.0 -sind(30) 0.0 0.0 0.0 ; sind(45) 0.0 -cosd(30) -1.0 0.0 0.0 ; 0.0 sind(30) 0.0 0.0 1.0 0.0 ; 0.0 -cosd(30) 0.0 0.0 0.0 1.0 ] # Вектор узловых нагрузок B B = [ P * sind(30) ; -P * cosd(30) ; 0.0 ; 0.0 ; 0.0 ; 0.0 ]
;. Количество элементов в каждой строке должно быть строго равно 6.0.0.B меняют математический знак на противоположный.Вычисление определителя и ранга матрицы коэффициентов по теореме Кронекера — Капелли для подтверждения статической определимости системы.
d = det(A) r = rank(A) println("det(A) = ", round(d, digits=4)) println("rank(A) = ", r) if r != 6 || isapprox(d, 0.0, atol=1e-6) error("Матрица вырождена: система геометрически изменяема.") end
rank(A) должно строго равняться 6. Меньшее значение означает линейную зависимость составленных уравнений.Нахождение вектора неизвестных усилий за одну системную операцию через оператор левого деления \ (факторизация методом Гаусса с выбором главного элемента).
# Нахождение вектора усилий S S = A \ B # Извлечение усилий стержней S_AF = S[1] S_AB = S[2] S_FE = S[3] S_FD = S[4] S_DB = S[5] S_BC = S[6] println("S_AF = ", round(S_AF, digits=3), " кН") println("S_AB = ", round(S_AB, digits=3), " кН") println("S_FE = ", round(S_FE, digits=3), " кН") println("S_FD = ", round(S_FD, digits=3), " кН") println("S_DB = ", round(S_DB, digits=3), " кН") println("S_BC = ", round(S_BC, digits=3), " кН")
\ (левое деление $A^{-1}B$). Прямой слэш / означает правое деление ($BA^{-1}$) и вызовет несовпадение размерностей.Вычисление невязок статических уравнений проекций сил на оси глобальной координатной системы отсеченной конструкции.
# Уравнения статической проверки Fx = -S_FE * cosd(60) - S_DB * cosd(30) + S_BC * cosd(60) + P Fy = -S_FE * sind(60) - S_FD - S_DB * sind(30) - S_BC * sind(60) println("Fx = ", round(Fx, digits=4)) println("Fy = ", round(Fy, digits=4))
Fx и Fy строго равны 0.0.Статический расчет фермы в SolidWorks Simulation, общий алгоритм: