如何为复数变量绘制颜色图/密度图以定位残差最小值?
问题描述
我有一个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
相关产品推荐
相关产品推荐

