Vlnové funkce

Tento projekt je demonstrací toho, jak lze simulovat šíření a interference vln a jejich interakce s prostředím, pomocí matematických modelů a počítačové simulace. Použití náhodných hodnot pro pozici zdrojů vlnění, jejich frekvenci a amplitudu, spolu s implementací klesající amplitudy s rostoucí vzdáleností od zdroje a odrážení vln od okrajů čtverce a jejich vzájemná interference, vytváří vizuálně zajímavé vzory, které ilustrují složitost vlnových interakcí v omezeném prostoru. Výsledky jsou vizualizovány pomocí černobílé barevné škály, která reprezentuje intenzitu vlnění v různých bodech čtvercového prostoru.

Simulace s 1 zdrojem vlnění:

Simulace s 2 zdroji vlnění:

Simulace s 3 zdroji vlnění:

Simulace s 5 zdroji vlnění:

Simulace s 10 zdroji vlnění:

Simulace s 50 zdroji vlnění:

Simulace s 100 zdroji vlnění:

Simulace s 500 zdroji vlnění:

Zdrojový kód
Zdrojový Python kód pro tento projekt je dostupný zde:

import numpy as np
import matplotlib.pyplot as plt
import os
import re

# Počet obrázků k vytvoření
num_images = 1

# Nastavení rozsahů pro náhodné hodnoty
frequency_range = (1, 50)  # Rozsah frekvencí vln
amplitude_range = (0.1, 1)  # Rozsah amplitud vln

# Počet zdrojů
number_of_sources = 3

# Velikost prostoru pro simulaci a rozlišení mřížky
space_size = 5
grid_resolution = 1000

for i in range(num_images):
    # Inicializace pole pro simulaci
    Z = np.zeros((grid_resolution, grid_resolution))

    # Vytvoření mřížky pro simulaci
    x = np.linspace(-space_size, space_size, grid_resolution)
    y = np.linspace(-space_size, space_size, grid_resolution)
    X, Y = np.meshgrid(x, y)

    # Generování náhodných zdrojů
    for _ in range(number_of_sources):
        source_position = np.random.uniform(-space_size, space_size, 2)
        frequency = np.random.uniform(*frequency_range)
        amplitude = np.random.uniform(*amplitude_range)

        # Výpočet vzdálenosti od zdroje a přidání vlny do simulace
        R = np.sqrt((X - source_position[0])**2 + (Y - source_position[1])**2)
        Z += amplitude * np.sin(frequency * R) / (R + 1)  # Přidání útlumu amplitudy

        # Odrážení vln od stěn
        for wall in [-space_size, space_size]:
            R_vertical = np.sqrt((X - 2*wall + source_position[0])**2 + (Y - source_position[1])**2)
            R_horizontal = np.sqrt((X - source_position[0])**2 + (Y - 2*wall + source_position[1])**2)
            Z += amplitude * np.sin(frequency * R_vertical) / (R_vertical + 1)
            Z += amplitude * np.sin(frequency * R_horizontal) / (R_horizontal + 1)

    # Vykreslení výsledku
    plt.figure(figsize=(10, 10))
    plt.imshow(Z, cmap='gray', extent=[-space_size, space_size, -space_size, space_size])
    plt.axis('off')
    
    # Před uložením obrázku použijte tight_layout pro optimalizaci rozložení
    #plt.tight_layout()

    # Uložení obrázku
    pattern = r"wave_interference_pattern_(\d+).png"
    existing_files = [f for f in os.listdir('.') if re.match(pattern, f)]
    if existing_files:
        numbers = [int(re.search(pattern, f).group(1)) for f in existing_files]
        max_number = max(numbers)
    else:
        max_number = 0
    file_name = f"wave_interference_pattern_{max_number + 1:05d}.png"
    plt.savefig(file_name, bbox_inches='tight', pad_inches=0, transparent=False, dpi=(grid_resolution*1.3)//10)
    plt.close()  # Zavření obrázku po uložení