In [59]:
import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry import Polygon, Point, box, MultiPolygon
from shapely.ops import unary_union
import matplotlib.patches as patches
from matplotlib.patches import PathPatch
from matplotlib.path import Path
import cmath
def create_plane():
# Создаем исходную область - плоскость с выколотым началом координат
plane = box(-5, -5, 5, 5)
origin_hole = box(-0.1, -0.1, 0.1, 0.1)
full_region = plane.difference(origin_hole)
return full_region
def create_circle():
# Создаем круг радиуса π
theta = np.linspace(0, 2*np.pi, 100)
r = np.pi # Радиус равен π
x = r * np.cos(theta)
y = r * np.sin(theta)
circle = Polygon(zip(x, y))
return circle
def create_half_plane():
# Создаем верхнюю полуплоскость
plane = box(-5, 0, 5, 5)
return plane
def plot_region(ax, region, title, with_ray=False, is_circle=False):
# Функция для отображения области со штриховкой
if isinstance(region, (MultiPolygon, list)):
for poly in region:
path = Path.make_compound_path(
Path(np.asarray(poly.exterior.coords)),
*[Path(np.asarray(interior.coords)) for interior in poly.interiors]
)
patch = PathPatch(
path,
facecolor='none',
hatch='///',
edgecolor='black',
alpha=0.3
)
ax.add_patch(patch)
else:
if hasattr(region, 'exterior'):
path = Path.make_compound_path(
Path(np.asarray(region.exterior.coords)),
*[Path(np.asarray(interior.coords)) for interior in region.interiors]
)
else:
path = Path(np.asarray(region.coords))
patch = PathPatch(
path,
facecolor='none',
hatch='///',
edgecolor='black',
alpha=0.3
)
ax.add_patch(patch)
# Добавляем луч для выколотых точек (если нужно)
if with_ray:
# Добавляем только отрицательный луч (от -∞ до 0)
x = np.array([-5, 0])
y = np.zeros_like(x)
ax.plot(x, y, 'r--', linewidth=2)
# Если это круг, добавляем радиус и метку π
if is_circle:
# Рисуем радиус
ax.plot([0, np.pi], [0, 0], 'k-', linewidth=1)
# Добавляем метку π у границы круга
ax.text(np.pi + 0.2, 0.2, 'π', fontsize=12)
# Добавляем выколотую точку в начале координат для плоскости
if not is_circle:
ax.plot(0, 0, 'rx', markersize=10)
# Настраиваем оси
ax.set_aspect('equal')
ax.set_xlim(-5, 5)
ax.set_ylim(-5, 5)
ax.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
ax.axvline(x=0, color='k', linestyle='-', linewidth=0.5)
ax.set_title(title)
def plot_forward_mapping():
# Прямое отображение: из плоскости в круг
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(15, 15))
# Шаг 1: Исходная плоскость с выколотым началом координат и лучом
initial_plane = create_plane()
plot_region(ax1, initial_plane, 'Шаг 1: Исходная плоскость\nс выколотым началом координат', with_ray=True)
# Шаг 2: Отражение (z → -z)
reflected_plane = create_plane()
plot_region(ax2, reflected_plane, 'Шаг 2: Отражение\nz → -z', with_ray=True)
# Шаг 3: Извлечение корня (w → sqrt(w))
sqrt_plane = create_half_plane()
plot_region(ax3, sqrt_plane, 'Шаг 3: Извлечение корня\nw → sqrt(w)', with_ray=True)
# Шаг 4: Преобразование Мёбиуса
final_circle = create_circle()
plot_region(ax4, final_circle, 'Шаг 4: Преобразование Мёбиуса\nw → i(w-i)/(w+i)', is_circle=True)
plt.suptitle('Прямое отображение: из плоскости в круг', fontsize=16)
plt.tight_layout()
plt.show()
def plot_backward_mapping():
# Обратное отображение: из круга в плоскость
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(15, 15))
# Шаг 1: Исходный круг радиуса π
initial_circle = create_circle()
plot_region(ax1, initial_circle, 'Шаг 1: Круг радиуса π', is_circle=True)
# Шаг 2: Обратное преобразование Мёбиуса
mobius_plane = create_half_plane()
plot_region(ax2, mobius_plane, 'Шаг 2: Обратное преобразование Мёбиуса\nw → (w+i)/(iw+1)', with_ray=True)
# Шаг 3: Возведение в квадрат
squared_plane = create_plane()
plot_region(ax3, squared_plane, 'Шаг 3: Возведение в квадрат\nw → w²', with_ray=True)
# Шаг 4: Отражение
final_plane = create_plane()
plot_region(ax4, final_plane, 'Шаг 4: Отражение\nw → -w', with_ray=True)
plt.suptitle('Обратное отображение: из круга в плоскость', fontsize=16)
plt.tight_layout()
plt.show()
def main():
# Строим оба отображения
plot_forward_mapping()
plot_backward_mapping()
if __name__ == "__main__":
main()
In [60]:
import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry import Polygon, Point, box, MultiPolygon
from shapely.ops import unary_union
import matplotlib.patches as patches
from matplotlib.patches import PathPatch
from matplotlib.path import Path
import cmath
def create_plane():
# Создаем исходную область - плоскость с выколотым началом координат
plane = box(-5, -5, 5, 5)
origin_hole = box(-0.1, -0.1, 0.1, 0.1)
full_region = plane.difference(origin_hole)
return full_region
def create_circle():
# Создаем круг радиуса π
theta = np.linspace(0, 2*np.pi, 100)
r = np.pi
x = r * np.cos(theta)
y = r * np.sin(theta)
circle = Polygon(zip(x, y))
return circle
def create_half_plane():
# Создаем верхнюю полуплоскость
plane = box(-5, 0, 5, 5)
return plane
def plot_region(ax, region, title, with_ray=False, ray_direction='left', is_circle=False):
"""
ray_direction может быть: 'left' (влево), 'down' (вниз)
"""
if isinstance(region, (MultiPolygon, list)):
for poly in region:
path = Path.make_compound_path(
Path(np.asarray(poly.exterior.coords)),
*[Path(np.asarray(interior.coords)) for interior in poly.interiors]
)
patch = PathPatch(
path,
facecolor='none',
hatch='///',
edgecolor='black',
alpha=0.3
)
ax.add_patch(patch)
else:
if hasattr(region, 'exterior'):
path = Path.make_compound_path(
Path(np.asarray(region.exterior.coords)),
*[Path(np.asarray(interior.coords)) for interior in region.interiors]
)
else:
path = Path(np.asarray(region.coords))
patch = PathPatch(
path,
facecolor='none',
hatch='///',
edgecolor='black',
alpha=0.3
)
ax.add_patch(patch)
if with_ray:
if ray_direction == 'left':
# Луч влево
x = np.array([-5, 0])
y = np.zeros_like(x)
ax.plot(x, y, 'r--', linewidth=2)
elif ray_direction == 'down':
# Луч вниз
x = np.zeros(2)
y = np.array([0, -5])
ax.plot(x, y, 'r--', linewidth=2)
if is_circle:
# Рисуем радиус
ax.plot([0, np.pi], [0, 0], 'k-', linewidth=1)
# Добавляем метку π у границы круга
ax.text(np.pi + 0.2, 0.2, 'π', fontsize=12)
if not is_circle:
ax.plot(0, 0, 'rx', markersize=10)
ax.set_aspect('equal')
ax.set_xlim(-5, 5)
ax.set_ylim(-5, 5)
ax.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
ax.axvline(x=0, color='k', linestyle='-', linewidth=0.5)
ax.set_title(title)
def plot_forward_mapping():
# Прямое отображение: из плоскости в круг
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(15, 15))
# Шаг 1: Исходная плоскость с выколотым началом координат и лучом
initial_plane = create_plane()
plot_region(ax1, initial_plane, 'Шаг 1: Исходная плоскость\nс выколотым началом координат',
with_ray=True, ray_direction='left')
# Шаг 2: Отражение (z → -z)
reflected_plane = create_plane()
plot_region(ax2, reflected_plane, 'Шаг 2: Отражение\nz → -z',
with_ray=True, ray_direction='left')
# Шаг 3: Извлечение корня (w → sqrt(w))
sqrt_plane = create_half_plane()
plot_region(ax3, sqrt_plane, 'Шаг 3: Извлечение корня\nw → sqrt(w)',
with_ray=True, ray_direction='down')
# Шаг 4: Преобразование Мёбиуса
final_circle = create_circle()
plot_region(ax4, final_circle, 'Шаг 4: Преобразование Мёбиуса\nw → i(w-i)/(w+i)', is_circle=True)
plt.suptitle('Прямое отображение: из плоскости в круг', fontsize=16)
plt.tight_layout()
plt.show()
def plot_backward_mapping():
# Обратное отображение: из круга в плоскость
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(15, 15))
# Шаг 1: Исходный круг
initial_circle = create_circle()
plot_region(ax1, initial_circle, 'Шаг 1: Круг радиуса π', is_circle=True)
# Шаг 2: Обратное преобразование Мёбиуса
mobius_plane = create_half_plane()
plot_region(ax2, mobius_plane, 'Шаг 2: Обратное преобразование Мёбиуса\nw → (w+i)/(iw+1)',
with_ray=True, ray_direction='down')
# Шаг 3: Возведение в квадрат
squared_plane = create_plane()
plot_region(ax3, squared_plane, 'Шаг 3: Возведение в квадрат\nw → w²',
with_ray=True, ray_direction='left')
# Шаг 4: Отражение
final_plane = create_plane()
plot_region(ax4, final_plane, 'Шаг 4: Отражение\nw → -w',
with_ray=True, ray_direction='left')
plt.suptitle('Обратное отображение: из круга в плоскость', fontsize=16)
plt.tight_layout()
plt.show()
def main():
# Строим оба отображения
plot_forward_mapping()
plot_backward_mapping()
if __name__ == "__main__":
main()