Лекция 1
Язык программирования Python.
Рейтинг языков программирования и почему Python.¶
import warnings
warnings.filterwarnings("ignore", category=FutureWarning)
!pip install -q tiobeindexpy
# Чтобы посмотреть рейтинги языков программирования
from tiobeindexpy import tiobeindexpy as tbpy
columns = ['Aug 2025', 'Aug 2024', 'Programming Language.1', 'Ratings', 'Change.1']
table = tbpy.top_20()[columns]
table['Ratings'] = table['Ratings'].str.replace('%', '').astype(float)
table['Change.1'] = table['Change.1'].str.replace('%', '').astype(float)
table
import seaborn as sns
import matplotlib.pyplot as plt
sns.barplot(x="Ratings", y="Programming Language.1", data=table, orient='h')
plt.title('TIOBE Index Top 20 (August 2025)', fontsize=16)
plt.xlabel('Ratings (%)')
plt.ylabel('Programming Language')
plt.grid(axis='x', alpha=0.3)
plt.tight_layout()
plt.show()
sns.barplot(x="Change.1", y="Programming Language.1", data=table, orient='h')
plt.title('TIOBE Index Top 20 (August 2025)', fontsize=16)
plt.xlabel('Change.1 (%)')
plt.ylabel('Programming Language')
plt.grid(axis='x', alpha=0.3)
plt.tight_layout()
plt.show()
Дополнительную информацию можно прочитать тут: источник.
А также здесь: TIOBE Index.
Основы Python и Integrated Development Environment (IDE).¶
Python можно использовать как калькулятор :)
2 + 2
7 - 5
21 * 2
import math
print(math.pi)
print(math.sqrt(math.pow(3, 2) + math.pow(4, 2)))
print(math.log2(1024))
print(math.exp(0))
print(math.cos(3.14))
print(round(math.cos(3.14)))
print(math.cos(math.pi))
Даже такое есть: Hypercomplex.
# это однострочный комментарий
# это другой однострочный комментарий
# и это всё однострочные комментарии
# и это всё однострочные комментарии
# и это всё однострочные комментарии
'''
это многострочный комментарий,
только это не совсем классический комментарий,
это многострочная строка :)
'''
'''
это многострочный комментарий,
только это не совсем классический комментарий,
это многострочная строка :)
''';
'''
это многострочный комментарий,
только это не совсем классический комментарий,
это многострочная строка :)
'''
None
# можно
# делать
# такой
# многострочный
# комментарий
#
# ╰( ͡° ͜ʖ ͡° )つ──☆*:・゚
Если кому-то стало скучно на лекции: ʕ•ᴥ•ʔ.
Рекомендуем прочитать про PEP8.
Арифметические операции и типы данных. Переменные.¶
11 + 2
11 - 2
11 * 2
11 / 2
11 // 2
11 % 2
11 ** 2
var = 123
var = 123
var
var = 123
print(var)
var = 123
var
var = 456
print(var)
var = 123
print(var)
var = 456
print(var)
Какие могут быть проблемы с тем, что уже было создано много переменных с одинаковым именем?
var = 9
print(var, type(var))
var = 9
type(var)
var = 9.4
type(var)
var = 9.4 + 7j
print(var)
type(var)
var = 9.4 + 7j
var
var = '9.4'
type(var)
var = '9.4'
var
var = "9.4"
var
var = "9.4"
var, type(var)
var = True
var
var = False
var
var = True
type(var)
my_list = [1, 2, 3, 4, 5]
my_list
my_list = [1, 2, 3, 4, 5, [6, 7, 8, 9]]
type(my_list)
my_tuple = (1, 2, 3, 4, 5)
type(my_tuple)
my_tuple = (1, 2, 3, 4, 5)
my_tuple
my_set = {1, 2, 3, 4, 5}
type(my_set)
my_set = {1, 2, 3, 4, 5}
my_set
my_set = {1, 2, 3, 4, 5, 5}
my_set
my_frozenset = frozenset((1, 2, 3, 4, 5))
my_frozenset
my_frozenset = frozenset((1, 2, 3, 4, 5))
type(my_frozenset)
my_dict = {1: 2, 3: 4, 5: 6}
type(my_dict)
my_dict = {1:2, 3:4, 5:6}
my_dict
my_dict = {1: '2', 3: '4', 5: 'qwerty'}
my_dict
my_dict = {'1': '2', 3: '4', '5': 'qwerty'}
my_dict
var = None
var
var = None
print(var)
var = None
type(var)
list = [3, 'not qwerty', 1 - 9j]
list
my_tuple = ('a', 'b', 'c', 'd', 'e')
my_list = list(my_tuple)
my_list
# Почему выше произошла ошибка? О чём она говорит?
# Вы умеете почитать сообщения Python? Это важно ;)
# Как исправить проблему? И нужно ли? :)
set_ = {1, 2, 3}
type(set_)
set_ = {}
type(set_)
# Было бы круто сделать пустое множество, но вышел словарь,
# ну как так-то...
set_ = set()
type(set_)
dict_ = dict()
type(dict_)
var = 3
print(var)
print(var:=3)
Официальная документация про это.
Тут можно почитать историю, как из-за "моржового" оператора (:=, PEP-572) Гвидо Ван Россум ушёл из комитета по Питону.
Ввод / вывод информации и базовые конструкции.¶
Список встроенных функций в Python: тык.
print(5)
print('hello world :)')
print()
print('')
print(3, 8, 1, -4, 1)
print(3, 8, 1, -4, 1, sep='')
print(3, 8, 1, -4, 1, sep=' ')
print(3, 8, 1, -4, 1, sep='\n')
print(3, 8, 1, -4, 1, sep='\t')
print(3, 8, 1, -4, 1, sep='\r')
print('hello\rworld')
print('helloworld\r')
print('helloworld\rqwerty')
import time
import sys
for i in range(11): # кто-то знает, почему 11? ;-)
sys.stdout.write(f'\rProgress: {i*10}%')
# sys.stdout.flush()
time.sleep(0.5)
print()
print(3, 8, 1, -4, 1)
print(3, 8, 1, -4, 1, end='')
print(3, 8, 1, -4, 1)
print('йцукен')
print(3, 8, 1, -4, 1, end='')
print('йцукен')
print(3, 8, 1, -4, 1, end='\n')
print('йцукен')
print(3, 8, 1, -4, 1, end='___')
print('йцукен')
print(3, 8, 1, -4, 1)
print(3, 8, 1, -4, 1, sep=' ', end='\n')
!ls
print(3, 8, 1, -4, 1, file=sys.stdout)
!ls
our_file = open('output.txt','a+')
print(3, 8, 1, -4, 1, file=our_file)
!ls
our_file.close()
!cat output.txt
file = open('print.txt','a+')
def value(items):
for item in items:
print(item, file=file)
file.close()
value([1,2,3,4,5,6,7,8,9,10])
!cat print.txt
# Важно: следующие ячейки луычше всего демонстрировать в терминале !!!
import time
print("Начинаем загрузку...", end='', flush=False)
time.sleep(5) # типа что-то делаем...
print(" Готово!")
import time
print("Начинаем загрузку...", end='', flush=True)
time.sleep(5) # типа что-то делаем...
print(" Готово!")
import sys
import time
print('Вы хотите продолжить (Д/н): ', end='')
sys.stdout.flush()
#time.sleep(5)
print()
Также можно почитать тут.
number_pi = 3.14
print('Наше число это: {}'.format(number_pi))
print('Наши числа это: {} и {}'.format(number_pi, number_pi*3))
print(f'Наше число это: {number_pi}')
print('Наше число это: {number_pi}')
print('hello, world!')
print(''hello, world!'') # почему это ошибка? Как это исправить?
print("hello, world!")
print('''hello, world!''')
print("""hello, world!""")
print("""Это многострочный
текст, который
будет выведен на экран""")
Про функцию input() можно прочитать тут.
input() # hello
input('Введите что-нибудь') # hello
input('Введите что-нибудь ещё ') # hello
input('Введите что-нибудь ещё\n') # hello
input_var = input() # 1 2 3 4 5
print(input_var, type(input_var))
# Что мы здесь видим?
# Как работать именно с числами, а не со строчками?
temp_var = 5
if temp_var > 3:
print('yes')
else:
print('no')
temp_var = 5
if temp_var > 3:
print('yes')
else:
print('no')
temp_var = 5
if temp_var > 3:
print('yes')
else:
print('no')
temp_var = 5
if temp_var > 7:
print('yes')
elif temp_var == 5:
print('exactly 5 :)')
else:
print('no')
temp_var = 5
if temp_var > 3:
print('yes')
elif temp_var == 5:
print('exactly 5 :)')
else:
print('no')
temp_var = 5
if temp_var > 3:
print('yes')
elif temp_var == 5:
print('exactly 5 :)')
elif temp_var == 7:
print('exactly 7 :)')
else:
print('no')
temp_var = 5
if temp_var > 7:
print('yes')
elif temp_var == 5:
print('exactly 5 :)')
else:
print('no')
temp_var = 5
if temp_var > 7:
print('yes')
if temp_var == 5:
print('exactly 5 :)')
else:
print('no')
temp_var = -5
if temp_var > 7:
print('yes')
if temp_var == 5: # лучше сделать elif :)
print('exactly 5 :)')
else:
print('no')
temp_var = -5
if temp_var > 7:
print('yes')
else:
if temp_var == 5: # лучше сделать elif :)
print('exactly 5 :)')
else:
print('no')
# так будет ошибка :(
temp_var = -5
if temp_var > 7:
print('yes')
else:
if temp_var == 5: # лучше сделать elif :)
print('exactly 5 :)')
else:
print('no')
# а так всё ок, но предпочтительнее делать код более читаемые ;)
temp_var = -5
if temp_var > 7:
print('yes')
elif temp_var == 5:
print('exactly 5 :)')
else:
print('no')
# как-то так :)
temp_var = -5
if temp_var > 7:
print('yes')
elif temp_var == 5:
print('exactly 5 :)')
else:
print('no')
# лучше так тоже не делать :)
for elem in range(1, 11):
print(elem)
for elem in range(1, 11):
print(elem)
print(elem)
for elem in range(1, 11):
print(elem)
if elem == 5:
break
print(elem)
for elem in range(1, 11):
print(elem)
if elem == 5:
continue
print(elem)
for elem in range(1, 11):
print(elem)
if elem == 5:
pass # что делает эта штука? :)
print(elem)
summa = 0
while summa <= 10:
print('-' * 30)
print(summa)
summa = summa + 1 # тоже самое можно переписать через summa += 1
print(summa)
print('-' * 30)
while True:
pass
# страшна вырубай
while 1:
pass
# тоже самое...
while 5 > 3:
pass
# ну и опять...
def print_hello(language): # пока не будем на это обращать внимания ;)
match language:
case "russian":
print("Привет")
case "english":
print("Hello")
case "german":
print("Hallo")
print_hello("english")
print_hello("german")
print_hello("russian")
Про конструкцию match можно прочитать тут.
Можно сделать даже такое: тык сюда.
for num in range(5):
print(num)
else:
print("Числа закончились")
for num in range(5):
if num == 3:
break
print(num)
else:
print("Числа закончились")
for num in range(5):
if num == 3:
continue
print(num)
else:
print("Числа закончились")
for num in range(5):
if num == 3:
pass
print(num)
else:
print("Числа закончились")
# Ответ LLM:
'''
Конструкция for-else в Python используется для выполнения блока кода,
если цикл for завершился нормально (без break), а не был досрочно прерван.
Это полезно для сценариев, где нужно отреагировать на полное прохождение цикла,
например, при поиске элемента в последовательности, и выполнить определенные действия,
если элемент так и не был найден.
''';
i = 0
while i < 5:
print(i)
i += 1
else:
print("Конец")
i = 0
while i < 5:
if i == 3:
break
print(i)
i += 1
else:
print("Конец")
i = 0
while i < 5:
if i == 3:
continue
print(i)
i += 1
else:
print("Конец")
# Почему образовался бесконечный цикл?
# Как это можно исправить?
i = 0
while i < 5:
if i == 3:
pass
print(i)
i += 1
else:
print("Конец")
Знакомство с NumPy и Matplotlib.¶
# Что-то совсем простое от LLM :)
import numpy as np
# Create a sample text file
with open("data.txt", "w") as f:
f.write("1.0 2.0 3.0\n")
f.write("4.0 5.0 6.0\n")
# Load data from the text file
data = np.loadtxt("data.txt")
print(data)
# Create the plot
plt.plot(x, y)
# Что-то совсем простое от LLM :)
import matplotlib.pyplot as plt
import numpy as np
# Prepare data using NumPy
x = np.linspace(0, 10, 100)
y = 2 * x + 5
# Create the plot
plt.plot(x, y)
# Add labels and title
plt.xlabel("X-axis Label")
plt.ylabel("Y-axis Label")
plt.title("Linear Plot Example")
# Display the plot
plt.show()
# Пусть LLM поработает за нас :)
# 1. Легкий уровень: Траектория броска тела под углом
import numpy as np
import matplotlib.pyplot as plt
# Параметры броска
g = 9.81 # ускорение свободного падения
v0 = 20 # начальная скорость, м/с
theta = np.radians(45) # угол броска в радианах
# Время полета
t_max = 2 * v0 * np.sin(theta) / g
t = np.linspace(0, t_max, 100)
# Координаты
x = v0 * np.cos(theta) * t
y = v0 * np.sin(theta) * t - 0.5 * g * t**2
# Построение
plt.figure(figsize=(10, 6))
plt.plot(x, y, 'b-', linewidth=2, label='Траектория')
plt.scatter(x[::10], y[::10], color='red', s=50, alpha=0.7, label='Точки измерения')
plt.xlabel('Расстояние, м')
plt.ylabel('Высота, м')
plt.title('Траектория броска тела под углом 45°')
plt.grid(True, alpha=0.3)
plt.legend()
plt.axis('equal')
plt.show()
# Пусть LLM поработает за нас :)
# 2. Средний уровень: Интерференция волн от двух источников
# Параметры волн
wavelength = 1.0 # длина волны
k = 2 * np.pi / wavelength # волновое число
# Координатная сетка
x = np.linspace(-5, 5, 500)
y = np.linspace(-5, 5, 500)
X, Y = np.meshgrid(x, y)
# Положения источников
source1 = np.array([-2, 0])
source2 = np.array([2, 0])
# Расстояния до источников
r1 = np.sqrt((X - source1[0])**2 + (Y - source1[1])**2)
r2 = np.sqrt((X - source2[0])**2 + (Y - source2[1])**2)
# Интерференционная картина
amplitude = np.cos(k * r1) + np.cos(k * r2)
# Построение
plt.figure(figsize=(12, 8))
plt.imshow(amplitude, extent=[-5, 5, -5, 5], cmap='RdBu', origin='lower', alpha=0.8)
plt.scatter([source1[0], source2[0]], [source1[1], source2[1]], color='red', s=100, label='Источники')
plt.colorbar(label='Амплитуда')
plt.xlabel('x, м')
plt.ylabel('y, м')
plt.title('Интерференция волн от двух источников')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
# Пусть LLM поработает за нас :)
# 3. Сложный уровень: Фазовый портрет маятника с затуханием
from scipy.integrate import odeint
# Параметры маятника
g = 9.81
L = 1.0 # длина маятника
b = 0.1 # коэффициент затухания
# Уравнение маятника
def pendulum(y, t):
theta, omega = y
dtheta_dt = omega
domega_dt = -b * omega - (g/L) * np.sin(theta)
return [dtheta_dt, domega_dt]
# Начальные условия для нескольких траекторий
initial_conditions = [
[np.radians(10), 0], # малый угол
[np.radians(90), 0], # большой угол
[np.radians(170), 0], # почти перевернутый
[np.radians(30), 2], # с начальной скоростью
]
# Время
t = np.linspace(0, 20, 1000)
# Решаем и строим
plt.figure(figsize=(14, 10))
colors = ['blue', 'red', 'green', 'purple']
labels = ['Малый угол', 'Большой угол', 'Почти перевернутый', 'С начальной скоростью']
for i, (y0, color, label) in enumerate(zip(initial_conditions, colors, labels)):
# Решение уравнения
solution = odeint(pendulum, y0, t)
theta, omega = solution.T
# Фазовый портрет
plt.plot(theta, omega, color=color, linewidth=2, label=label, alpha=0.8)
plt.scatter(theta[::50], omega[::50], color=color, s=30, alpha=0.6)
plt.xlabel('Угол θ, рад')
plt.ylabel('Угловая скорость ω, рад/с')
plt.title('Фазовый портрет маятника с затуханием')
plt.grid(True, alpha=0.3)
plt.legend()
plt.axhline(0, color='black', linestyle='--', alpha=0.5)
plt.axvline(0, color='black', linestyle='--', alpha=0.5)
plt.xlim(-np.pi, np.pi)
plt.show()
# LLM решил ешё что-то нарисовать :)
# Бонус: Анимация броска тела (интерактивная демонстрация)
from matplotlib.animation import FuncAnimation
from IPython.display import HTML
import numpy as np
import matplotlib.pyplot as plt
# Параметры броска
g = 9.81
v0 = 20
theta = np.radians(45)
t_max = 2 * v0 * np.sin(theta) / g
t = np.linspace(0, t_max, 50)
x = v0 * np.cos(theta) * t
y = v0 * np.sin(theta) * t - 0.5 * g * t**2
# Создаем анимацию
fig, ax = plt.subplots(figsize=(10, 6))
ax.set_xlim(0, max(x) + 5)
ax.set_ylim(0, max(y) + 5)
ax.set_xlabel('Расстояние, м')
ax.set_ylabel('Высота, м')
ax.set_title('Анимация движения тела')
ax.grid(True, alpha=0.3)
trajectory, = ax.plot([], [], 'b-', linewidth=2)
point, = ax.plot([], [], 'ro', markersize=8)
def animate(i):
trajectory.set_data(x[:i+1], y[:i+1])
point.set_data([x[i]], [y[i]])
return trajectory, point
ani = FuncAnimation(fig, animate, frames=len(t), interval=100, blit=True)
plt.close()
# Для отображения в Jupyter
HTML(ani.to_jshtml())
# Короче, LLM стало скучно :)))
# Более плавная анимация с большим количеством кадров
t_smooth = np.linspace(0, t_max, 200)
x_smooth = v0 * np.cos(theta) * t_smooth
y_smooth = v0 * np.sin(theta) * t_smooth - 0.5 * g * t_smooth**2
fig, ax = plt.subplots(figsize=(10, 6))
ax.set_xlim(0, max(x_smooth) + 5)
ax.set_ylim(0, max(y_smooth) + 5)
ax.set_xlabel('Расстояние, м')
ax.set_ylabel('Высота, м')
ax.set_title('Плавная анимация движения тела')
ax.grid(True, alpha=0.3)
trajectory, = ax.plot([], [], 'b-', linewidth=2, alpha=0.7)
point, = ax.plot([], [], 'ro', markersize=10)
info_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)
def animate_smooth(i):
trajectory.set_data(x_smooth[:i+1], y_smooth[:i+1])
point.set_data([x_smooth[i]], [y_smooth[i]])
# Добавляем информацию о времени и координатах
info_text.set_text(f'Время: {t_smooth[i]:.2f} с\n'
f'x = {x_smooth[i]:.2f} м\n'
f'y = {y_smooth[i]:.2f} м\n'
f'Скорость: {np.sqrt((v0*np.cos(theta))**2 + (v0*np.sin(theta) - g*t_smooth[i])**2):.2f} м/с')
return trajectory, point, info_text
ani_smooth = FuncAnimation(fig, animate_smooth, frames=len(t_smooth), interval=50, blit=True)
plt.close()
HTML(ani_smooth.to_jshtml())
# Ну и ещё один пример от LLM :)
# Движение по эллиптической орбите
t_orbit = np.linspace(0, 2*np.pi, 100)
a, b = 5, 3 # полуоси эллипса
x_orbit = a * np.cos(t_orbit)
y_orbit = b * np.sin(t_orbit)
fig, ax = plt.subplots(figsize=(8, 8))
ax.set_xlim(-6, 6)
ax.set_ylim(-4, 4)
ax.set_aspect('equal')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('Движение по эллиптической орбите')
ax.grid(True, alpha=0.3)
orbit, = ax.plot([], [], 'b-', linewidth=1, alpha=0.5)
planet, = ax.plot([], [], 'ro', markersize=15)
center = ax.plot(0, 0, 'yo', markersize=10, label='Центр')[0]
def animate_orbit(i):
orbit.set_data(x_orbit[:i+1], y_orbit[:i+1])
planet.set_data([x_orbit[i]], [y_orbit[i]])
return orbit, planet
ani_orbit = FuncAnimation(fig, animate_orbit, frames=len(t_orbit), interval=100, blit=True)
plt.legend()
plt.close()
HTML(ani_orbit.to_jshtml())
Обзор Latex.¶
Предполагается, что код ниже лектор будет тестировать у себя в Overleaf.com .
Коды ниже нужно просто скопировать и запустить у себя в Overleaf.
По крайней мере, коды тестировались именно в Overleaf.
# 1. Базовый документ с формулами (легкий уровень)
'''
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{amsmath}
\usepackage{amssymb}
\title{Введение в \LaTeX\ для физиков}
\author{Ваше Имя}
\date{\today}
\begin{document}
\maketitle
\section{Основные математические формулы}
\subsection{Уравнения механики}
Второй закон Ньютона:
\[
\vec{F} = m\vec{a}
\]
Кинетическая энергия:
\[
E_k = \frac{mv^2}{2}
\]
\subsection{Уравнения электродинамики}
Уравнения Максвелла в вакууме:
\begin{align*}
\nabla \cdot \mathbf{E} &= \frac{\rho}{\varepsilon_0} \\
\nabla \cdot \mathbf{B} &= 0 \\
\nabla \times \mathbf{E} &= -\frac{\partial \mathbf{B}}{\partial t} \\
\nabla \times \mathbf{B} &= \mu_0\mathbf{J} + \mu_0\varepsilon_0\frac{\partial \mathbf{E}}{\partial t}
\end{align*}
\end{document}
''';
# Для второго примеры выполните код ниже.
!wget https://cs10.pikabu.ru/post_img/2018/07/10/4/1531199339121474094.jpg
!mv 1531199339121474094.jpg graph.jpg
!ls
# Хотя лучше использовать .png, но тут чисто для красоты :)
# Нужно загрузить к себе в Overleaf файл graph.jpg,
# либо скачать по ссылке выше (только не забудьте переименовать на graph.jpg).
# 2. Документ с графиками и таблицами (средний уровень)
'''
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage{booktabs}
\usepackage{caption}
\title{Лабораторная работа: Изучение колебаний}
\author{Студент: Иванов И.И.}
\begin{document}
\maketitle
\section{Экспериментальные данные}
Результаты измерений периода колебаний маятника:
\begin{table}[h!]
\centering
\caption{Зависимость периода от длины маятника}
\begin{tabular}{ccc}
\toprule
Длина, м & Период, с & Погрешность, с \\
\midrule
0.5 & 1.42 & 0.05 \\
1.0 & 2.01 & 0.03 \\
1.5 & 2.46 & 0.04 \\
2.0 & 2.83 & 0.02 \\
\bottomrule
\end{tabular}
\end{table}
\section{Теоретический анализ}
Формула периода математического маятника:
\[
T = 2\pi\sqrt{\frac{L}{g}}
\]
где $L$ -- длина маятника, $g$ -- ускорение свободного падения.
\section{Графики}
\begin{figure}[h!]
\centering
\includegraphics[width=1.1\textwidth]{graph.jpg}
\caption{График зависимости периода от длины маятника}
\label{fig:graph}
\end{figure}
\end{document}
''';
# 3. Сложный документ с физическими вычислениями
'''
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{amsmath}
\usepackage{physics}
\usepackage{siunitx}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\title{Квантовая механика: Частица в ящике}
\author{Проф. Петров П.П.}
\begin{document}
\maketitle
\section{Волновые функции и энергетические уровни}
Рассмотрим частицу массы $m$ в одномерном ящике шириной $L$.
\subsection{Стационарное уравнение Шрёдингера}
\[
-\frac{\hbar^2}{2m}\dv[2]{\psi}{x} = E\psi
\]
с граничными условиями: $\psi(0) = \psi(L) = 0$.
\subsection{Решение}
Волновые функции:
\[
\psi_n(x) = \sqrt{\frac{2}{L}}\sin\left(\frac{n\pi x}{L}\right)
\]
Энергетические уровни:
\[
E_n = \frac{n^2\pi^2\hbar^2}{2mL^2}
\]
\subsection{Пример вычислений}
Для электрона ($m = \SI{9.1e-31}{kg}$) в ящике шириной \SI{1}{nm}:
\begin{align*}
E_1 &= \frac{(1)^2\pi^2(\SI{1.05e-34}{J\cdot s})^2}{2\times\SI{9.1e-31}{kg}\times(\SI{1e-9}{m})^2} \\
&= \SI{6.02e-20}{J} = \SI{0.376}{eV}
\end{align*}
\section{Визуализация волновых функций}
\begin{figure}[h!]
\centering
\begin{tikzpicture}[scale=1.2]
% Оси
\draw[->] (0,0) -- (5,0) node[right] {$x$};
\draw[->] (0,-2) -- (0,2) node[above] {$\psi_n(x)$};
% Ящик
\draw[thick] (0,0) -- (0,-0.1) node[below] {0};
\draw[thick] (4,0) -- (4,-0.1) node[below] {$L$};
\draw[thick] (0,0) -- (4,0);
% Волновые функции
\draw[blue, thick, domain=0:4, samples=100]
plot (\x, {1.5*sin(pi*\x r)});
\draw[red, thick, domain=0:4, samples=100]
plot (\x, {1.2*sin(2*pi*\x r)});
\draw[green, thick, domain=0:4, samples=100]
plot (\x, {0.9*sin(3*pi*\x r)});
% Подписи
\node[blue, right] at (4.2, 1.5) {$\psi_1$};
\node[red, right] at (4.2, 1.2) {$\psi_2$};
\node[green, right] at (4.2, 0.9) {$\psi_3$};
\end{tikzpicture}
\caption{Первые три волновые функции частицы в ящике}
\end{figure}
\end{document}
''';
# 4. Презентация с Beamer (для лекций)
'''
\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{amsmath}
\usepackage{graphicx}
\usetheme{Madrid}
\title{Введение в специальную теорию относительности}
\author{Доцент Сидоров С.С.}
\date{2025}
\begin{document}
\frame{\titlepage}
\begin{frame}
\frametitle{Постулаты СТО}
\begin{block}{Первый постулат (принцип относительности)}
Законы физики одинаковы во всех инерциальных системах отсчета
\end{block}
\begin{block}{Второй постулат}
Скорость света в вакууме постоянна и не зависит от движения источника
\end{block}
\[
c = \SI{3e8}{m/s}
\]
\end{frame}
\begin{frame}
\frametitle{Преобразования Лоренца}
\begin{align*}
t' &= \gamma\left(t - \frac{vx}{c^2}\right) \\
x' &= \gamma(x - vt) \\
y' &= y \\
z' &= z
\end{align*}
где $\gamma = \dfrac{1}{\sqrt{1 - \frac{v^2}{c^2}}}$ -- лоренц-фактор
\end{frame}
\begin{frame}
\frametitle{Релятивистские эффекты}
\begin{itemize}
\item<1-> \textbf{Сокращение длин}
\[
L = L_0\sqrt{1 - \frac{v^2}{c^2}}
\]
\item<2-> \textbf{Замедление времени}
\[
\Delta t = \frac{\Delta t_0}{\sqrt{1 - \frac{v^2}{c^2}}}
\]
\item<3-> \textbf{Релятивистский импульс}
\[
p = \frac{mv}{\sqrt{1 - \frac{v^2}{c^2}}}
\]
\end{itemize}
\end{frame}
\end{document}
''';
# 5. Лабораторный журнал с экспериментами
'''
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage{mhchem}
\usepackage{siunitx}
\title{Лабораторный журнал по физике}
\author{Группа Ф-01}
\begin{document}
\maketitle
\section{Эксперимент 1: Определение ускорения свободного падения}
\subsection{Цель работы}
Определить значение $g$ с помощью математического маятника.
\subsection{Оборудование}
\begin{itemize}
\item Маятник с регулируемой длиной
\item Секундомер
\item Линейка
\end{itemize}
\subsection{Ход работы}
Измеряем период колебаний для разных длин:
\[
T = 2\pi\sqrt{\frac{L}{g}} \Rightarrow g = \frac{4\pi^2 L}{T^2}
\]
\subsection{Результаты}
\begin{table}[h!]
\centering
\begin{tabular}{|c|c|c|}
\hline
$L$ (м) & $T$ (с) & $g$ (м/с²) \\
\hline
0.50 & 1.42 & 9.78 \\
1.00 & 2.01 & 9.76 \\
1.50 & 2.46 & 9.80 \\
2.00 & 2.83 & 9.86 \\
\hline
\end{tabular}
\end{table}
\subsection{Вывод}
Среднее значение: $g = \SI{9.80 \pm 0.04}{m/s^2}$
\end{document}
''';
Примеры Overleaf шаблонов также можно посмортеть тут.
Бонус: округление чисел в Python.¶
print(round(0.6))
print(round(0.5))
print(round(1.6))
print(round(1.5))
# Почему так идёт округление?
# Потому что тут используется round half to even или banker's rounding,
# то есть банковское округление или округление банкира.
# А не математическое округление, к которому вы могли привыкнуть.
Это написано тут. IEEE Standard for Floating-Point Arithmetic (IEEE 754)
Ссылка на Вики про это.
print("Банковское округление (round half to even):")
numbers = [0.5, 1.5, 2.5, 3.5, 4.5, 5.5]
for num in numbers:
print(f"round({num}) = {round(num)}")
# Сравнение с школьным округлением:
def school_round(x):
"""Школьное округление (всегда вверх от 0.5)"""
return int(x + 0.5) if x >= 0 else int(x - 0.5)
print("\nСравнение методов округления:")
print("Число | Банковское | Школьное")
print("-" * 30)
test_numbers = [0.5, 1.5, 2.5, 3.5, -0.5, -1.5, -2.5]
for num in test_numbers:
bank = round(num)
school = school_round(num)
print(f"{num:5.1f} | {bank:10} | {school:9}")
# Округление до N знаков:
print("\nОкругление до знаков после запятой:")
numbers = [3.14159, 2.71828, 1.23456789]
for num in numbers:
for digits in range(4):
print(f"round({num}, {digits}) = {round(num, digits)}")
print()
# Почему банковское округление лучше?
# Статистическое преимущество:
# при большом количестве операций ошибки округления
# компенсируются (половина округляется вверх, половина - вниз).
# Если нужно школьное округление:
import math
def always_up_round(x):
"""Всегда округляет 0.5 вверх"""
return math.floor(x + 0.5)
print("Школьное округление (всегда вверх):")
for num in [0.5, 1.5, 2.5, 3.5]:
print(f"always_up_round({num}) = {always_up_round(num)}")
# Особые случаи:
print("\nОсобые случаи:")
print(f"round(2.675, 2) = {round(2.675, 2)}") # 2.67, а не 2.68!
print("Из-за двоичного представления 2.675 ≈ 2.6749999999999998")
Бонус: проблемы представления чисел в компьютере.¶
# Вещественные числа (float) - приближенное представление
# Вещественные числа (IEEE 754 double precision)
x = 0.1
y = 0.2
z = x + y
print("Вещественные числа:")
print(f"x = 0.1, представление: {x}")
print(f"y = 0.2, представление: {y}")
print(f"z = x + y = {z}")
print(f"0.1 + 0.2 == 0.3? {z == 0.3}")
print(f"Точное значение z: {z:.20f}")
print()
# Проблема точности
print("Проблема точности вещественных чисел:")
for i in [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]:
print(f"{i} = {i:.20f}")
print()
# Сравнение целых и вещественных чисел
print("Сравнение целых и вещественных чисел:")
print(f"Целое 1: {1}, тип: {type(1)}")
print(f"Вещественное 1.0: {1.0}, тип: {type(1.0)}")
print(f"1 == 1.0: {1 == 1.0}")
print(f"1 is 1.0: {1 is 1.0}") # Разные объекты!
print()
# Преобразование типов
print("Преобразование типов:")
print(f"int(3.14) = {int(3.14)}")
print(f"float(42) = {float(42)}")
print(f"int('123') = {int('123')}")
print(f"float('3.14') = {float('3.14')}")
print()
# Особые значения вещественных чисел
import math
print("Особые значения float:")
print(f"Бесконечность: {math.inf}, тип: {type(math.inf)}")
print(f"Отрицательная бесконечность: {-math.inf}")
print(f"Не число (NaN): {math.nan}")
print(f"NaN == NaN: {math.nan == math.nan}") # False!
print(f"math.isnan(math.nan): {math.isnan(math.nan)}") # True
print()
# Проверка на особые значения
values = [1.0, 0.0, -0.0, math.inf, -math.inf, math.nan]
for val in values:
print(f"{val:8}: inf={math.isinf(val)}, nan={math.isnan(val)}, finite={math.isfinite(val)}")
print()
# Машинная эпсилон и точность
# Машинная эпсилон (наименьшее число такое, что 1.0 + eps != 1.0)
machine_epsilon = 1.0
while 1.0 + machine_epsilon != 1.0:
machine_epsilon /= 2
machine_epsilon *= 2
print("Точность представления:")
print(f"Машинная эпсилон: {machine_epsilon}")
print(f"1.0 + машинная эпсилон: {1.0 + machine_epsilon}")
print(f"1.0 + машинная эпсилон/2: {1.0 + machine_epsilon/2}")
print()
# Потеря точности при сложении чисел разного масштаба
big = 1e15
small = 1e-15
result = big + small - big
print("Потеря точности:")
print(f"big = {big}")
print(f"small = {small}")
print(f"big + small - big = {result}")
print(f"Ожидалось: {small}")
print()
# Практические примеры проблем
print("Практические проблемы вещественных чисел:")
# Накопление ошибки
total = 0.0
for i in range(1000):
total += 0.1
print(f"Сумма 1000 раз по 0.1: {total}")
print(f"Ожидалось: 100.0")
print(f"Разница: {total - 100.0}")
# Сравнение вещественных чисел
print("\nПравильное сравнение вещественных чисел:")
a = 0.1 + 0.2
b = 0.3
tolerance = 1e-10
print(f"a == b: {a == b}")
print(f"abs(a - b) < tolerance: {abs(a - b) < tolerance}")
print(f"math.isclose(a, b): {math.isclose(a, b)}")
Спасибо и успехов :)