Перейти к содержанию

М3 §1. Давление: почему кнопка входит, а палец — нет

Вопросы к М3 §1

Кнопку в доску вы вдавливаете пальцем. Сила у пальца и у острия кнопки одна и та же — та, которую вы приложили. Но доска пропускает металлическое остриё и не пропускает палец. Значит, дело не только в силе.

Вот вопросы, на которые отвечает эта глава.

  1. Почему одна и та же сила в одном случае оставляет вмятину, а в другом не оставляет следа?
  2. Человек в 70 кг на лыжах по снегу идёт, а без лыж проваливается. Что изменилось, если масса та же?
  3. Стеллаж стоит на четырёх ножках. По какой площади он давит на пол — по всему прямоугольнику под ним или только по металлу ножек? Разница между этими двумя ответами оказывается стократной.
  4. Сколько квадратных сантиметров в квадратном метре? Ответьте себе прямо сейчас и запомните свой ответ: именно на этом месте разваливается половина расчётов давления.
  5. Как заставить программу считать давление под опорой любой формы — и как заставить её отказаться считать, когда данные бессмысленны?

Связка трёх миров здесь такая. Явление — сила, распределённая по площади: результат зависит не от одной силы, а от отношения силы к площади. Аппарат — планиметрия: чтобы получить это отношение, надо уметь считать площадь прямоугольника, треугольника и круга и переводить единицы площади, а переводятся они не так, как единицы длины. Инструмент — калькулятор давления: программа, которая по названию формы опоры выбирает формулу, переводит размеры в метры, делит силу на площадь и отказывается работать с бессмысленным вводом.


М3 §1.1. Физика: кнопка и палец

Вы прижимаете кнопку к доске с силой 10 Н — это примерно вес килограммового пакета крупы. Сила одна, а мест соприкосновения два: сверху — подушечка пальца, снизу — металлическое остриё.

Площадь, которой палец касается шляпки, — примерно квадратный сантиметр. Площадь острия — примерно десятая доля квадратного миллиметра. Чтобы делить силу на площадь, обе площади нужны в квадратных метрах; переводятся они так:

\[1\ \text{см}^2 = 1 \cdot 10^{-4}\ \text{м}^2, \qquad 0{,}1\ \text{мм}^2 = 0{,}1 \cdot 10^{-6}\ \text{м}^2 = 1 \cdot 10^{-7}\ \text{м}^2.\]

Пока примите эти множители как данные: откуда берётся именно \(10^{-4}\), а не \(10^{-2}\), и почему в квадратном метре не сто квадратных сантиметров — разбираем в §1.4. Площади, как видно, различаются в тысячу раз.

Разделим силу на площадь:

  • под пальцем: \(10 : 10^{-4} = 10^5\), то есть 100 000 «ньютонов на квадратный метр»;
  • под остриём: \(10 : 10^{-7} = 10^8\), то есть 100 000 000 «ньютонов на квадратный метр».

Горизонтальная опора, на ней два тела. Слева широкое тело с подписью «палец», к нему вниз направлена стрелка силы 10 Н, рядом надпись «S ≈ 1 см², p ≈ 100 кПа». Справа узкое тело с подписью «остриё кнопки», к нему вниз направлена такая же стрелка силы 10 Н, рядом надпись «S ≈ 0,1 мм², p ≈ 100 МПа».

Одна и та же сила 10 Н: площади различаются в тысячу раз — и давления тоже

Отношение силы к площади и есть та величина, которая решает, войдёт остриё в доску или нет. Дерево выдерживает сотню тысяч ньютонов на квадратный метр и не выдерживает сотни миллионов. Сила при этом не менялась ни разу.


Давление

Давление — физическая величина, равная отношению силы, действующей перпендикулярно поверхности, к площади этой поверхности:

\[p = \frac{F}{S}\]

Здесь \(F\) — сила в ньютонах, \(S\) — площадь в квадратных метрах, \(p\) — давление.

Единица давления в СИ называется паскаль и обозначается Па:

\[1\ \text{Па} = 1\ \frac{\text{Н}}{\text{м}^2}\]

Один паскаль — очень мало: это сила в один ньютон, размазанная по целому квадратному метру. Лист бумаги, лежащий на столе, давит примерно на 1 Па. Поэтому в расчётах постоянно появляются приставки, знакомые по М1 §1: 1 кПа = 10³ Па, 1 МПа = 10⁶ Па. Давление пальца из предыдущего расчёта — 100 кПа, давление острия — 100 МПа.

О букве \(S\). Заглавной \(S\) в курсе уже обозначена функция следования \(S(n)\) из раздела о натуральных числах. Спутать их трудно: у той всегда есть аргумент в скобках. Площадь мы пишем просто \(S\), без скобок; строчная \(s\) остаётся за путём и в этой главе не встречается.

Ещё одно замечание, важное на будущее. Сила — вектор: у неё есть направление, и складываются силы по правилу треугольника (М2 §1). Давление — скаляр: это просто число с единицей, у давления нет направления. Разделив вектор силы на площадь, мы намеренно оставили от силы только её модуль — потому что вопрос «выдержит ли опора» решает величина, а не направление.


«Что тяжелее, то и давит сильнее»

Самая частая ошибка выглядит так: ученик видит формулу \(p = F/S\), но сравнивает тела по массе. «Гиря тяжелее монеты, значит, гиря давит сильнее». Проверим счётом.

Гиря массой 5 кг стоит на широкой подставке 10 см × 10 см. На стол давит вес гири — сила, численно равная \(mg\), если тело спокойно лежит на горизонтальной опоре (М2 §1). Коэффициент \(g = 9{,}8\) Н/кг; во всей этой главе мы округляем его до 10 Н/кг — это завышает ответы примерно на 2 %, что для оценок давления несущественно, и мы это объявляем заранее, а не задним числом. Итак, \(F = 5 \cdot 10 = 50\) Н. Площадь подставки: \(10 \cdot 10 = 100\ \text{см}^2 = 0{,}01\ \text{м}^2\). Давление:

\[p = \frac{50}{0{,}01} = 5000\ \text{Па} = 5\ \text{кПа}.\]

Монета массой 5 г поставлена на ребро. Сила: \(F = 0{,}005 \cdot 10 = 0{,}05\) Н — в тысячу раз меньше, чем у гири. Площадка касания у ребра узкая; оценим её как 2 мм × 0,5 мм, то есть \(1\ \text{мм}^2 = 10^{-6}\ \text{м}^2\). Давление:

\[p = \frac{0{,}05}{10^{-6}} = 50\,000\ \text{Па} = 50\ \text{кПа}.\]

Монета, которая в тысячу раз легче гири, давит на стол в десять раз сильнее. Сила в формуле стоит в числителе, площадь — в знаменателе, и выбрасывать знаменатель нельзя. «Тяжелее» и «давит сильнее» — разные утверждения.


Первая функция: делим силу на площадь

Формулу удобно записать один раз функцией (М0 §1) и дальше вызывать с любыми числами.

def pressure(force, area):
    return force / area

p_finger = pressure(10, 1e-4)
p_pin = pressure(10, 1e-7)

print(f"палец:  p = {p_finger:.0f} Па = {p_finger / 1000:.0f} кПа")
print(f"остриё: p = {p_pin:.0f} Па = {p_pin / 1_000_000:.0f} МПа")
палец:  p = 100000 Па = 100 кПа
остриё: p = 100000000 Па = 100 МПа

Запись 1e-4 — это \(1 \cdot 10^{-4}\): стандартный вид числа, как его пишет Python (М1 §1). Запись {p_finger:.0f} внутри f-строки означает «напечатать это число без дробной части»; подробнее о таком форматировании — в §1.5.

Обратите внимание, что функция ничего не знает ни про кнопки, ни про пальцы: она делит одно число на другое. Всю ответственность за то, что в неё попали ньютоны и квадратные метры, а не граммы и квадратные сантиметры, несёт человек. К этому мы вернёмся в §1.6.

Проверки на нулевую площадь здесь нет намеренно. Попробуйте вызвать pressure(10, 0) — программа остановится с сообщением ZeroDivisionError. Это не каприз Python: тело, у которого площадь опоры равна нулю, ни на что не опирается, и давление у него не определено.


М3 §1.2. Физика: по чему именно давит тело

В формуле \(p = F/S\) вторая буква прячет всю трудность. Что именно считать площадью?

Человек массой 70 кг давит на снег с силой 700 Н. Подошва ботинка — примерно 30 см × 10 см = 300 см², двумя ногами это \(600\ \text{см}^2 = 0{,}06\ \text{м}^2\):

\[p = \frac{700}{0{,}06} \approx 11\,700\ \text{Па} \approx 12\ \text{кПа}.\]

Рыхлый снег такого давления не держит — нога проваливается. Наденем лыжи: каждая 180 см × 8 см, то есть \(0{,}144\ \text{м}^2\), две лыжи — около \(0{,}3\ \text{м}^2\):

\[p = \frac{700}{0{,}3} \approx 2300\ \text{Па} \approx 2{,}3\ \text{кПа}.\]

Горизонтальная поверхность снега. Слева широкое тело с подписью «на лыжах», к нему вниз идёт стрелка веса 700 Н, рядом надпись «S ≈ 0,3 м², p ≈ 2,3 кПа — снег держит». Справа узкое тело с подписью «без лыж», к нему вниз идёт такая же стрелка веса 700 Н, рядом надпись «S ≈ 0,06 м², p ≈ 12 кПа — снег не держит».

Масса та же, сила та же: лыжи увеличивают площадь контакта впятеро и во столько же раз уменьшают давление

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


Стеллаж: контур опоры — не площадь контакта

В прошлом параграфе (М2 §5), разбирая устойчивость, мы работали с опорным контуром — многоугольником, который получается, если обвести все точки опоры по внешнему краю. Стеллаж на четырёх ножках устойчив, пока вертикаль из центра тяжести проходит внутри этого прямоугольника. Для устойчивости важен именно контур.

Для давления — нет. Считать давление по опорному контуру — самая тяжёлая ошибка этой главы, потому что она даёт правдоподобное на вид число, ошибочное в сто раз.

Стеллаж 90 см × 40 см; масса его вместе с книгами — 60 кг, значит на пол он давит с силой 600 Н. Ножек четыре, каждая — квадрат 3 см × 3 см.

Опорный контур: \(0{,}9 \cdot 0{,}4 = 0{,}36\ \text{м}^2\). Если поделить силу на него, получится

\[p = \frac{600}{0{,}36} \approx 1670\ \text{Па}.\]

Площадь контакта: пола касаются только четыре пятна ножек, \(4 \cdot 9 = 36\ \text{см}^2 = 0{,}0036\ \text{м}^2\). Настоящее давление:

\[p = \frac{600}{0{,}0036} \approx 167\,000\ \text{Па} \approx 1{,}7 \cdot 10^5\ \text{Па}.\]

Вид сбоку: на полу в ряд стоят четыре узкие ножки стеллажа. Все четыре обведены общей рамкой с подписью «опорный контур, ширина 90 см». Отдельная надпись у крайней правой ножки: «пола касаются только четыре пятна 3 × 3 см».

Вид сбоку. Рамка — опорный контур: он решает, упадёт ли стеллаж. Пола касаются только четыре пятна ножек — это площадь контакта, она решает, продавит ли стеллаж пол. Числовые значения обеих площадей — в тексте

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

Запомните различение: опорный контур решает, упадёт ли тело; площадь контакта решает, продавит ли оно опору. Это две разные площади, и путать их нельзя.


Кто на кого давит

Стоит сказать, к чему приложена сила в числителе. Вес — это сила, с которой тело действует на опору (М2 §1); она приложена не к телу, а к столу. Поэтому давление — величина про опору: она отвечает на вопрос, что происходит со столом, полом, снегом.

Со стороны опоры на тело действует сила реакции — той же величины, направленная вверх. Она распределена по той же самой площади контакта, а значит, даёт то же самое давление. Давление обоюдно.

Вернёмся к кнопке и посмотрим на обе пары контакта по отдельности.

  • Остриё и доска. Площадь \(10^{-7}\ \text{м}^2\), давление 100 МПа. С такой же силой на такой же площадке доска давит на остриё — но сталь сотню мегапаскалей переносит, а дерево нет. Поэтому остриё входит в доску, а не тупится о неё.
  • Шляпка и палец. Площадь около \(10^{-4}\ \text{м}^2\), давление 100 кПа. Шляпка давит на палец теми же 100 кПа, и кожа их терпит без всякого труда.

Одна и та же сила 10 Н, два места касания — и два давления, различающиеся в тысячу раз. Ради этого шляпку у кнопки и делают широкой: она снижает давление на пальце, оставляя его огромным на острие.

И ещё одна оговорка про четыре ножки. Мы поделили 600 Н на суммарную площадь всех четырёх пятен — так делают, когда нагрузка распределена между ножками поровну. Поровну она распределяется, если центр тяжести (М2 §5) находится посередине. Сдвиньте все книги на одну полку у края — и ближние ножки примут на себя больше, а давление под ними вырастет. Считать этот перекос числом мы пока не умеем; знать, что он есть, — обязаны.


М3 §1.3. Математика: считаем площадь

Чтобы разделить силу на площадь, площадь надо сначала получить. Здесь физика упирается в планиметрию.

Площадь — величина, которая показывает, сколько единичных квадратов помещается в фигуре. Выбрали единичный квадрат — получили единицу площади: квадрат со стороной 1 м даёт квадратный метр (м²), со стороной 1 см — квадратный сантиметр (см²).

Два свойства площади нам понадобятся сразу.

Аддитивность. Если фигуру разрезать на части, сумма площадей частей равна площади целого. Проверьте на числах: опорную плиту, у которой к прямоугольнику 10 см × 6 см приставлен полукруг радиуса 3 см, разрежем по линии стыка. Прямоугольник даёт 60 см², полукруг — \(3{,}14 \cdot 3^2 : 2 \approx 14\) см², целое — около 74 см². Никакой новой формулы для такой фигуры не нужно: её площадь собирается из двух знакомых.

Площадь неотрицательна. Отрицательной площади не бывает, нулевая площадь — это отсутствие фигуры. Для физики это означает: опоры с нулевой или отрицательной площадью не существует, и программа, которая такую площадь приняла, считает не то.


Три формы опоры

Опоры, которые встречаются в задачах, почти всегда сводятся к трём фигурам.

Прямоугольник со сторонами \(a\) и \(b\) — кирпич, брус, подошва, пластина:

\[S = ab\]

Это прямо следует из определения: в прямоугольнике \(a\) см на \(b\) см помещается \(a\) столбцов по \(b\) единичных квадратов.

Треугольник с основанием \(a\) и высотой \(h\) — клин, косынка-подпятник, угловая накладка:

\[S = \frac{ah}{2}\]

Треугольник — ровно половина прямоугольника со сторонами \(a\) и \(h\); достройте его до прямоугольника и убедитесь.

Круг радиуса \(r\) — ножка стола, шайба, поршень, монета, свая:

\[S = \pi r^2\]

Число π

В формуле круга стоит число π — отношение длины окружности к её диаметру, одно и то же для любой окружности:

\[\pi = 3{,}1415926\ldots\]

Это бесконечная непериодическая десятичная дробь: точно записать её цифрами невозможно, поэтому в расчётах берут приближение. Для семиклассника достаточно \(\pi \approx 3{,}14\); в программе мы возьмём math.pi — там хранится столько цифр, сколько вмещает конечный формат, которым Python хранит дробные числа: около шестнадцати значащих (М1 §1).

Откуда берётся \(\pi r^2\), строго доказывают позже — на это нужен предельный переход. Но проверить формулу можно уже сейчас, и без всякой алгебры.

Возьмите лист плотного картона и вырежьте из него десять квадратов 10 см × 10 см и десять кругов радиуса 5 см. Десять, а не по одному: одна такая заготовка весит около двух граммов, и кухонные весы с шагом 1 г о ней ничего внятного не скажут. Пачка из десяти весит уже два-три десятка граммов, и та же погрешность в 1 г становится в десять раз менее заметной.

Картон однороден, значит масса пропорциональна площади. Взвесьте обе пачки и поделите массу круглой на массу квадратной. Должно получиться примерно 0,77–0,80. А формула предсказывает

\[\frac{\pi r^2}{(2r)^2} = \frac{\pi}{4} \approx 0{,}785.\]

Совпадение в пределах точности весов — это и есть экспериментальная проверка формулы. Если весы у вас с шагом 0,1 г, хватит и одной пары заготовок, а результат будет ближе к 0,785.


«Диаметр вместо радиуса — разница небольшая»

Ножку стола или шайбу измеряют линейкой поперёк, то есть получают диаметр. В формулу же входит радиус. Подставить измеренное число прямо в \(\pi r^2\) — ошибка, и она больше, чем кажется.

Диаметр вдвое больше радиуса, но площадь зависит от квадрата:

\[\pi (2r)^2 = 4 \pi r^2.\]

Ответ завышается в четыре раза, а не в два. Давление при этом занижается тоже вчетверо: вместо 40 кПа вы получите 10 кПа и решите, что опора выдержит.

Правило простое: измерили поперёк — поделите на два, и только потом возводите в квадрат.


Программа, которая выбирает формулу

Три формулы — три случая. Пусть форму опоры выбирает не человек в голове, а параметр функции:

import math

def area_of(shape, a, b=0):
    if shape == "прямоугольник":
        return a * b
    elif shape == "треугольник":
        return a * b / 2
    elif shape == "круг":
        return math.pi * a ** 2
    else:
        return None

print(f"прямоугольник 0,25 × 0,12: {area_of('прямоугольник', 0.25, 0.12):.5f} м²")
print(f"треугольник 0,30 и 0,20:   {area_of('треугольник', 0.30, 0.20):.5f} м²")
print(f"круг r = 0,05:             {area_of('круг', 0.05):.5f} м²")
print(f"круг по диаметру 0,10:     {area_of('круг', 0.10):.5f} м²")
прямоугольник 0,25 × 0,12: 0.03000 м²
треугольник 0,30 и 0,20:   0.03000 м²
круг r = 0,05:             0.00785 м²
круг по диаметру 0,10:     0.03142 м²

Две записи в этом коде встречаются впервые.

b=0 в заголовке функции — значение параметра по умолчанию. Если при вызове второй аргумент не написан, Python сам подставит ноль. Для круга второй размер не нужен: у него только радиус, — поэтому вызов area_of('круг', 0.05) с одним числом законен, и b там просто не используется.

None — особое значение Python, которое читается как «ничего, никакого результата». Функция возвращает его, когда не знает, что ответить: формы «ромб» в цепочке нет, и площади она не выдаёт. Напечатать None можно, а делить на него нельзя — к этому мы вернёмся в §1.5 и §1.6.

Сверим с расчётом на бумаге, не заглядывая в вывод: \(0{,}25 \cdot 0{,}12 = 0{,}03\); \(0{,}30 \cdot 0{,}20 : 2 = 0{,}03\); \(3{,}14 \cdot 0{,}05^2 = 3{,}14 \cdot 0{,}0025 = 0{,}00785\). Все три числа должны совпасть с напечатанными. Такая сверка — обязательная часть работы с любой программой: сначала считаете руками одну строчку, потом доверяете машине остальные сто.

Четвёртая строка — та самая ошибка из предыдущего фрагмента: под именем радиуса передан диаметр. Поделите четвёртое число на третье — получится ровно 4.

Разбор конструкции по частям — в §1.5; пока запомните схему: if проверяет первый случай, elif — следующий, else ловит всё остальное.


М3 §1.4. Математика: ловушка квадратных сантиметров

Вспомните, что вы ответили себе в вопросах к главе: сколько квадратных сантиметров в квадратном метре?

Ответ «сто» неверен. Сто — это сколько сантиметров в метре, и линейный множитель к площади не применяется.

Возьмите квадрат со стороной 1 м и расчертите его сеткой на клетки со стороной 1 см. По горизонтали уложится 100 клеток, по вертикали — тоже 100. Всего клеток:

\[100 \cdot 100 = 10\,000.\]

Значит,

\[1\ \text{м}^2 = 10^4\ \text{см}^2 = 10^6\ \text{мм}^2.\]

Множитель возводится в квадрат вместе с единицей — это и есть смысл маленькой двойки в обозначении. В обратную сторону:

\[1\ \text{см}^2 = 10^{-4}\ \text{м}^2, \qquad 1\ \text{мм}^2 = 10^{-6}\ \text{м}^2.\]

Вот и обещанное объяснение множителей из §1.1: квадратный сантиметр пальца — это \(10^{-4}\ \text{м}^2\), а десятая доля квадратного миллиметра острия — \(0{,}1 \cdot 10^{-6} = 10^{-7}\ \text{м}^2\).

Проверьте на числе, которое встретится в задачах: \(200\ \text{см}^2 = 200 : 10\,000 = 0{,}02\ \text{м}^2\). Не 2 м² — это была бы площадь письменного стола, а у нас ладонь.

Ошибка «делю на 100 вместо 10 000» ровно в сто раз меняет ответ. Давление 25 000 Па превращается в 250 Па, и вывод «опора выдержит» получается там, где опора не выдержит.


Перевод единиц — тоже работа для функции

Чтобы множители 10⁴ и 10⁶ были не в памяти, а на экране, запишем перевод функцией:

def to_square_meters(value, unit):
    if unit == "м2":
        return value
    elif unit == "см2":
        return value / 10_000
    elif unit == "мм2":
        return value / 1_000_000
    else:
        return None

print(to_square_meters(1, "м2"), "м²")
print(to_square_meters(10_000, "см2"), "м² — столько же")
print(to_square_meters(1_000_000, "мм2"), "м² — и это столько же")
print(to_square_meters(200, "см2"), "м² — вот сколько в 200 см²")
1 м²
1.0 м² — столько же
1.0 м² — и это столько же
0.02 м² — вот сколько в 200 см²

Подчёркивания внутри чисел (10_000) Python игнорирует — они только для глаза, чтобы не пересчитывать нули. Первые три строки печатают одно и то же число, записанное в трёх разных единицах: это и есть равенство \(1\ \text{м}^2 = 10^4\ \text{см}^2 = 10^6\ \text{мм}^2\), показанное вычислением.

Записано это число в них по-разному: в первой строке 1, во второй и третьей 1.0. Первая ветка возвращает то, что ей дали, — целое число (int); остальные делят, а деление в Python всегда даёт дробное число (float), даже когда делится нацело. Величина одна, тип записи разный.


Как давление зависит от площади

Зафиксируем силу: пусть на опору всегда действует \(F = 600\) Н, и будем менять только площадь. Тогда давление — функция площади:

\[p(S) = \frac{600}{S}.\]

Посчитаем пять точек:

\(S\), м² 0,40 0,20 0,10 0,05 0,025
\(p\), Па 1500 3000 6000 12 000 24 000

График зависимости давления от площади опоры при постоянной силе 600 Н: кривая круто спадает от 24 000 Па при площади 0,025 м² до 1500 Па при площади 0,4 м². На кривой отмечены пять расчётных точек.

Одна и та же сила 600 Н: вдвое меньше площадь — вдвое больше давление

Закономерность видна прямо в таблице: уменьшили площадь вдвое — давление выросло вдвое. Это не прямая пропорциональность, с которой мы работали раньше (там при увеличении одной величины вдвое вторая тоже росла вдвое). Здесь наоборот: во сколько раз меньше знаменатель, во столько раз больше результат. Произведение \(p \cdot S\) при этом остаётся одним и тем же — оно равно силе.

График не прямая: кривая круто уходит вверх у малых площадей и прижимается к горизонтальной оси у больших. Именно левый край этой кривой объясняет и кнопку, и лезвие ножа, и остриё гвоздя: чтобы получить огромное давление, не нужна огромная сила — достаточно очень маленькой площади.


Лаборатория: давление бруска на стол

Всё, что нужно, — деревянный брусок, линейка и весы.

Шаг 1. Измерьте линейкой стороны той грани, которой брусок лежит на столе. Пусть получилось \(a = 5{,}0\) см и \(b = 3{,}0\) см. Линейка с миллиметровыми делениями даёт погрешность \(\Delta = 0{,}5\) мм \(= 0{,}05\) см (М1 §1): \(a = 5{,}0 \pm 0{,}05\) см, \(b = 3{,}0 \pm 0{,}05\) см.

Шаг 2. Взвесьте брусок: пусть \(m = 200\) г \(= 0{,}2\) кг. Сила: \(F = mg = 0{,}2 \cdot 10 = 2\) Н.

Шаг 3. Площадь: \(S = 5{,}0 \cdot 3{,}0 = 15\ \text{см}^2 = 0{,}0015\ \text{м}^2\).

Шаг 4. Давление: \(p = 2 : 0{,}0015 \approx 1330\) Па.

Шаг 5 — про погрешность. Насколько плохо мы знаем площадь? Это можно не выводить, а прямо посчитать по краям.

Самая маленькая возможная площадь: \(4{,}95 \cdot 2{,}95 = 14{,}60\ \text{см}^2\). Самая большая: \(5{,}05 \cdot 3{,}05 = 15{,}40\ \text{см}^2\). Значит, \(S = 15{,}0 \pm 0{,}4\ \text{см}^2\), и в процентах это \(0{,}4 : 15 \approx 2{,}7\ \%\).

Теперь сравните с процентами сторон: у \(a\) это \(0{,}05 : 5{,}0 = 1\ \%\), у \(b\)\(0{,}05 : 3{,}0 \approx 1{,}7\ \%\). Сумма: \(1 + 1{,}7 = 2{,}7\ \%\) — ровно то, что мы только что получили счётом по краям. Это общее правило, и мы принимаем его без вывода: при умножении относительные погрешности складываются, поэтому площадь всегда «знается» примерно вдвое хуже, чем одна сторона. Отсюда честная запись результата: \(p \approx 1330 \pm 40\) Па, то есть примерно 1,3 кПа, и третья цифра в этом числе уже ничего не значит.

Поверните брусок другой гранью и повторите. У вас должно получиться другое давление при той же массе — и это лучший ответ на вопрос «давление и сила — одно и то же?».


М3 §1.5. Информатика: калькулятор давления

Разберём наконец конструкцию, на которой держится area_of.

Строка (str). До сих пор переменные хранили числа. "круг" — тоже данные, только другого сорта: текст. Такой тип называется строкой; в коде она всегда в кавычках. Строки можно хранить в переменных, передавать в функции параметром и сравнивать между собой:

shape = "круг"
print(shape == "круг")
print(shape == "Круг")
print(shape == "круг ")
print(f"форма опоры: {shape}")
True
False
False
форма опоры: круг

Второе и третье сравнения дают False: для машины строки равны, только если совпадают посимвольно. Заглавная буква — другой символ, лишний пробел в конце — другой символ. Отсюда практическое правило: выпишите список допустимых названий один раз комментарием над функцией — например, # формы: "прямоугольник", "треугольник", "круг" — и в вызовах копируйте название оттуда, а не набирайте заново.

Цепочка if / elif / else. Одиночный if умеет отвечать на вопрос «да или нет». Здесь вопросов несколько: форма может быть прямоугольником, треугольником или кругом. elif — это сокращение от «else if», «а иначе, если». Работает цепочка так:

  1. проверяется первое условие; если истинно — выполняется его ветка, и вся остальная цепочка пропускается;
  2. если ложно — проверяется второе условие, и так далее;
  3. если ни одно не подошло — выполняется else.

Ровно одна ветка из всей цепочки. Порядок проверок важен: если два условия могут оказаться истинными одновременно, сработает то, что стоит выше.

else — обязательно последняя ветка цепочки: после неё не может стоять ни elif, ни новое условие. Такую запись Python отвергает как SyntaxError, даже не начав считать: разбирая текст программы, он видит elif без цепочки, к которой тот мог бы относиться.

И честное замечание про наш else. В area_of он возвращает None — то есть ведёт себя почти так же, как если бы ветки вовсе не было: функция, дойдя до конца без return, тоже отдаёт None. Пока это заглушка: она только помечает место, где нужен настоящий ответ на неизвестную форму. Пользы от неё немного, и вот почему.

Пусть кто-то вызвал area_of("ромб", 4, 5) и следующей строкой поделил силу на результат. Программа остановится с сообщением вроде TypeError: unsupported operand type(s) for /: 'int' and 'NoneType' — и укажет на строку с делением, где всё написано правильно. Настоящая ошибка — опечатка в названии формы — осталась строкой выше и в сообщении не упомянута. Так и выглядит «падение в месте, далёком от настоящей ошибки». Чинить это будем в §1.6.


Собираем калькулятор

Соберём вместе всё: выбор формулы по форме, перевод единиц и деление. Размеры опор задаём в сантиметрах — так их и измеряют линейкой, — а в метры переводим внутри цикла.

import math

def area_of(shape, a, b=0):
    if shape == "прямоугольник":
        return a * b
    elif shape == "треугольник":
        return a * b / 2
    elif shape == "круг":
        return math.pi * a ** 2
    else:
        return None

def to_square_meters(value, unit):
    if unit == "м2":
        return value
    elif unit == "см2":
        return value / 10_000
    elif unit == "мм2":
        return value / 1_000_000
    else:
        return None

force = 40  # Н — одна и та же сила для всех четырёх опор

supports = [
    ["кирпич плашмя", "прямоугольник", 25, 12],
    ["кирпич на ребре", "прямоугольник", 25, 6.5],
    ["ножка стола", "круг", 2.5, 0],
    ["лезвие", "прямоугольник", 10, 0.01],
]

for name, shape, a, b in supports:
    area_cm2 = area_of(shape, a, b)
    area_m2 = to_square_meters(area_cm2, "см2")
    p = force / area_m2
    print(f"{name:<16} S = {area_m2:.6f} м²   p = {p:12.0f} Па")
кирпич плашмя    S = 0.030000 м²   p =         1333 Па
кирпич на ребре  S = 0.016250 м²   p =         2462 Па
ножка стола      S = 0.001963 м²   p =        20372 Па
лезвие           S = 0.000010 м²   p =      4000000 Па

Здесь две записи стоит прочитать медленно.

supports — список, каждый элемент которого сам список из четырёх значений: название, форма, первый размер, второй. Строка for name, shape, a, b in supports на каждом шаге берёт очередной такой четвёрочный список и раздаёт его элементы четырём именам сразу — так же, как раньше мы раздавали двум именам пару значений. Порядок имён обязан совпадать с порядком внутри строки таблицы.

{name:<16} в f-строке означает «выровнять текст по левому краю в колонке шириной 16 символов», {p:12.0f} — «число без дробной части в колонке шириной 12». Это только оформление: без него столбцы разъезжаются, и таблицу трудно читать.

Сила во всех четырёх строках одна и та же — 40 Н. Меняется только опора, и давление пробегает четыре порядка: от полутора тысяч паскалей под кирпичом до четырёх миллионов под лезвием. Лезвие в этом списке — не метафора: полоска шириной 0,1 мм и длиной 10 см даёт площадь \(0{,}1\ \text{см}^2\), и та же сила, которой кирпич безобидно лежит на столе, режет.


Проверяем программу до того, как ей поверить

Программа напечатала таблицу. Откуда мы знаем, что она напечатала правду?

Проверка делается так: берётся одна строка и считается на бумаге, а допуск объявляется до сравнения. Возьмём первую: \(25 \cdot 12 = 300\ \text{см}^2\); \(300 : 10\,000 = 0{,}03\ \text{м}^2\); \(40 : 0{,}03 = 1333{,}33\ldots\) Па. Допуск объявим: расхождение с программой больше 1 Па считаем ошибкой в коде, меньше — следствием того, что число хранится в конечном числе разрядов, и оно нас не беспокоит (М1 §1; для аккуратного сравнения там же был показан math.isclose).

Если программа печатает 1333 Па — код делает то, что задумано. Если она печатает 133 333 Па, ошибка не в машине: где-то перепутан множитель перевода, и искать надо в to_square_meters, а не в паскалях.

Та же процедура годится для лабораторного бруска из §1.4: подставьте в программу свои измеренные 5 и 3 сантиметра и силу 2 Н. Программа должна выдать те же 1330 Па, что вы получили руками. Совпало — калькулятору можно доверить остальные девять граней. Не совпало — одна из двух версий неверна, и разбираться надо до того, как считать дальше.


М3 §1.6. Информатика: программа, которая не верит вводу

Наш калькулятор пока предполагает, что ему дают осмысленные числа. Проверим это предположение.

  • area_of("ромб", 4, 5) — формы «ромб» в цепочке нет, вернётся None, и следующая же строка попытается разделить силу на «ничего».
  • area_of("прямоугольник", -4, 5) — вернёт \(-20\). Отрицательная площадь. Давление получится отрицательным, и программа не поморщится.
  • area_of("прямоугольник", 0, 5) — вернёт 0, и деление на ноль остановит программу.

Все три случая — не редкость: так выглядит обычная опечатка. Поэтому у функции появляется вторая обязанность помимо счёта: проверять то, что ей дали. Это называется проверкой входных данных.

Правило простое: функция сначала убеждается, что данные осмысленны, и только потом считает. Осмысленны здесь означает: форма — одна из известных, каждый размер строго больше нуля.


Версия, которая отказывается считать

import math

def area_of(shape, a, b=0):
    if a <= 0:
        return "ошибка: размер должен быть больше нуля"
    if shape == "прямоугольник":
        if b <= 0:
            return "ошибка: вторая сторона должна быть больше нуля"
        return a * b
    elif shape == "треугольник":
        if b <= 0:
            return "ошибка: высота должна быть больше нуля"
        return a * b / 2
    elif shape == "круг":
        return math.pi * a ** 2
    else:
        return "ошибка: неизвестная форма опоры"

print(area_of("прямоугольник", 0.25, 0.12))
print(area_of("ромб", 0.25, 0.12))
print(area_of("круг", -0.05))
0.03
ошибка: неизвестная форма опоры
ошибка: размер должен быть больше нуля

Из трёх вызовов два ошибочны, и на каждый программа отвечает человеческой фразой, а не числом и не аварийной остановкой. Ошибка теперь называется там, где она сделана, а не строкой ниже. Первая проверка стоит до цепочки: она общая для всех форм, и повторять её в каждой ветке незачем.

Заметьте, что функция теперь возвращает то число, то текст. Печатать можно и то и другое, а вот делить силу на текст нельзя — значит, вызывающий код обязан сначала посмотреть, что ему вернули: число или сообщение. Спросить об этом Python умеет, но средства для такого вопроса — проверку типа значения — курс ещё не вводил, и мы вернёмся к ней дальше. Пока нам достаточно того, что бессмысленный ввод не проходит вглубь расчёта молча.


«Раз машина выдала число, оно верное»

Самое опасное в калькуляторе — его невозмутимость. Версия без проверок на запрос «прямоугольник со стороной −4 см» ответит -20 мгновенно и тем же шрифтом, что и правильные ответы. Машина выполнила ровно то, что ей велели, — умножила два числа; смысл в них вкладывает человек.

Поэтому порядок ответа полезно прикинуть в голове до запуска. Человек весом 600 Н, опирающийся ладонью в 100 см² \(= 0{,}01\ \text{м}^2\), даёт \(600 : 0{,}01 = 60\,000\) Па — десятки килопаскалей. Если программа выдала 600 Па или 6 МПа, спорить с ней не о чем: ошибся множитель перевода, и разница ровно стократная в ту или другую сторону.

Три вопроса в конце любого расчёта:

  1. Те ли единицы? Сантиметры не превратились в метры сами.
  2. Тот ли порядок величины? Давление человека на пол — тысячи и десятки тысяч паскалей. Если получилось 12 Па или 12 ГПа — ошибка в расчёте, а не открытие.
  3. Возможен ли такой ответ вообще? Отрицательное давление, нулевая площадь, площадь опоры больше площади комнаты — сигналы, что где-то потеряна связь с реальностью.

М3 §1.7. Задачи

Везде считайте \(g = 10\) Н/кг, если не сказано иное; \(\pi \approx 3{,}14\).

Уровень 1. Прямой счёт

1.1. Деревянный брусок массой 1,2 кг имеет размеры 20 см × 10 см × 5 см. Его кладут на стол по очереди тремя разными гранями. Найдите давление в каждом случае и расположите три ответа по возрастанию. Какой грани соответствует наибольшее давление и почему?

Подсказка. Сначала сила: \(F = mg\). Потом три площади в см², потом перевод в м² — множитель 10 000, а не 100.

1.2. Груз подвешен к динамометру, у которого шкала размечена до 5 Н, а между соседними числами 0 и 1 стоят десять промежуточных рисок. Указатель показывает 3,4 Н. Этот груз ставят на стол через квадратную шайбу со стороной 2 см. Найдите давление груза на стол. Чему равна цена деления динамометра и как она влияет на то, сколько цифр имеет смысл оставить в ответе?

1.3. Гусеничный трактор массой 6 т опирается на две гусеницы, каждая из которых касается земли полосой 2,5 м × 0,4 м. Найдите давление трактора на грунт и сравните его с давлением человека массой 70 кг, стоящего на двух ногах (площадь двух подошв — 600 см²). Кто давит на землю сильнее?


Уровень 2. Геометрия площади

2.1. Стол массой 24 кг стоит на четырёх круглых ножках радиуса 2 см. Найдите суммарную площадь контакта и давление стола на пол. Ответ округлите до сотен паскалей и запишите в стандартном виде.

Подсказка. Площадь одной ножки — \(\pi r^2\); ножек четыре. Радиус в метрах — 0,02 м, и квадрат этого числа равен 0,0004.

2.2. Под опору подкладывают треугольную косынку: основание 12 см, высота 8 см. Второй вариант — прямоугольная пластина той же ширины 12 см и длины 8 см. Во сколько раз отличаются давления под этими двумя подкладками при одной и той же силе? Какая из них лучше защищает пол?

2.3. Опорная плита имеет форму прямоугольника 10 см × 6 см, к короткой стороне которого приставлен полукруг радиуса 3 см. На плиту действует сила 300 Н. Найдите площадь плиты (пользуйтесь аддитивностью: целое — сумма частей) и давление под ней. Ответ округлите до двух значащих цифр.

2.4. Кирпич размерами 25 см × 12 см × 6,5 см давит на стол с силой 40 Н. По таблице из §1.5 найдите, во сколько раз выросло давление при переворачивании кирпича с грани 25 × 12 на грань 25 × 6,5. Покажите, что это отношение равно \(12 : 6{,}5\), и объясните, почему длина 25 см в ответ не входит вовсе.


Уровень 3. Обратная задача и оценка

3.1. Человек массой 60 кг идёт по рыхлому снегу, который выдерживает давление не больше 3 кПа. Какой наименьшей площади должна быть одна лыжа? Запишите решение как неравенство относительно \(S\), найдите число, а затем определите, какой длины должна быть лыжа шириной 8 см. Проверьте свой ответ калькулятором из §1.5, подставив найденные размеры.

Подсказка, по шагам. Условие «давление не больше заданного» — это \(\dfrac{F}{S} \le p_{\max}\), где \(S\) — суммарная площадь обеих лыж. Дальше рассуждайте от таблицы, а не от преобразований: при \(F = 600\) Н площади 0,1 м² отвечает 6000 Па, площади 0,2 м² — 3000 Па, площади 0,3 м² — 2000 Па. Видно, что подходят площади не меньше 0,2 м²: чем больше знаменатель, тем меньше давление. Проверьте граничное значение подстановкой в \(F/S\), потом поделите суммарную площадь на две лыжи и найдите длину как \(S_{\text{одной}} : 0{,}08\).

3.2. Оцените давление, которое вы сами оказываете на пол. Поставьте ботинок на клетчатую бумагу, обведите подошву и сосчитайте клетки (неполные клетки считайте за половину). Переведите площадь в квадратные метры, возьмите свою массу и посчитайте давление стоя на двух ногах и стоя на одной. Запишите погрешность площади: с какой точностью вы сосчитали клетки и сколько это процентов? Во сколько раз меняется давление, когда вы поднимаете одну ногу, и меняется ли при этом сила?

3.3. Кнопку вдавливают в доску. Известно, что дерево начинает поддаваться при давлении около 30 МПа. Остриё кнопки имеет площадку \(0{,}05\ \text{мм}^2\). Какую наименьшую силу нужно приложить? Сравните её с весом стакана воды (около 2 Н) и объясните, почему кнопку удаётся вдавить пальцем.


Уровень 4. Разбор ошибки

4.1. Вот чужое решение. Найдите в нём место ошибки, назовите верный множитель перевода и скажите, во сколько раз и в какую сторону искажён ответ.

Плита опирается на площадку 200 см². На неё действует сила 500 Н. Переведём в метры: 200 см² = 2 м². Давление: \(p = 500 : 2 = 250\) Па. Ответ: 250 Па.

4.2. Второе решение, другая ошибка:

Стеллаж массой 60 кг стоит на четырёх ножках 3 см × 3 см. Опорный прямоугольник стеллажа — 90 см × 40 см. Площадь опоры: \(0{,}9 \cdot 0{,}4 = 0{,}36\ \text{м}^2\). Давление: \(p = 600 : 0{,}36 \approx 1670\) Па. Ответ: около 1,7 кПа.

Арифметика здесь безупречна. Что именно неверно и каков правильный ответ? Как называется величина, которую автор посчитал вместо площади контакта, и в какой задаче она была бы уместна?

4.3. Третье решение:

Ножка стола круглая, поперёк она 5 см. Значит, \(S = \pi \cdot 5^2 = 78{,}5\ \text{см}^2\). Переведём в метры: \(78{,}5\ \text{см}^2 = 0{,}785\ \text{м}^2\).

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


Задачи-ребусы

Р.1. Ножку стола измерили линейкой поперёк: получилось 4 сантиметра. Это число передали в программу вот так. Не запуская код, скажите, что он напечатает, какая площадь на самом деле у ножки и во сколько раз ошибся тот, кто писал вызов.

import math

def area_of(shape, a, b=0):
    if shape == "прямоугольник":
        return a * b
    elif shape == "круг":
        return math.pi * a ** 2
    else:
        return None

# 4 — размер круглой ножки, измеренный поперёк, в сантиметрах
print(area_of("круг", 4))

Р.2. В цепочку нужно добавить квадрат со стороной a. Сейчас программа печатает None — объясните почему. Допишите ветку так, чтобы вызов дал правильный ответ, и ответьте на два вопроса: (а) имеет ли значение, поставить новую ветку до "круг" или после; (б) что произойдёт, если поставить её после else, — и какой фразой из §1.5 это объясняется.

import math

def area_of(shape, a, b=0):
    if shape == "прямоугольник":
        return a * b
    elif shape == "треугольник":
        return a * b / 2
    elif shape == "круг":
        return math.pi * a ** 2
    else:
        return None

# допишите ветку для формы "квадрат" со стороной a
print(area_of("квадрат", 0.2))

М3 §1.8. Итог

Что теперь у вас есть.

Физика.

  • Давление \(p = \dfrac{F}{S}\) — отношение силы к площади, по которой она распределена. Величина скалярная: у неё нет направления.
  • Паскаль: \(1\ \text{Па} = 1\ \text{Н}/\text{м}^2\). Приставки кПа и МПа — обычные спутники этой единицы.
  • Площадь контакта — площадь того, чем тело реально касается опоры. Она не равна опорному контуру из М2 §5: контур решает, упадёт ли тело, площадь контакта — продавит ли оно опору. У стеллажа на ножках эти две площади отличаются в сто раз.
  • Давление обоюдно: с какой силой тело давит на опору, с такой же опора давит на тело, и по той же площади. У кнопки таких пар две — остриё с доской (100 МПа) и шляпка с пальцем (100 кПа).

Математика.

  • Площадь — величина, измеряемая единичными квадратами; она неотрицательна и аддитивна: площадь целого равна сумме площадей частей.
  • Три формулы: \(S = ab\) для прямоугольника, \(S = \dfrac{ah}{2}\) для треугольника, \(S = \pi r^2\) для круга.
  • Число \(\pi = 3{,}1415926\ldots\) — отношение длины окружности к диаметру; в расчётах берут приближение.
  • Единицы площади переводятся квадратом линейного множителя: \(1\ \text{м}^2 = 10^4\ \text{см}^2 = 10^6\ \text{мм}^2\).
  • При постоянной силе давление убывает с ростом площади: вдвое больше площадь — вдвое меньше давление, а произведение \(pS\) остаётся равным силе.
  • Относительная погрешность площади складывается из погрешностей двух сторон — то есть примерно вдвое хуже, чем у одного измерения; проверяется счётом по краям.

Информатика.

  • Строка (str) — текст в кавычках; строки сравниваются посимвольно, и "круг" не равно "Круг".
  • Цепочка if / elif / else выбирает ровно одну ветку из нескольких; проверки идут по порядку сверху вниз, else ловит всё, что не подошло, и всегда стоит последним.
  • Значение по умолчанию (b=0) позволяет вызывать функцию с меньшим числом аргументов; None — «никакого результата»: его можно напечатать, но нельзя делить.
  • Проверка входных данных: функция сначала убеждается, что форма известна, а размеры положительны, и только потом считает. Отрицательная сторона и нулевая площадь — не абстракция, а обычная опечатка.
  • Результат программы сверяется с расчётом на бумаге, и допуск объявляется до сравнения, а не после.

Мост к М3 §2

Всё, что мы считали, опиралось на одно молчаливое допущение: тело твёрдое и касается опоры вполне определённым куском своей поверхности. Кирпич давит вниз — на те 300 см², которыми лежит. Вбок он не давит: стенки рядом можно убрать, и ничего не изменится.

Теперь налейте в тот же ящик воду.

Вода тоже имеет вес, и на дно она давит — это понятно. Но стенки убрать уже нельзя: вода надавит на них и вытечет. Значит, давление в жидкости направлено не только вниз. И вопрос «по какой площади распределена сила» становится куда интереснее: у воды нет ни рёбер, ни граней, зато есть глубина, и на глубине двух метров давление больше, чем у поверхности, — хотя площадь дна не менялась.

В следующем параграфе разберёмся, почему жидкость давит во все стороны сразу, от чего это давление зависит и почему тонкая трубка с водой может разорвать бочку. Формула \(p = F/S\) никуда не денется — но работать с ней придётся иначе.