You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为复数变量绘制颜色图/密度图以定位残差最小值?

问题描述

我有一个res函数,输入为复数变量omega,返回连分数残差(同样为复数)的绝对值。我需要测试不同的omega值,找到能使残差值最接近0的omega——这相当于寻找连分数残差方程的根。

先生成如下omega列表:

N = 400
omega = [complex(np.random.uniform(0.001, 15), np.random.uniform(0, 2)) for i in range(N)]

代入res函数后,截取部分omega列表如下:

omega = [(8.89186304186803+1.8580361935398448j), 
         (4.250554058118386+0.34692636983137204j),
         (13.77975011058525+0.4067498913305867j), 
         (11.848491447761512+1.1353493824887473j), 
         (5.368197310760776+1.603262808639006j), 
         (7.953834937525846+0.31087387982821735j),
         (12.589975089023985+1.9010925629632527j),
         (0.8533967396680111+0.9083830823882479j),
         (11.966071152073017+1.7535358294965886j), 
         (6.723597895069045+0.5943732982185757j)]

对应的残差绝对值列表为:

list_res = [2.1663149855057022, 12.202467603015915, 13.105388388645999, 
            3.524702335556132, 5.007101216080126, 2.1989779961023457, 
            4.6753139694285775, 1.82871868615581, 3.8247209107872857, 
            2.977690850044372]

我希望基于这些omega值和对应的残差绝对值生成颜色图或密度图,以此定位残差最接近0的局部最小值点。之前尝试过spb库的plot_complex函数,但它仅支持绘制符号函数。我想要生成带黑点(残差最小值位置)的颜色图效果。

解决方案

方法1:Matplotlib散点颜色图

将复数omega拆解为实部(x轴)和虚部(y轴),用残差绝对值作为点的颜色,同时标记残差最小的点:

import numpy as np
import matplotlib.pyplot as plt

# 拆分复数的实部与虚部
omega_real = [z.real for z in omega]
omega_imag = [z.imag for z in omega]

# 定位残差最小的点
min_idx = np.argmin(list_res)
min_omega = omega[min_idx]
min_res = list_res[min_idx]

# 绘制散点图
plt.figure(figsize=(10, 6))
scatter = plt.scatter(omega_real, omega_imag, c=list_res, cmap='viridis_r', s=50)
# 标记最小值点
plt.scatter(min_omega.real, min_omega.imag, color='black', s=200, marker='o', label=f'最小残差: {min_res:.4f}')

plt.colorbar(scatter, label='残差绝对值')
plt.xlabel('omega实部')
plt.ylabel('omega虚部')
plt.title('残差绝对值分布与最小值定位')
plt.legend()
plt.show()

方法2:KDE密度热力图

如果需要更平滑的分布展示,可使用核密度估计(KDE)生成热力图:

from scipy.stats import gaussian_kde

# 准备数据
data = np.vstack([omega_real, omega_imag])
# 以残差倒数为权重,让残差越小的点对密度贡献越高
kde = gaussian_kde(data, weights=1/np.array(list_res))

# 生成绘图网格
x_grid = np.linspace(min(omega_real), max(omega_real), 100)
y_grid = np.linspace(min(omega_imag), max(omega_imag), 100)
X, Y = np.meshgrid(x_grid, y_grid)
positions = np.vstack([X.ravel(), Y.ravel()])
Z = np.reshape(kde(positions).T, X.shape)

# 绘制密度图
plt.figure(figsize=(10, 6))
plt.contourf(X, Y, Z, cmap='viridis')
# 标记最小值点
plt.scatter(min_omega.real, min_omega.imag, color='black', s=200, marker='o', label=f'最小残差: {min_res:.4f}')

plt.colorbar(label='残差密度(值越高表示残差越小的概率越高)')
plt.xlabel('omega实部')
plt.ylabel('omega虚部')
plt.title('残差密度分布与最小值定位')
plt.legend()
plt.show()

补充提示

  • 两种方法均基于离散数据绘图,无需符号函数支持
  • 可调整cmap(颜色映射)、s(点大小)等参数适配视觉需求
  • 若需更精准的根定位,可在最小值点附近细化网格搜索,或用scipy.optimize.minimize直接求解res(omega)的最小值

内容的提问来源于stack exchange,提问作者Projetos Programação

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 00:14:55