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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:17:01