Источник:
docs.sympy.org/latest/modules/physics/continuum_mechanics/beam_problems.html
Чтобы сделать этот документ более удобным для чтения, включите улучшенный (типографский) вывод:
from sympy import init_printing, symbols
x, y, z = symbols('x y z')
init_printing(use_unicode=True)Плоская балка — это конструктивный элемент, который воспринимает нагрузки за счёт сопротивления внутренним поперечным силам и изгибающим моментам. Свойства балки определяются её длиной, условиями закрепления, моментом инерции поперечного сечения и модулем упругости. В SymPy двумерная балка создаётся путём указания следующих параметров:
Длина (Length)
Модуль упругости (Elastic Modulus)
Момент инерции площади (Second Moment of Area)
Переменная (Variable): Символ, обозначающий координату вдоль длины балки. По умолчанию используется
Symbol(x).Граничные условия (Boundary Conditions)
bc_slope : Граничные условия для угла наклона.
bc_deflection : Граничные условия для прогиба.
Распределение нагрузки (Load Distribution)
После того как перечисленные выше параметры заданы, для вычисления полезной информации о нагруженной балке используются следующие методы:
solve_for_reaction_loads()shear_force()bending_moment()slope()
Ниже приведены примеры различных двумерных задач изгиба балок.
Пример 1¶
Консольная балка длиной 9 метров с постоянной распределённой нагрузкой 8 кН/м, приложенной на участке от 0 до 5 метров от заделки. На расстоянии 5 метров от заделки приложен против часовой стрелки момент 50 кН·м. На свободном конце балки приложена сосредоточенная нагрузка 12 кН вниз.
^
|
\\| 8 кН/м
\\|_________________
\\|| | | | | | | | | 12 кН
\\|V V V V V V V V V |
\\|________________|_______________V
\\| | |
\\o - - - - - - - -⭯ 50 кН·м - - - | - - -> x
\\|________________|_______________|
\\| :
\\|----------------|---------------|
5.0 м 4.0 мПримечание:
Пользователь может выбирать собственное правило знаков. В данном случае положительными считаются силы, направленные вниз, и момент, направленный против часовой стрелки.
Балка должна быть инициализирована длиной, модулем упругости и моментом инерции площади. Эти величины могут быть как символами, так и числами.
from sympy.physics.continuum_mechanics.beam import Beam
E, I = symbols('E, I')
b = Beam(9, E, I)Три нагрузки прикладываются к балке с помощью метода apply_load(). Этот метод поддерживает сосредоточенные силы, сосредоточенные моменты и полиномиально распределенные нагрузки любого порядка, т.е. :math:c, cx, cx^2, cx^3, ldots.
Сосредоточенная сила 12 кН направлена в отрицательном направлении, приложена в точке 9 метров, а полиномиальный порядок указан как -1:
b.apply_load(12, 9, -1)Затем для доступа к функции нагрузки в форме сингулярных функций можно использовать атрибут load:
b.loadАналогично, положительный момент может быть приложен с полиномиальным порядком -2:
b.apply_load(50, 5, -2)Распределенная нагрузка имеет порядок 0 и действует от x=0 до x=5:
b.apply_load(8, 0, 0, end=5)Защемленный конец накладывает два граничных условия: 1) отсутствие вертикального прогиба и 2) отсутствие угла поворота. Они задаются путём добавления кортежей из значений x и соответствующих значений прогиба или угла наклона:
b.bc_deflection.append((0, 0))
b.bc_slope.append((0, 0))Эти граничные условия приводят к появлению неизвестных реактивных силы и момента, которые необходимо приложить к балке для поддержания статического равновесия:
R, M = symbols('R, M')
b.apply_load(R, 0, -1)
b.apply_load(M, 0, -2)
b.loadЭти две переменные можно выразить через приложенные нагрузки, после чего можно отобразить итоговую нагрузку:
b.solve_for_reaction_loads(R, M)
b.reaction_loads
b.loadНа этом этапе балка полностью определена, и вычисляются внутренние поперечные силы и изгибающие моменты:
b.shear_force()b.bending_moment()Их можно визуализировать, вызвав соответствующие методы построения графиков:
b.plot_shear_force();
b.plot_bending_moment();

Под нагрузкой балка будет деформироваться, а угол наклона и прогиб можно определить с помощью:
b.slope()
b.deflection()Углы наклона и прогибы балки можно построить на графике при условии, что для модуля упругости и момента инерции заданы числовые значения:
b.plot_slope(subs={E: 20E9, I: 3.25E-6});
b.plot_deflection(subs={E: 20E9, I: 3.25E-6});

Все графики можно отобразить на одном рисунке с помощью:
b.plot_loading_results(subs={E: 20E9, I: 3.25E-6});
Пример 2¶
Имеется балка длиной 30 метров. На конце балки приложен момент величиной 120 Н·м в направлении против часовой стрелки. Сосредоточенная сила величиной 8 Н приложена к балке сверху в начальной точке. Под балкой расположены две шарнирно-неподвижные опоры. Одна на конце, а другая на расстоянии 10 метров от начала. Прогиб ограничен на обеих опорах.
|| 8 N ↺ 120 Nm
\/______________________________________________|
|_______________________________________________|
/\ /\
|------------|---------------------------------|
10 m 20 mfrom sympy.physics.continuum_mechanics.beam import Beam
from sympy import symbols
E, I = symbols('E, I')
R1, R2 = symbols('R1, R2')
b = Beam(30, E, I)
b.apply_load(8, 0, -1)
b.apply_load(R1, 10, -1)
b.apply_load(R2, 30, -1)
b.apply_load(120, 30, -2)
b.bc_deflection.append((10, 0))
b.bc_deflection.append((30, 0))
b.solve_for_reaction_loads(R1, R2)b.draw().show();
b.reaction_loads{R1: -18, R2: 10}b.loadb.shear_force()b.bending_moment()b.slope()b.deflection()b.plot_loading_results(subs={E: 20E9, I: 3.25E-6});
Пример 3¶
Балка длиной 6 метров имеет шарнирно-подвижную опору в начале и шарнирно-неподвижную опору в конце. Посередине балки приложен момент 1.5 кН·м против часовой стрелки. Равномерно распределенная нагрузка 3 кН/м и линейно возрастающая нагрузка с интенсивностью 1 кН/м/м приложены от середины до конца балки.
ramp load = 1 KN/m/m
constant load = 3 KN/m
|------------------------|
↺ 1.5 KN-m
______________________|________________________
|_______________________________________________|
o | /\
|----------------------|-----------------------|
3.0 m 3.0 mfrom sympy.physics.continuum_mechanics.beam import Beam
from sympy import symbols, plot, S
E, I = symbols('E, I')
R1, R2 = symbols('R1, R2')
b = Beam(6, E, I)
b.apply_load(R1, 0, -1)
b.apply_load(-S(3)/2, 3, -2)
b.apply_load(3, 3, 0)
b.apply_load(1, 3, 1)
b.apply_load(R2, 6, -1)
b.bc_deflection.append((0, 0))
b.bc_deflection.append((6, 0))
b.solve_for_reaction_loads(R1, R2)b.draw().show()
b.reaction_loads
{R1: -11/4, R2: -43/4}b.loadplot(b.load);
b.shear_force()b.bending_moment()b.slope()b.deflection()Пример 4¶
Консольная балка с вылетом длиной 8 метров имеет шарнирно-неподвижную опору на расстоянии 1 метр от начала и опирается на шарнирно-подвижную опору за 1 метр до другого конца. Она подвергается действию равномерно распределенной нагрузки 10 КН/м от начальной точки до точки, находящейся на расстоянии 2 метров от нее. Две сосредоточенные силы 20 КН и 8 КН приложены на расстоянии 5 метров и 7.5 метров от начальной точки соответственно.
---> x
|
v y
10 KN/m
_____________ 20 KN 8 KN
| | | | | | | | |
V V V V V V V V V
_______________________________________________
|_______________________________________________|
/\ O
|-----|------|-----------------|----------|--|--|
1m 1m 3m 2m .5m .5mfrom sympy.physics.continuum_mechanics.beam import Beam
from sympy import symbols
E,I,M,V = symbols('E I M V')
b = Beam(8, E, I)
E,I,R1,R2 = symbols('E I R1 R2')
b.apply_load(R1, 1, -1)
b.apply_load(R2, 7, -1)
b.apply_load(10, 0, 0, end=2)
b.apply_load(20, 5, -1)
b.apply_load(8, 7.5, -1)
b.solve_for_reaction_loads(R1, R2)
b.reaction_loads{R1: -26, R2: -22}b.draw().show()
b.loadb.shear_force()b.bending_moment()b.bc_deflection = [(1, 0), (7, 0)]b.slope()b.deflection()Пример 5¶
Консольная балка длиной 6 метров находится под действием направленной вниз равномерно распределенной нагрузки интенсивностью 4,0 кН/м, приложенной от начальной точки на участке длиной 2 метра. От середины и до конца балки приложена линейно возрастающая нагрузка с интенсивностью 1 кН/м/м. Сосредоточенная сила 12 кН приложена в том же направлении на расстоянии 4 метров от начала.
---> x .
| . |
v y 12 KN . | |
| . | | |
V . | | | |
\\\\| 4 KN/m . | | | | |
\\\\|___________ . 1 KN/m/m| |
\\\\|| | | | | | . V V V V V V V
\\\\|V V V V V V |---------------|
\\\\|________________________________
\\\\|________________________________|
\\\\| : : :
\\\\|----------|-----|----|----------|
2.0 m 1m 1m 2.0 mfrom sympy.physics.continuum_mechanics.beam import Beam
from sympy import symbols
E,I,M,V = symbols('E I M V')
b = Beam(6, E, I)
b.apply_load(V, 0, -1)
b.apply_load(M, 0, -2)
b.apply_load(4, 0, 0, end=2)
b.apply_load(12, 4, -1)
b.apply_load(1, 3, 1, end=6)
b.solve_for_reaction_loads(V, M)
b.reaction_loads{V: -49/2, M: 157/2}b.draw().show()
b.loadb.shear_force()b.bending_moment()b.bc_deflection = [(0, 0)]
b.bc_slope = [(0, 0)]
b.slope()b.deflection()Пример 6¶
Балка с консольным свесом длиной 11 метров нагружена равномерно распределенной нагрузкой 2 кН/м на участке от 2 до 6 метров от начальной точки. Она имеет шарнирное закрепление в начальной точке и опирается на катковую опору на расстоянии 8 метров от этого конца. Также на консольном конце приложен момент 5 кН·м, направленный против часовой стрелки.
2 KN/m ---> x
_________________ |
| | | | | | | | | v y
V V V V V V V V V ↺ 5 KN-m
____________________________________________________|
O____________________________________________________|
/ \ /\
|--------|----------------|----------|---------------|
2m 4m 2m 3mfrom sympy.physics.continuum_mechanics.beam import Beam
from sympy import symbols
R1, R2 = symbols('R1, R2')
E, I = symbols('E, I')
b = Beam(11, E, I)
b.apply_load(R1, 0, -1)
b.apply_load(2, 2, 0, end=6)
b.apply_load(R2, 8, -1)
b.apply_load(5, 11, -2)
b.solve_for_reaction_loads(R1, R2)
b.reaction_loads{R1: -37/8, R2: -27/8}b.draw().show()
b.loadb.shear_force()b.bending_moment()b.bc_deflection = [(0, 0), (8, 0)]
b.slope()b.deflection()Пример 7¶
Имеется балка длиной l, защемленная с обоих концов. В середине балки приложена сосредоточенная сила величиной F, направленная вниз.
^ y
|
---> x
\\\\| F |\\\\
\\\\| | |\\\\
\\\\| V |\\\\
\\\\|_____________________________________|\\\\
\\\\|_____________________________________|\\\\
\\\\| : |\\\\
\\\\| : |\\\\
\\\\|------------------|------------------|\\\\
l/2 l/2from sympy.physics.continuum_mechanics.beam import Beam
from sympy import symbols
E, I, F = symbols('E I F')
l = symbols('l', positive=True)
b = Beam(l, E, I)
R1,R2 = symbols('R1 R2')
M1, M2 = symbols('M1, M2')
b.apply_load(R1, 0, -1)
b.apply_load(M1, 0, -2)
b.apply_load(R2, l, -1)
b.apply_load(M2, l, -2)
b.apply_load(-F, l/2, -1)
b.bc_deflection = [(0, 0),(l, 0)]
b.bc_slope = [(0, 0),(l, 0)]
b.solve_for_reaction_loads(R1, R2, M1, M2)
b.reaction_loads{R1: F/2, R2: F/2, M1: -F*l/8, M2: F*l/8}b.draw().show()
b.loadb.shear_force()b.bending_moment()b.slope()b.deflection()Пример 8¶
Имеется балка длиной 4*l с шарнирной вставкой посередине. В начале она имеет жесткую заделку, а также две катковые опоры на расстоянии l и 4*l от начальной точки. Сосредоточенная сила P приложена на расстоянии 3*l от начальной точки.
---> x
\\\\| P |
\\\\| | v y
\\\\| V
\\\\|_____________________ _______________________
\\\\|_____________________O_______________________|
\\\\| /\ : /\
\\\\| oooo : oooo
\\\\|----------|-----------|----------|-----------|
l l l lfrom sympy.physics.continuum_mechanics.beam import Beam
from sympy import symbols
E, I = symbols('E I')
l = symbols('l', positive=True)
R1, M1, R2, R3, P = symbols('R1 M1 R2 R3 P')
b1 = Beam(2*l, E, I)
b2 = Beam(2*l, E, I)
b = b1.join(b2, "hinge")
b.apply_load(M1, 0, -2)
b.apply_load(R1, 0, -1)
b.apply_load(R2, l, -1)
b.apply_load(R3, 4*l, -1)
b.apply_load(P, 3*l, -1)
b.bc_slope = [(0, 0)]
b.bc_deflection = [(0, 0), (l, 0), (4*l, 0)]
b.solve_for_reaction_loads(M1, R1, R2, R3)
b.reaction_loads{M1: -P*l/4, R1: 3*P/4, R2: -5*P/4, R3: -P/2}b.draw().show()
b.loadb.shear_force()b.bending_moment()b.slope()b.deflection()Пример 9¶
Имеется консольная балка длиной 4 метра. На первых двух метрах ее момент инерции составляет 1.5*I, а на остальной части — I.
На ее свободном конце сверху приложена сосредоточенная сила величиной 20 Н.
---> x
\\\\| |
\\\\| 20 N v y
\\\\|________________ |
\\\\| |_______________V
\\\\| 1.5*I _______I_______|
\\\\|________________|
\\\\| :
\\\\|----------------|---------------|
2.0 m 2.0 mfrom sympy.physics.continuum_mechanics.beam import Beam
from sympy import symbols
E, I = symbols('E, I')
R1, R2 = symbols('R1, R2')
b1 = Beam(2, E, 1.5*I)
b2 = Beam(2, E, I)
b = b1.join(b2, "fixed")
b.apply_load(20, 4, -1)
b.apply_load(R1, 0, -1)
b.apply_load(R2, 0, -2)
b.bc_slope = [(0, 0)]
b.bc_deflection = [(0, 0)]
b.solve_for_reaction_loads(R1, R2)
b.loadb.draw().show()
b.shear_force()b.bending_moment()b.slope()Пример 10¶
Составная балка постоянной изгибной жесткости E*I образована присоединением балки длиной 2*l справа к другой балке длиной l. Вся балка защемлена с обоих концов. Сосредоточенная сила величиной P приложена сверху на расстоянии 2*l от начальной точки.
---> x
|
\\\\| P v y |\\\\
\\\\| | |\\\\
\\\\| V |\\\\
\\\\|____________ ________________________|\\\\
\\\\|____________O________________________|\\\\
\\\\| : : |\\\\
\\\\| : : |\\\\
\\\\|------------|------------|-----------|\\\\
l l lfrom sympy.physics.continuum_mechanics.beam import Beam
from sympy import symbols
E, I = symbols('E, I')
l = symbols('l', positive=True)
b1 = Beam(l ,E,I)
b2 = Beam(2*l ,E,I)
b = b1.join(b2,"hinge")
M1, A1, M2, A2, P = symbols('M1 A1 M2 A2 P')
b.apply_load(A1, 0, -1)
b.apply_load(M1, 0 ,-2)
b.apply_load(P, 2*l, -1)
b.apply_load(A2, 3*l, -1)
b.apply_load(M2, 3*l, -2)
b.bc_slope=[(0, 0), (3*l, 0)]
b.bc_deflection=[(0, 0), (3*l, 0)]
b.solve_for_reaction_loads(M1, A1, M2, A2)
b.reaction_loads{M1: 5*P*l/18, A1: -5*P/18, M2: -4*P*l/9, A2: -13*P/18}b.draw().show()
b.loadb.shear_force()b.bending_moment()b.slope()b.deflection()Пример 11¶
К балке может быть приложена нагрузка любого вида, заданная полиномом. Это позволяет аппроксимировать произвольные законы распределения нагрузки. В следующем примере показаны шесть усеченных полиномиальных нагрузок, приложенных по длине балки.
from sympy import Symbol
x = Symbol('x')
n = 6
b = Beam(10*n, E, I)
for i in range(n):
b.apply_load(1 / (5**i), 10*i + 5, i, end=10*i + 10)
plot(b.load, (x, 0, 10*n));
Пример 12¶
Та же балка, что и в Примере 10, но с использованием методов apply_rotation_hinge() и apply_support().
from sympy.physics.continuum_mechanics.beam import Beam
from sympy import symbols
E, I = symbols('E, I')
l = symbols('l', positive=True)
b = Beam(3*l, E, I)
r0,m0 = b.apply_support(0, type='fixed')
r3l,m3l = b.apply_support(3*l, type='fixed')
F = symbols('F')
p1 = b.apply_rotation_hinge(l)
b.apply_load(F, 2*l, -1)
b.solve_for_reaction_loads(r0,m0,r3l,m3l)
b.reaction_loads
b.draw().show()
b.loadb.shear_force()b.bending_moment()b.slope()b.deflection()Пример 13¶
Имеется балка длиной 3*l, защемленная с обоих концов. Сосредоточенная сила приложена на расстоянии l/3, а распределенная нагрузка q1 приложена на участке между 2*l и 3*l. Балка имеет скользящий шарнир, расположенный в точке l*5/2, заданный с помощью метода apply_sliding_hinge().
from sympy.physics.continuum_mechanics.beam import Beam
from sympy import symbols, Rational
E, I = symbols('E, I')
l = symbols('l', positive=True)
b = Beam(3*l, E, I)
r0, m0 = b.apply_support(0, type='fixed')
r3l, m3l = b.apply_support(3*l, type='fixed')
s1 = b.apply_sliding_hinge(l*Rational(5, 2))
P1, q1 = symbols('P1 q1')
b.apply_load(P1, l*Rational(1, 3), -1)
b.apply_load(q1, 2*l, 0, 3*l)
b.solve_for_reaction_loads(r0, r3l, m0, m3l)
b.reaction_loadsb.draw().show()
b.loadb.shear_force()b.bending_moment()b.slope()b.deflection()