轴承动力学仿真总让人头大对不对?我经常被问到怎么把仿真数据变成直观的角域分布图。最近折腾了半个月终于搞出套顺手的绘图工具,今天就给大家扒一扒核心代码
根据已知的滚动轴承动力学仿真数据 出图。 程序百分百为博主亲自设计的代码注释很详细根据你的仿真数据使用我的程序就可以得到这样的效果。 可以出承载区与非承载区的1载荷分布、2摩擦力分布、3打滑率分布等各种时域变角度域分布曲线变换图。先看这段载荷分布的处理逻辑def plot_load_distribution(theta, F_contact, zone_mask): 绘制承载区与非承载区载荷对比 :param zone_mask: 布尔数组标记承载区位置 fig, ax plt.subplots(figsize(10,4)) ax.plot(theta[zone_mask], F_contact[zone_mask], r-, label承载区) ax.plot(theta[~zone_mask], F_contact[~zone_mask], b--, alpha0.6, label非承载区) ax.set_xticks(np.arange(0, 360, 30)) # 30度间隔刻度线 ax.annotate(最大载荷点, xy(theta[np.argmax(F_contact)], np.max(F_contact)), xytext(60, 0.8*np.max(F_contact)), arrowpropsdict(facecolorblack, shrink0.05)) plt.tight_layout() return fig这里用zone_mask把0-360度的角域切割成承载/非承载区。红色实线突出显示受载区域蓝色虚线用半透明处理避免喧宾夺主。那个annotate函数动态标出最大载荷点实测比手动标注省事80%摩擦力分布的计算更有意思。看这个滑动摩擦转混合摩擦的判断条件# 滑移率计算核心代码 omega_roll (v_contact - v_slide) / R_eff # 滚动角速度 slip_ratio np.where(v_contact !0, (v_contact - v_slide)/v_contact, 0) # 防除零处理 friction_mode np.piecewise(slip_ratio, [slip_ratio 0.02, (slip_ratio 0.02) (slip_ratio 0.1), slip_ratio 0.1], [滚动,混合摩擦,滑动摩擦])用np.piecewise实现三段式摩擦状态分类比写一堆if-else清爽多了。注意那个防除零处理实测数据里确实会出现接触速度为零的情况。根据已知的滚动轴承动力学仿真数据 出图。 程序百分百为博主亲自设计的代码注释很详细根据你的仿真数据使用我的程序就可以得到这样的效果。 可以出承载区与非承载区的1载荷分布、2摩擦力分布、3打滑率分布等各种时域变角度域分布曲线变换图。时域转角域的骚操作在这里def time2theta(t, cage_speed): 通过保持架转速将时域信号转为角域 theta (t * cage_speed * 60) % 360 # 转速转deg/s return np.sort(theta) # 必须排序否则绘图错乱重点是这个模360运算把时域信号首尾衔接成环形分布。但转完必须排序否则散点图会连错线——这个坑我当初排查了三小时最后来个三维滑移率分布的大杀器from mpl_toolkits.mplot3d import Axes3D def plot_3d_slip(phi, theta, slip): fig plt.figure(figsize(12,8)) ax fig.add_subplot(111, projection3d) surf ax.plot_trisurf(phi, theta, slip, cmapjet, alpha0.8) ax.view_init(elev30, azim45) # 最佳观测角度 ax.set_zlabel(滑移率, labelpad15) plt.colorbar(surf, shrink0.5, aspect10)用trisurf处理非均匀采样的角度数据比普通surface plot靠谱特别是当轴承转速变化时。那个labelpad参数调了八次才让z轴标签不跟刻度重叠...这套代码最骚的是参数全开放轴承直径、滚子数、转速这些全在配置文件里。只要把仿真数据整理成numpy数组改个文件路径就能自动出图。最近帮学弟处理EMD分解后的轴承信号换个colormap直接能用稳得一批