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()
No description has been provided for this image
No description has been provided for this image
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()
No description has been provided for this image
No description has been provided for this image