К новому году в нашей культуре принято ставить ёлку, ключевой символ праздника. Но колоритный экземпляр, метра два выстой, занимает много места в квартире. Одним из вариантов решения этой задачи являются настенные ёлки. Я заинтересовался и сделал себе такую - результат на фото. О том, как это получилось, и причем тут криволинейный интеграл, читайте ниже.
Все началось с гирлянды длиной 9 метров, уложив которую волнами, я планировал сделать подсветку праздничной ели. Высоту будущей новогодней красавице отмерил в 2 метра (исходя из высоты шкафа).
По идее на нее мишуру и - готово. Однако сразу возник вопрос - как именно укладывать, сколько изгибов делать? Слишком частая укладка - не хватит на всю высоту ёлки, слишком редкая - останется неуместный светящийся хвост.
Чтобы не перевешивать десять раз гирлянду, я решил сперва провести математический расчет.
Итак, задача. Электрическая ель должна равномерно заполнить собой треугольник шириной 58 см (ширина шкафа) и высотой 200 см. Есть ограничение на длину гирлянды - 814 см (светящийся участок, за вычетом провода без светодиодов у вилки).
Форму линии укладки удобно представить как график модулированного синусоидального колебания (в реальности форма дуг будет отличаться из-за провисания, но не критично).
Чтобы записать выражение для функции необходимо ввести систему координат. Воспользуемся прямоугольными декартовыми, ось Х направим вниз, ось У вправо. Начало координат поместим в вершину ели.
Чтобы график имел более привычный вид, развернем рисунок горизонтально.
Стороны треугольника лежат на прямой y = 0.145 * x и прямой y = - 0.145 * x.
Коэффициент наклона вычислен по координатам точек B(200, 29) и C(200,-29), через которые, наряду с началом координат, проходят эти модулирующие колебания прямые.
Имеем:
Для линии укладки неизвестен только коэффициент t. Найдем его.
Воспользуемся для расчета интеграла средствами python-библиотеки SciPy.
from scipy.integrate import quad
from scipy.optimize import fsolve
import numpy as np
H, L, k = 200, 814, 0.145
# подынтегральное выражение
def fsub(x, t):
return (1 + (k * np.sin(x) + t * k * x * np.cos(t*x))**2)**0.5
# правая часть уравнения, где слева оставлен только ноль
def f(t):
return quad(fsub, 0, H, args=(t))[0] - L
# ищем корень уравнения в окрестности t=0.3
fsolve(f, [0.3])
Результат:
t = 0.41
Зная функцию, найдем ее точки экстремума - в них нужно закреплять и изгибать гирлянду (на рисунке ниже обозначены латинскими буквами).
Запишем уравнение на равенство нулю первой производной и найдем его корни в диапазоне от 0 до H. Опять же механические расчеты отдадим машине.
from scipy.optimize import fsolve
def f(x):
return np.tan(t * x) + t * x
acc = []
for a in range(0, 200):
acc.append(np.round(fsolve(f, [a])[0], 2))
print(set(acc))
Получаем х-координаты искомых точек (для верхней прямой) : 0.0, 4.95, 11.98, 19.46, 27.04, 34.65, 42.28, 49.92, 57.57, 65.22, 72.87, 80.53, 88.19, 95.84, 103.5, 111.16, 118.82, 126.48, 134.14, 141.8, 149.46, 164.78, 172.44, 187.76, 195.42
Остается лишь вооружиться линейкой, карандашом и малярным скотчем - и аккуратно перенести оцифрованную елку на стену.