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

如何缩短电场动态图中电子附近过长的向量长度?

解决电子附近向量过长的问题

你的问题出在动画更新函数里未对电场向量做归一化处理,还额外放大了15倍,导致靠近电荷的区域向量值急剧增大,最终显示过长。可以通过以下几种方式修复:

方法1:对更新后的向量做归一化

在updata函数里,计算完xx和yy后,像初始代码那样除以它们的模长r,将向量统一为单位向量,确保所有向量基础长度一致,再通过quiver的scale参数控制整体显示大小:

修改后的updata函数:

def updata(frame):
    a = 8*np.sin(np.pi*(frame+1)/150)
    xx = 15*((x-a)/(((x-a)*(x-a)+y*y)**(1.5))-(x+a)/(((x+a)*(x+a)+y*y)**(1.5)))
    yy = 15*(y/(((x-a)*(x-a)+y*y)**(1.5))-y/(((x+a)*(x+a)+y*y)**(1.5)))
    r = np.power(np.add(np.power(xx,2), np.power(yy,2)),0.5)
    # 新增归一化步骤,与初始设置保持一致
    xx_normalized = xx / r
    yy_normalized = yy / r
    line1.set_UVC(xx_normalized, yy_normalized)  # 使用归一化后的向量
    line2.set_offsets([a,0])
    line3.set_offsets([-a,0])
    return line1, line2, line3

注意:return语句需用逗号分隔元素,而非and,这样动画才能正确识别所有需要刷新的元素。

方法2:限制向量的最大长度

如果不想完全归一化,希望保留向量相对长度但避免极端过长,可以用np.clip给向量模长设置上限:

def updata(frame):
    a = 8*np.sin(np.pi*(frame+1)/150)
    xx = 15*((x-a)/(((x-a)*(x-a)+y*y)**(1.5))-(x+a)/(((x+a)*(x+a)+y*y)**(1.5)))
    yy = 15*(y/(((x-a)*(x-a)+y*y)**(1.5))-y/(((x+a)*(x+a)+y*y)**(1.5)))
    r = np.power(np.add(np.power(xx,2), np.power(yy,2)),0.5)
    # 设置最大模长,将超过阈值的向量截断
    max_r = 5
    r_clipped = np.clip(r, 0, max_r)
    xx_clipped = xx / r * r_clipped  # 保留方向,限制长度
    yy_clipped = yy / r * r_clipped
    line1.set_UVC(xx_clipped, yy_clipped)
    line2.set_offsets([a,0])
    line3.set_offsets([-a,0])
    return line1, line2, line3

方法3:调整quiver的scale参数

初始设置中quiver的scale=4,增大该值可缩小所有向量的显示长度,比如改为scale=10,能整体缩短向量,包括电子附近的长向量。

内容的提问来源于stack exchange,提问作者ZhuanXu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:22:50