如何缩短电场动态图中电子附近过长的向量长度?
解决电子附近向量过长的问题
你的问题出在动画更新函数里未对电场向量做归一化处理,还额外放大了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
相关产品推荐
相关产品推荐

