Python绘制误差对数与kappa(√(N+M))关系图遇阻求助
修正误差对数与kappa关系图的绘制问题
我是Python新手,在绘制误差数组的对数与kappa(即(n+M)的平方根)的关系图时遇到困难,附上相关代码,求技术帮助。
原代码
F = np.array([np.power(z, 2).real]).T M= 5 #number of corners you are adding the poles too N = 7 #number of poles in each corner sigma = 4 #has to be 4 or greater error = [] for n in range(N): kappa = np.array([(n+M)**(1/2)]) Poles = [] Dist = [] for j in range(ncorners): dist = [] if angleCheck(polygon, j) < np.pi: dist = np.exp(-sigma*(np.sqrt(n+1)-np.sqrt(np.linspace(1,n+1,n+1)))) #dist = np.exp(-sigma*(np.sqrt(n)-np.sqrt(np.linspace(1,n+1,n)))) Dist.append(dist) for d in dist: Poles.append(new_pole(polygon,j,d,0,False)) else: dist = np.exp(-sigma*(np.sqrt(3*(n+1))-np.sqrt(np.linspace(1,3*(n+1),3*(n+1))))) Dist.append(dist) for d in dist: Poles.append(new_pole(polygon,j,d,0,False)) A = AMatrix(Poles, z, z_star, M) alpha = np.linalg.lstsq(A, F, rcond=None)[0] err = max(abs(A*alpha - F)/max(abs(F))) error.append(err[0,0]) plt.plot(np.log(error[n]), kappa) plt.show()
修正后的代码
import numpy as np import matplotlib.pyplot as plt # 需确保以下外部变量/函数已提前定义 # polygon = ... # 你的多边形对象 # z, z_star = ... # 对应复数变量 # ncorners = ... # 角落数量,需根据实际场景赋值 # def angleCheck(polygon, j): ... # 角度检查函数 # def new_pole(polygon, j, d, _, flag): ... # 生成极点函数 # def AMatrix(Poles, z, z_star, M): ... # 矩阵生成函数 F = np.array([np.power(z, 2).real]).T M = 5 # 极点添加的角落数量 N = 7 # 每个角落的极点数 sigma = 4 # 要求大于等于4 error = [] kappa_list = [] # 收集所有kappa值 for n in range(N): kappa = np.sqrt(n + M) kappa_list.append(kappa) Poles = [] Dist = [] # 将角落遍历逻辑与极点生成逻辑绑定 for j in range(ncorners): if angleCheck(polygon, j) < np.pi: dist = np.exp(-sigma * (np.sqrt(n+1) - np.sqrt(np.linspace(1, n+1, n+1)))) Dist.append(dist) for d in dist: Poles.append(new_pole(polygon, j, d, 0, False)) else: dist = np.exp(-sigma * (np.sqrt(3*(n+1)) - np.sqrt(np.linspace(1, 3*(n+1), 3*(n+1))))) Dist.append(dist) for d in dist: Poles.append(new_pole(polygon, j, d, 0, False)) A = AMatrix(Poles, z, z_star, M) alpha = np.linalg.lstsq(A, F, rcond=None)[0] # 用矩阵乘法@替代元素-wise乘法*,避免计算错误 residual = np.abs(A @ alpha - F) normalized_err = residual / np.max(np.abs(F)) err = np.max(normalized_err) error.append(err.item()) # 提取标量值,简化后续对数计算 # 一次性绘制所有数据点,生成完整关系图 plt.plot(kappa_list, np.log(error), marker='o', label='Log(error) vs Kappa') plt.xlabel('Kappa (sqrt(n+M))') plt.ylabel('Logarithm of Error') plt.title('Log(error) vs Kappa') plt.legend() plt.grid(True) plt.show()
关键修正说明
- 缩进错误修复:原代码中极点生成的判断逻辑不在角落遍历循环内,导致循环完全无效,修正后将逻辑放入循环,遍历每个角落处理极点。
- 绘图逻辑调整:原代码每次循环仅绘制单个点并立即显示,最终只会看到最后一个点。改为收集所有
kappa和error值,最后一次性绘制完整曲线。 - 矩阵乘法修正:numpy中
*是元素-wise乘法,矩阵乘法需用@,否则会导致残差计算错误。 - 数值处理优化:用
np.max()替代内置max()处理numpy数组,确保正确取数组最大值;用.item()提取误差的标量值,避免对数计算的维度问题。 - 变量定义提示:原代码中
ncorners、polygon等变量未定义,需根据实际场景提前赋值或实现对应函数。
内容的提问来源于stack exchange,提问作者Jamie North
相关产品推荐
相关产品推荐

