Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

1.8. Решение задач изгиба балок с использованием сингулярных функций

Источник: 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
Loading...

Аналогично, положительный момент может быть приложен с полиномиальным порядком -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
Loading...

Эти две переменные можно выразить через приложенные нагрузки, после чего можно отобразить итоговую нагрузку:

b.solve_for_reaction_loads(R, M)
b.reaction_loads
b.load
Loading...

На этом этапе балка полностью определена, и вычисляются внутренние поперечные силы и изгибающие моменты:

b.shear_force()
Loading...
b.bending_moment()
Loading...

Их можно визуализировать, вызвав соответствующие методы построения графиков:

b.plot_shear_force();
b.plot_bending_moment();
<Figure size 640x480 with 1 Axes>
<Figure size 640x480 with 1 Axes>

Под нагрузкой балка будет деформироваться, а угол наклона и прогиб можно определить с помощью:

b.slope()
b.deflection()
Loading...

Углы наклона и прогибы балки можно построить на графике при условии, что для модуля упругости и момента инерции заданы числовые значения:

b.plot_slope(subs={E: 20E9, I: 3.25E-6});
b.plot_deflection(subs={E: 20E9, I: 3.25E-6});
<Figure size 640x480 with 1 Axes>
<Figure size 640x480 with 1 Axes>

Все графики можно отобразить на одном рисунке с помощью:

b.plot_loading_results(subs={E: 20E9, I: 3.25E-6});
<Figure size 640x480 with 4 Axes>

Пример 2

Имеется балка длиной 30 метров. На конце балки приложен момент величиной 120 Н·м в направлении против часовой стрелки. Сосредоточенная сила величиной 8 Н приложена к балке сверху в начальной точке. Под балкой расположены две шарнирно-неподвижные опоры. Одна на конце, а другая на расстоянии 10 метров от начала. Прогиб ограничен на обеих опорах.

|| 8 N                                       ↺ 120 Nm
\/______________________________________________|
|_______________________________________________|
            /\                                 /\
|------------|---------------------------------|
    10 m                  20 m
from 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();
<Figure size 640x480 with 1 Axes>
b.reaction_loads
{R1: -18, R2: 10}
b.load
Loading...
b.shear_force()
Loading...
b.bending_moment()
Loading...
b.slope()
Loading...
b.deflection()
Loading...
b.plot_loading_results(subs={E: 20E9, I: 3.25E-6});
<Figure size 640x480 with 4 Axes>

Пример 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 m
from 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
<Figure size 640x480 with 1 Axes>
{R1: -11/4, R2: -43/4}
b.load
Loading...
plot(b.load);
<Figure size 640x480 with 1 Axes>
b.shear_force()
Loading...
b.bending_moment()
Loading...
b.slope()
Loading...
b.deflection()
Loading...

Пример 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 .5m
from 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()
<Figure size 640x480 with 1 Axes>
b.load
Loading...
b.shear_force()
Loading...
b.bending_moment()
Loading...
b.bc_deflection = [(1, 0), (7, 0)]
b.slope()
Loading...
b.deflection()
Loading...

Пример 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 m
from 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()
<Figure size 640x480 with 1 Axes>
b.load
Loading...
b.shear_force()
Loading...
b.bending_moment()
Loading...
b.bc_deflection = [(0, 0)]
b.bc_slope = [(0, 0)]
b.slope()
Loading...
b.deflection()
Loading...

Пример 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            3m
from 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()
<Figure size 640x480 with 1 Axes>
b.load
Loading...
b.shear_force()
Loading...
b.bending_moment()
Loading...
b.bc_deflection = [(0, 0), (8, 0)]
b.slope()
Loading...
b.deflection()
Loading...

Пример 7

Имеется балка длиной l, защемленная с обоих концов. В середине балки приложена сосредоточенная сила величиной F, направленная вниз.

                                      ^ y
                                      |
                                      ---> x
\\\\|                  F                  |\\\\
\\\\|                  |                  |\\\\
\\\\|                  V                  |\\\\
\\\\|_____________________________________|\\\\
\\\\|_____________________________________|\\\\
\\\\|                  :                  |\\\\
\\\\|                  :                  |\\\\
\\\\|------------------|------------------|\\\\
             l/2                l/2
from 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()
<Figure size 640x480 with 1 Axes>
b.load
Loading...
b.shear_force()
Loading...
b.bending_moment()
Loading...
b.slope()
Loading...
b.deflection()
Loading...

Пример 8

Имеется балка длиной 4*l с шарнирной вставкой посередине. В начале она имеет жесткую заделку, а также две катковые опоры на расстоянии l и 4*l от начальной точки. Сосредоточенная сила P приложена на расстоянии 3*l от начальной точки.

                                                   ---> x
\\\\|                                 P            |
\\\\|                                 |            v y
\\\\|                                 V
\\\\|_____________________ _______________________
\\\\|_____________________O_______________________|
\\\\|          /\                     :          /\
\\\\|         oooo                    :         oooo
\\\\|----------|-----------|----------|-----------|
         l           l          l            l
from 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()
<Figure size 640x480 with 1 Axes>
b.load
Loading...
b.shear_force()
Loading...
b.bending_moment()
Loading...
b.slope()
Loading...
b.deflection()
Loading...

Пример 9

Имеется консольная балка длиной 4 метра. На первых двух метрах ее момент инерции составляет 1.5*I, а на остальной части — I. На ее свободном конце сверху приложена сосредоточенная сила величиной 20 Н.

                                           ---> x
\\\\|                                      |
\\\\|                               20 N   v y
\\\\|________________                |
\\\\|                |_______________V
\\\\|      1.5*I      _______I_______|
\\\\|________________|
\\\\|                                :
\\\\|----------------|---------------|
           2.0 m            2.0 m
from 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.load
Loading...
b.draw().show()
<Figure size 640x480 with 1 Axes>
b.shear_force()
Loading...
b.bending_moment()
Loading...
b.slope()
Loading...

Пример 10

Составная балка постоянной изгибной жесткости E*I образована присоединением балки длиной 2*l справа к другой балке длиной l. Вся балка защемлена с обоих концов. Сосредоточенная сила величиной P приложена сверху на расстоянии 2*l от начальной точки.

                                      ---> x
                                      |
\\\\|                         P       v y |\\\\
\\\\|                         |           |\\\\
\\\\|                         V           |\\\\
\\\\|____________ ________________________|\\\\
\\\\|____________O________________________|\\\\
\\\\|            :            :           |\\\\
\\\\|            :            :           |\\\\
\\\\|------------|------------|-----------|\\\\
         l            l            l
from 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()
<Figure size 640x480 with 1 Axes>
b.load
Loading...
b.shear_force()
Loading...
b.bending_moment()
Loading...
b.slope()
Loading...
b.deflection()
Loading...

Пример 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));
<Figure size 640x480 with 1 Axes>

Пример 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()
<Figure size 640x480 with 1 Axes>
b.load
Loading...
b.shear_force()
Loading...
b.bending_moment()
Loading...
b.slope()
Loading...
b.deflection()
Loading...

Пример 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_loads
Loading...
b.draw().show()
<Figure size 640x480 with 1 Axes>
b.load
Loading...
b.shear_force()
Loading...
b.bending_moment()
Loading...
b.slope()
Loading...
b.deflection()
Loading...