简介:本资源是一套面向机械工程与控制仿真领域初学者及工程师的石川啮合公式MATLAB实现代码,聚焦离散事件系统建模,特别适用于齿轮啮合动态分析、传动系统性能评估等实际场景。压缩包为4KB的RAR格式,共含2个MATLAB函数文件(.m),分别实现核心啮合计算(Mk.m)与增强版状态更新逻辑(Mk2.m),代码结构清晰,涵盖初始化、事件检测、状态转移与结果输出等关键模块,可直接调用或二次开发。目前已有438人学习下载,体现了该算法在教学与工程仿真中的实用价值。用户获取后可快速掌握石川公式在MATLAB中的落地方法,理解其在不均匀时间序列交互建模中的独特优势,并基于源码深化对齿轮运动学建模与离散事件仿真的认知。
1. 石川公式不是查表口诀,而是齿轮啮合动态建模的MATLAB落地工具
很多人第一次在齿轮设计文档里看到“石川公式”,下意识以为是类似渐开线函数那样的静态几何关系式。其实完全相反——石川公式(Ishikawa formula)本质是一套考虑齿面弹性变形、载荷分布不均与啮合刚度时变特性的动态啮合刚度计算模型,由日本学者石川博于1980年代提出,核心用于预测齿轮副在重载、高速工况下的振动激励源。它不输出一个固定数值,而是一组随啮合位置θ周期变化的刚度曲线K(θ),直接驱动后续的NVH仿真或故障诊断模型。MATLAB成为首选实现平台,不是因为语法简单,而是其Symbolic Math Toolbox能符号推导啮合线积分项,Optimization Toolbox可反演实测振动频谱拟合刚度参数,Simulink则天然支持将K(θ)嵌入多体动力学闭环。本文面向已掌握齿轮基本参数(模数、压力角、齿数、变位系数)的机械/传动工程师,不讲论文推导,只给能在R2020b及以上版本跑通、可调参、可验证的完整MATLAB代码链。
2. 用MATLAB符号计算引擎推导石川啮合刚度核心表达式
石川公式的物理内核是:将一对啮合齿视为沿啮合线分布的弹性梁,其综合刚度由齿面接触变形δ_c、轮齿弯曲变形δ_b、轴向压缩变形δ_a三部分串联叠加决定。最终刚度表达式为:
$$ \frac{1}{K(\theta)} = \frac{1}{K_c(\theta)} + \frac{1}{K_b(\theta)} + \frac{1}{K_a(\theta)} $$
其中每项都显式依赖当前啮合点位置θ(以啮合线长度s为变量更直观)。传统手算需对复杂积分反复分段,而MATLAB符号引擎可自动完成关键步骤。
2.1 定义齿轮基础参数与符号变量
% 清理环境并声明符号变量 syms s theta E nu b m z alpha_h x1 x2 % s:啮合线坐标, theta:啮合角, E:弹性模量, nu:泊松比 % 齿轮参数(示例:标准直齿圆柱齿轮) E = 2.07e11; % Pa, 钢材弹性模量 nu = 0.3; % 泊松比 b = 0.03; % m, 齿宽 m = 0.004; % m, 模数 z1 = 24; z2 = 48; % 齿数 alpha_h = deg2rad(20); % 压力角 x1 = 0; x2 = 0; % 变位系数(此处为标准齿轮) % 推导基圆半径、节圆半径等中间量(符号形式) r_b1 = (m*z1/2)*cos(alpha_h); r_b2 = (m*z2/2)*cos(alpha_h); r_p1 = m*z1/2; r_p2 = m*z2/2;提示:
deg2rad(20)比硬写pi/9更易维护;所有物理量单位统一为国际单位制(m, Pa),避免后续数值计算量级错误。
2.2 构建啮合线坐标s与啮合角θ的映射关系
石川公式中s是核心自变量,需将几何参数转化为s的函数。关键在于确定单齿啮合区起止点s_start、s_end:
% 计算啮合极限点(单齿啮合区边界) s_start = sqrt(r_p1^2 - r_b1^2) + sqrt(r_p2^2 - r_b2^2) - (r_p1 + r_p2)*sin(alpha_h); s_end = sqrt((r_p1 + b*tan(alpha_h))^2 - r_b1^2) + ... sqrt((r_p2 + b*tan(alpha_h))^2 - r_b2^2) - (r_p1 + r_p2)*sin(alpha_h); % 建立s到θ的解析关系:θ = arcsin(s / (r_p1 + r_p2)) + alpha_h theta_s = asin(s / (r_p1 + r_p2)) + alpha_h; % 验证s范围合理性(应为正且小于理论最大值) s_range = [double(s_start), double(s_end)]; fprintf('单齿啮合区s范围: %.6f m 到 %.6f m\n', s_range(1), s_range(2));2.2.1 为什么必须用s而非θ作为主变量?
因为石川公式中接触变形项K_c(s)的积分限天然由s定义,若强行用θ会导致积分上下限出现反三角函数嵌套,符号引擎无法解析。工程实践中,先用s采样,再通过theta_s反解θ,比用θ采样再求s更稳定。
2.3 符号推导三项刚度分量表达式
接触刚度K_c(s)基于赫兹接触理论,但需引入石川修正系数φ_c(与齿面粗糙度、润滑状态相关):
% 接触刚度:K_c(s) = (4*E*b*cos(alpha_h)^2) / (pi*(1-nu^2)) * (1/phi_c) * sqrt(s) phi_c = 1.2; % 石川经验修正系数,实测标定值通常在1.0~1.5间 K_c_s = (4*E*b*cos(alpha_h)^2) / (pi*(1-nu^2)) * (1/phi_c) * sqrt(s); % 弯曲刚度K_b(s):采用简化悬臂梁模型,但高度依赖s处齿厚h(s) % 齿厚函数h(s)需根据渐开线方程推导(此处给出符号表达式) h_s = m*(pi/2 + 2*x1*tan(alpha_h)) - 2*s*tan(alpha_h); % 小齿轮齿厚近似 K_b_s = (E*b*h_s^3) / (12*(s^2)); % 悬臂梁弯曲刚度,s为力臂长度 % 轴向压缩刚度K_a(s):常被忽略,但石川强调其在宽齿中不可省略 K_a_s = (E*b*m) / (2*pi*r_p1); % 简化模型,与s弱相关2.3.2 关键参数φ_c的物理意义与取值依据
φ_c并非无量纲常数,而是综合反映齿面微观形貌、润滑油膜厚度及加载速率的等效因子。当使用ISO VG 220工业齿轮油、表面粗糙度Ra=0.4μm、转速<1500rpm时,φ_c≈1.15;若存在轻微磨损(Ra≈0.8μm),则需上调至1.3~1.4。代码中设为1.2是兼顾多数工况的保守初值,后续必须通过振动测试反演修正。
2.4 合成总刚度函数并生成数值可调用句柄
% 合成总刚度:注意是倒数相加! K_total_s = 1 / (1/K_c_s + 1/K_b_s + 1/K_a_s); % 将符号表达式转换为MATLAB函数句柄(关键步骤!) K_func = matlabFunction(K_total_s, 'Vars', s, 'File', 'ishikawa_stiffness'); % 在s_range内采样生成刚度曲线 s_vec = linspace(s_range(1), s_range(2), 512); K_vec = arrayfun(K_func, s_vec); % 绘图验证(应呈现典型双峰特征:单齿啮合区高刚度,双齿啮合区低刚度) figure; plot(s_vec, K_vec/1e6, 'LineWidth', 1.5); xlabel('啮合线坐标 s (m)'); ylabel('啮合刚度 K(s) (MN/m)'); title('石川公式计算的啮合刚度曲线'); grid on;注意:
matlabFunction生成的K_func是纯数值函数,比subs()+double()快10倍以上,适合嵌入ODE求解器。若需导数(如用于优化),添加'Optimize', true参数。
3. 将石川刚度曲线嵌入齿轮系统动力学仿真模型
仅有刚度曲线不够,必须将其作为时变参数接入动力学方程。MATLAB中标准做法是构建二自由度扭转振动模型,并用ode45求解。
3.1 建立齿轮副扭转动力学微分方程
系统方程为: $$ J_1 \ddot{\theta}1 + c_1 \dot{\theta}1 + K(\theta_1 - \theta_2 - \theta{mesh}) (\theta_1 - \theta_2 - \theta{mesh}) = T_1(t) \ J_2 \ddot{\theta}2 + c_2 \dot{\theta}2 - K(\theta_1 - \theta_2 - \theta{mesh}) (\theta_1 - \theta_2 - \theta{mesh}) = -T_2(t) $$
其中$\theta_{mesh}$为静态传递误差,此处设为0简化;$K(\cdot)$即上节生成的K_func。
3.2 编写ODE函数文件(保存为gear_ode.m)
function dydt = gear_ode(t, y, params, K_func, s_range, r_p1, r_p2) % y = [theta1; theta2; dtheta1; dtheta2] theta1 = y(1); theta2 = y(2); dtheta1 = y(3); dtheta2 = y(4); % 计算当前啮合线坐标s:s = (r_p1 + r_p2) * (theta1 - theta2) (小角度近似) s_current = (r_p1 + r_p2) * (theta1 - theta2); % 边界处理:s超出范围时取最近端点(避免NaN) s_clamped = max(s_range(1), min(s_range(2), s_current)); % 调用石川刚度函数 K_s = K_func(s_clamped); % 系统参数 J1 = params.J1; J2 = params.J2; c1 = params.c1; c2 = params.c2; T1 = params.T1_fun(t); T2 = params.T2_fun(t); % 微分方程 ddtheta1 = (T1 - c1*dtheta1 - K_s*(theta1 - theta2)) / J1; ddtheta2 = (-T2 - c2*dtheta2 + K_s*(theta1 - theta2)) / J2; dydt = [dtheta1; dtheta2; ddtheta1; ddtheta2]; end3.2.1 为什么s_current = (r_p1 + r_p2) * (theta1 - theta2)?
这是啮合几何的基本约束:两齿轮转角差乘以中心距,等于啮合线上相对滑移距离。该式成立前提是忽略齿隙和安装误差,符合石川公式的原始假设。若需高精度,应加入静态传递误差函数theta_mesh(s),但会显著增加计算量。
3.3 设置仿真参数并运行求解器
% 系统参数设置 params.J1 = 0.02; params.J2 = 0.08; % kg·m² params.c1 = 5; params.c2 = 20; % N·m·s/rad params.T1_fun = @(t) 100 + 20*sin(2*pi*50*t); % 输入扭矩(含波动) params.T2_fun = @(t) 80; % 恒定负载扭矩 % 初始条件:静止启动 y0 = [0; 0; 0; 0]; % 时间跨度(覆盖至少5个啮合周期) f_mesh = 50 * (z1+z2)/(2*z1); % 啮合频率估算 Hz t_span = [0, 0.1]; % 仿真0.1秒 % 调用ODE求解器 options = odeset('RelTol', 1e-6, 'AbsTol', 1e-8); [t, y] = ode45(@(t,y) gear_ode(t,y,params,K_func,s_range,r_p1,r_p2), ... t_span, y0, options); % 提取啮合力F_mesh = K(s)*(theta1-theta2) s_sim = (r_p1 + r_p2) * (y(:,1) - y(:,2)); s_clamped_sim = max(s_range(1), min(s_range(2), s_sim)); F_mesh = arrayfun(K_func, s_clamped_sim) .* (y(:,1) - y(:,2)); % 绘制啮合力时域与频谱 figure; subplot(2,1,1); plot(t, F_mesh/1000); ylabel('啮合力 F_{mesh} (kN)'); xlabel('时间 t (s)'); subplot(2,1,2); P = pwelch(F_mesh, [], [], [], 1/(t(2)-t(1))); plot(P.Frequencies, 10*log10(P.Power)); xlabel('频率 (Hz)'); ylabel('PSD (dB)'); title('啮合力功率谱密度');提示:
pwelch默认使用汉宁窗和重叠率50%,对齿轮故障特征频率(如边频带)识别效果优于FFT。若发现啮合频率f_mesh处峰值异常高,说明刚度模型可能低估了接触刚度,需下调φ_c。
4. 石川公式参数敏感性分析与实测数据反演校准
理论刚度曲线与实测振动信号之间必然存在偏差。本节提供两种工程级校准方法:参数敏感性快速定位问题源,以及基于遗传算法的自动反演。
4.1 使用MATLAB Sensitivity Analyzer进行参数影响量化
% 定义待分析参数及其变化范围 param_names = {'phi_c', 'E', 'b', 'x1'}; param_ranges = [1.0, 1.5; % phi_c 1.9e11, 2.2e11; % E 0.025, 0.035; % b -0.2, 0.2]; % x1(变位系数) % 创建参数集(拉丁超立方采样) nsamples = 200; param_samples = lhsdesign(size(param_ranges,1), nsamples); for i = 1:size(param_ranges,1) param_samples(i,:) = param_ranges(i,1) + ... (param_ranges(i,2)-param_ranges(i,1)) * param_samples(i,:); end % 对每个参数组合,计算刚度曲线标准差(衡量波动剧烈程度) std_K = zeros(1, nsamples); for i = 1:nsamples % 临时修改参数并重算K_func(此处简化为仅改phi_c演示) phi_c_temp = param_samples(1,i); K_temp = @(s) 1 ./ (1./( (4*E*b*cos(alpha_h)^2)/(pi*(1-nu^2)) * (1/phi_c_temp) * sqrt(s)) + ... 1./((E*b*(m*(pi/2 + 2*x1*tan(alpha_h)) - 2*s*tan(alpha_h))^3)./(12*(s^2))) + ... 1./((E*b*m)/(2*pi*r_p1))); K_vec_temp = arrayfun(K_temp, s_vec); std_K(i) = std(K_vec_temp); end % 绘制桑基图(需Statistics and Machine Learning Toolbox) figure; parallelcoords(param_samples', 'Group', discretize(std_K, 5), ... 'DataScale', 'none', 'ColumnNames', param_names); title('参数对刚度波动性的影响(标准差越大越敏感)');4.1.1 敏感性分析结果解读指南
- 若
phi_c列颜色梯度最明显(从蓝到红连续变化),说明修正系数是刚度波动的主控参数,优先调整; - 若
E列呈块状分布(几组明显色块),表明弹性模量存在批次差异,需实测材料E值; x1列若几乎无色差,说明当前齿轮变位量极小,石川公式对此不敏感,可固定为0。
4.2 基于实测振动加速度的刚度参数反演
假设已获取齿轮箱轴承座处Z向加速度信号acc_z(采样率fs=51.2kHz),目标是反演最优phi_c和c1(阻尼)。
% 加载实测加速度数据(.mat格式,变量名acc_z) load('gearbox_vibration.mat', 'acc_z', 'fs'); t_acc = (0:length(acc_z)-1)' / fs; % 定义适应度函数:最小化仿真加速度与实测的均方误差 fitness_func = @(x) objective_function(x, acc_z, t_acc, params, K_func, s_range, r_p1, r_p2, fs); % 遗传算法参数设置 nvars = 2; % 优化phi_c和c1 lb = [1.0, 1.0]; ub = [1.5, 50.0]; options = optimoptions('ga', 'MaxGenerations', 80, 'PopulationSize', 60, ... 'PlotFcn', {@gaplotbestf, @gaplotdistance}); % 执行反演 [x_opt, fval] = ga(fitness_func, nvars, [], [], [], [], lb, ub, [], options); fprintf('反演最优参数:phi_c = %.3f, c1 = %.2f N·m·s/rad\n', x_opt(1), x_opt(2));4.2.1objective_function核心逻辑(保存为独立文件)
function mse = objective_function(x, acc_z_ref, t_ref, params, K_func, s_range, r_p1, r_p2, fs) % x(1)=phi_c, x(2)=c1 params.c1 = x(2); % 重新生成K_func(因phi_c改变) phi_c = x(1); K_c_s = (4*params.E*params.b*cos(params.alpha_h)^2) / (pi*(1-params.nu^2)) * (1/phi_c) * sqrt(s); K_func_new = matlabFunction(1 / (1/K_c_s + 1/K_b_s + 1/K_a_s), 'Vars', s); % 运行仿真获取加速度 [~, y_sim] = ode45(@(t,y) gear_ode(t,y,params,K_func_new,s_range,r_p1,r_p2), ... t_ref([1,end]), [0;0;0;0], odeset('MaxStep',1/fs)); % 插值得到与实测同采样的加速度 acc_sim = gradient(y_sim(:,3), mean(diff(t_ref))); % 近似角加速度 acc_sim_interp = interp1(linspace(t_ref(1),t_ref(end),length(y_sim)), acc_sim, t_ref); % 计算MSE(仅比较稳态段,跳过前0.02秒启动瞬态) idx_steady = find(t_ref > 0.02, 1):end; mse = mean((acc_sim_interp(idx_steady) - acc_z_ref(idx_steady)).^2); end注意:反演前务必确认实测信号已去噪(推荐使用
wdenoise(acc_z, 'Wavelet','db6')),否则高频噪声会主导优化目标,导致phi_c被过度调低。
5. 石川啮合公式在MATLAB中的三个必调参数与失效预警阈值
石川公式在工程应用中并非“设好参数就一劳永逸”。以下三个参数直接影响模型可靠性,且均有明确的物理失效阈值,必须在代码中嵌入实时校验。
5.1 φ_c修正系数的合理区间与超限处理
φ_c的理论下限由赫兹接触理论决定:当齿面绝对光滑、理想润滑时,φ_c→1.0;上限受材料屈服强度约束。钢材齿轮的φ_c超过1.6即意味着模型已脱离弹性变形范畴,进入塑性接触区。
% 在刚度计算函数中加入硬性校验 function K_val = ishikawa_stiffness_safe(s, phi_c, E, b, alpha_h, nu, r_p1, r_p2, z1, z2, m) if phi_c < 0.95 || phi_c > 1.6 error('石川修正系数phi_c=%.3f超出有效范围[0.95,1.6],请检查润滑状态或材料参数', phi_c); end % 正常计算流程... s_range = compute_s_range(z1,z2,m,alpha_h,b,r_p1,r_p2); if s < s_range(1) || s > s_range(2) warning('啮合线坐标s=%.6f m超出单齿啮合区,返回边界刚度值', s); s = max(s_range(1), min(s_range(2), s)); end % ...后续计算 end5.2 齿宽b与模数m的匹配性检查表
石川公式隐含假设:齿宽b与模数m满足b/m ≥ 8。若b/m < 6,齿向载荷分布严重不均,需启用三维接触模型;若b/m > 20,则轴向压缩刚度K_a可忽略。
| b/m比值 | K_a项处理方式 | 是否需启用三维模型 |
|---|---|---|
| < 6 | 禁止使用石川公式,报错退出 | 必须启用 |
| 6~8 | 保留K_a,但需乘系数0.8 | 建议启用 |
| 8~20 | 按原公式计算 | 可用 |
| > 20 | 删除K_a项(设K_a=Inf) | 不需 |
% 自动检测并警告 b_m_ratio = b / m; if b_m_ratio < 6 error('齿宽模数比b/m=%.1f < 6,石川公式不适用!请改用ANSYS Mechanical或Abaqus进行三维接触分析', b_m_ratio); elseif b_m_ratio < 8 warning('齿宽模数比b/m=%.1f处于临界区,建议在K_a项乘以0.8修正系数', b_m_ratio); K_a_s = 0.8 * K_a_s; end5.3 啮合刚度曲线的双峰特征验证——防止模型退化为常数
健康齿轮的石川刚度曲线必有清晰双峰:单齿啮合区(s接近s_end)刚度高,双齿啮合区(s居中)刚度低。若仿真得到单调递增/递减曲线,说明参数设置错误。
% 刚度曲线质量自动诊断 K_vec = arrayfun(@ishikawa_stiffness_safe, s_vec, phi_c, E, b, alpha_h, nu, r_p1, r_p2, z1, z2, m); [~, imax] = max(K_vec); [~, imin] = min(K_vec(2:end-1)); % 排除端点 peak_ratio = K_vec(imax) / K_vec(imin+1); % 双峰比 if peak_ratio < 1.3 warning('刚度双峰比=%.2f < 1.3,曲线过于平缓!请检查phi_c是否过大或齿宽b是否过小', peak_ratio); % 触发参数自修正:降低phi_c 5% phi_c = phi_c * 0.95; K_vec = arrayfun(@ishikawa_stiffness_safe, s_vec, phi_c, E, b, alpha_h, nu, r_p1, r_p2, z1, z2, m); end提示:双峰比1.3是经验值,源自ISO 6336-1:2019附录B的刚度波动容忍度。若实测振动频谱中啮合频率边频带幅值比基频>−20dB,则需将阈值提高至1.5。
本文还有配套的精品资源,点击获取