Visualization of Complex Function Mapping Homotopy

版本 1.0.0 (3.3 KB) 作者: Chun
A simple function artistically visualizes the complex function transformation with homotopy.
0.0 次下载
更新时间 2025/11/20

查看许可证

function complex_viz_combined()
% --- Configuration ---
config.density_2d = 100; % Grid density for 2D
config.density_3d = 80; % Grid density for 3D
config.anim_steps = 150; % Frames per animation
config.bg_color = [0.02 0.02 0.05]; % Dark background
config.clamp_limit = 12; % Visual extent limit
config.z_limit = 8; % Max height for 3D plots
config.line_width = 1.0;
% --- Setup Canvas ---
f = figure('Name', 'The Ultimate Math Visualization', ...
'NumberTitle', 'off', ...
'Color', config.bg_color, ...
'Position', [100, 100, 1280, 720], ...
'MenuBar', 'none', 'ToolBar', 'none');
ax = axes('Parent', f, 'Color', config.bg_color, ...
'XColor', [0.4 0.4 0.5], 'YColor', [0.4 0.4 0.5], 'ZColor', [0.4 0.4 0.5], ...
'LineWidth', 1, 'NextPlot', 'replacechildren');
% --- Scene Definitions ---
scenes = struct();
idx = 1;
% 1. Squaring (z^2)
scenes(idx).mode = '2D'; scenes(idx).name = 'Squaring (2D): z^2';
scenes(idx).func = @(z) z.^2;
scenes(idx).xlim = [-3, 3]; scenes(idx).ylim = [-3, 3];
scenes(idx).view = [-9, 9];
idx = idx + 1;
scenes(idx).mode = '3D'; scenes(idx).name = 'The Bowl (3D): z^2';
scenes(idx).func = @(z) z.^2;
scenes(idx).xlim = [-2, 2]; scenes(idx).ylim = [-2, 2];
scenes(idx).view = [-4, 4];
idx = idx + 1;
% 2. Exponential (e^z)
scenes(idx).mode = '2D'; scenes(idx).name = 'Exponential (2D): e^z';
scenes(idx).func = @(z) exp(z);
scenes(idx).xlim = [-2.5, 2.5]; scenes(idx).ylim = [-2*pi, 2*pi];
scenes(idx).view = [-10, 10];
idx = idx + 1;
scenes(idx).mode = '3D'; scenes(idx).name = 'The Spiral Slope (3D): e^z';
scenes(idx).func = @(z) exp(z);
scenes(idx).xlim = [-2, 2]; scenes(idx).ylim = [-3*pi, 3*pi];
scenes(idx).view = [-8, 8];
idx = idx + 1;
% 3. Sine (sin(z))
scenes(idx).mode = '2D'; scenes(idx).name = 'Sine Wave (2D): sin(z)';
scenes(idx).func = @(z) sin(z);
scenes(idx).xlim = [-2*pi, 2*pi]; scenes(idx).ylim = [-2.5, 2.5];
scenes(idx).view = [-6, 6];
idx = idx + 1;
scenes(idx).mode = '3D'; scenes(idx).name = 'The Modular Wave (3D): sin(z)';
scenes(idx).func = @(z) sin(z);
scenes(idx).xlim = [-2*pi, 2*pi]; scenes(idx).ylim = [-2, 2];
scenes(idx).view = [-4, 4];
idx = idx + 1;
% 4. Inversion (1/z)
scenes(idx).mode = '2D'; scenes(idx).name = 'Inversion (2D): 1/z';
scenes(idx).func = @(z) 1./z;
scenes(idx).xlim = [-3, 3]; scenes(idx).ylim = [-3, 3];
scenes(idx).view = [-6, 6];
idx = idx + 1;
scenes(idx).mode = '3D'; scenes(idx).name = 'Gravity Well (3D): 1/z';
scenes(idx).func = @(z) 1./z;
scenes(idx).xlim = [-2.5, 2.5]; scenes(idx).ylim = [-2.5, 2.5];
scenes(idx).view = [-4, 4];
idx = idx + 1;
% 5. Riemann Zeta
scenes(idx).mode = '2D'; scenes(idx).name = 'Riemann Zeta (2D): Chaos';
scenes(idx).func = @safe_zeta;
scenes(idx).xlim = [-12, 12]; scenes(idx).ylim = [-12, 12];
scenes(idx).view = [-10, 10];
idx = idx + 1;
scenes(idx).mode = '3D'; scenes(idx).name = 'Riemann Landscape (3D)';
scenes(idx).func = @safe_zeta;
scenes(idx).xlim = [-12, 12]; scenes(idx).ylim = [-12, 12];
scenes(idx).view = [-10, 10];
idx = idx + 1;
% --- Main Loop ---
for s = 1:length(scenes)
fprintf('Rendering %d/%d: %s...\n', s, length(scenes), scenes(s).name);
try
if strcmp(scenes(s).mode, '2D')
render_2d(f, ax, scenes(s), config);
else
render_3d(f, ax, scenes(s), config);
end
catch ME
fprintf('Error: %s\n', ME.message);
end
pause(1); % Pause between scenes
end
disp('Visualization Complete.');
end
% ==============================================================================
% 2D RENDER ENGINE
% ==============================================================================
function render_2d(f, ax, scene, config)
cla(ax); view(ax, 2); axis(ax, 'equal'); grid(ax, 'on'); hold(ax, 'on');
ax.GridAlpha = 0.15; ax.GridColor = 'w';
title(ax, scene.name, 'Color', [0.8 0.9 1], 'FontSize', 16, 'FontName', 'FixedWidth');
% Generate Grid
nx = config.density_2d; ny = config.density_2d;
x = linspace(scene.xlim(1), scene.xlim(2), nx);
y = linspace(scene.ylim(1), scene.ylim(2), ny);
[X, Y] = meshgrid(x, y);
Z_orig = X + 1i*Y;
try Z_target = scene.func(Z_orig); catch, return; end
% Apply NaN Clamping for clean cutouts
mask = abs(Z_target) > config.clamp_limit;
Z_target(mask) = NaN;
% Initialize Lines
h_lines = gobjects(1, ny);
v_lines = gobjects(1, nx);
cmap_h = [linspace(0,0,ny)', linspace(1,0.4,ny)', linspace(1,1,ny)'];
cmap_v = [linspace(1,1,nx)', linspace(0,0.5,nx)', linspace(1,0,nx)'];
for k = 1:ny
h_lines(k) = plot(ax, real(Z_orig(k,:)), imag(Z_orig(k,:)), ...
'Color', [cmap_h(k,:) 0.6], 'LineWidth', config.line_width);
end
for k = 1:nx
v_lines(k) = plot(ax, real(Z_orig(:,k)), imag(Z_orig(:,k)), ...
'Color', [cmap_v(k,:) 0.6], 'LineWidth', config.line_width);
end
% Set View
xlim(ax, scene.xlim*1.2); ylim(ax, scene.ylim*1.2);
% Animation Loop
t_vals = linspace(0, 1, config.anim_steps);
t_smooth = 1 ./ (1 + exp(-10 * (t_vals - 0.5)));
t_smooth = (t_smooth - min(t_smooth)) / (max(t_smooth) - min(t_smooth));
for t = t_smooth
Z_curr = (1-t)*Z_orig + t*Z_target;
for k = 1:ny, set(h_lines(k), 'XData', real(Z_curr(k,:)), 'YData', imag(Z_curr(k,:))); end
for k = 1:nx, set(v_lines(k), 'XData', real(Z_curr(:,k)), 'YData', imag(Z_curr(:,k))); end
% Dynamic Camera Zoom
curr_view = (1-t)*(scene.xlim*1.2) + t*[scene.view(1) scene.view(2)];
xlim(ax, curr_view); ylim(ax, curr_view);
drawnow;
end
end
% ==============================================================================
% 3D RENDER ENGINE
% ==============================================================================
function render_3d(f, ax, scene, config)
cla(ax); grid(ax, 'on'); hold(ax, 'on');
ax.GridAlpha = 0.15; ax.GridColor = 'w';
xlabel(ax,'Re'); ylabel(ax,'Im'); zlabel(ax,'Magnitude');
title(ax, scene.name, 'Color', [1 0.8 0.5], 'FontSize', 16, 'FontName', 'FixedWidth');
nx = config.density_3d; ny = config.density_3d;
x = linspace(scene.xlim(1), scene.xlim(2), nx);
y = linspace(scene.ylim(1), scene.ylim(2), ny);
[X, Y] = meshgrid(x, y);
Z_orig = X + 1i*Y;
try Z_target = scene.func(Z_orig); catch, return; end
% 3D Coordinates
X_t = real(Z_target);
Y_t = imag(Z_target);
H_t = abs(Z_target);
% Clamping: NaN for horizontal overflow, Cap for vertical height
radii = abs(Z_target);
mask_xy = radii > config.clamp_limit;
X_t(mask_xy) = NaN;
Y_t(mask_xy) = NaN;
H_t(mask_xy) = NaN;
H_t(H_t > config.z_limit) = config.z_limit;
X_0 = real(Z_orig); Y_0 = imag(Z_orig); H_0 = zeros(size(Z_orig));
% Initialize Lines
h_lines = gobjects(1, ny);
v_lines = gobjects(1, nx);
cmap = spring(ny + nx);
for k = 1:ny
h_lines(k) = plot3(ax, X_0(k,:), Y_0(k,:), H_0(k,:), ...
'Color', [cmap(k,:) 0.7], 'LineWidth', config.line_width);
end
for k = 1:nx
v_lines(k) = plot3(ax, X_0(:,k), Y_0(:,k), H_0(:,k), ...
'Color', [cmap(k+ny,:) 0.7], 'LineWidth', config.line_width);
end
% Fixed View
axis(ax, 'equal');
xlim(ax, scene.view); ylim(ax, scene.view); zlim(ax, [0, config.z_limit]);
view(ax, 45, 35);
% Animation Loop
t_vals = linspace(0, 1, config.anim_steps);
t_smooth = 1 ./ (1 + exp(-10 * (t_vals - 0.5)));
t_smooth = (t_smooth - min(t_smooth)) / (max(t_smooth) - min(t_smooth));
for t = t_smooth
X_curr = (1-t)*X_0 + t*X_t;
Y_curr = (1-t)*Y_0 + t*Y_t;
H_curr = (1-t)*H_0 + t*H_t;
for k = 1:ny, set(h_lines(k), 'XData', X_curr(k,:), 'YData', Y_curr(k,:), 'ZData', H_curr(k,:)); end
for k = 1:nx, set(v_lines(k), 'XData', X_curr(:,k), 'YData', Y_curr(:,k), 'ZData', H_curr(:,k)); end
drawnow;
end
end
% --- Helper Functions ---
function z_out = safe_zeta(z_in)
try
z_out = zeta(z_in);
catch
% Fallback approximation if Symbolic Toolbox is missing
z_out = 0.5 ./ (z_in.^0.5) + sin(z_in*5)*0.1;
end
% Hard clamp for pole at s=1
z_out(abs(z_in - 1) < 0.15) = NaN;
end

引用格式

Chun (2025). Visualization of Complex Function Mapping Homotopy (https://ww2.mathworks.cn/matlabcentral/fileexchange/182649-visualization-of-complex-function-mapping-homotopy), MATLAB Central File Exchange. 检索时间: .

MATLAB 版本兼容性
创建方式 R2025b
兼容任何版本
平台兼容性
Windows macOS Linux

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!
版本 已发布 发行说明
1.0.0