已知链中心距用节数算中间电机摆放位置 常量弧长 三链轮弦长模型算法
三链轮弦长模型算法介绍物理场景两个上链轮A、B水平对齐中心距a 120mm一个下链轮C悬挂在下方形成三角形布局。链条绕过三个链轮求底部链轮的垂直位置h。核心假设弦长模型链条是离散直线段每节p 12.7mm绕链轮时形成多边形包络不是光滑圆弧。三链轮系统总包角恒等于 360°一个完整多边形所以弧长部分arc Z × p 11 × 12.7 139.7 mm \text{arc} Z \times p 11 \times 12.7 139.7\text{mm}arcZ×p11×12.7139.7mm这是一个常量不随h变化。公式推导链条总长由三部分组成L a 2×diag Z×p其中diag √((a/2)² h²)是上链轮到下链轮的斜边长度。由于L 节数 × p可直接求解hdiag (L - a - Z×p) / 2 h √(diag² - (a/2)²)计算步骤输入节数n算出链长L n × 12.7减去固定项剩余 L - 120 - 139.7每侧斜边diag 剩余 / 2勾股定理h √(diag² - 60²)结果示例a120mm, Z11节数L(mm)2×斜边弧长h(mm)41520.7261.0139.7115.942533.4273.7139.7123.043546.1286.4139.7130.0与旧模型的对比旧模型用R × 包角计算弧长需要牛顿迭代因为包角随h变化。新模型用Z×p常量弧长直接求解无需迭代更简洁也更符合链条直线段的物理特性。 根据链条节数计算底部链轮的垂直位置 从80mm开始按每节12.7mm叠加链条长度计算对应的垂直距离 弦长模型链条为离散直线段绕链轮形成多边形包络 三链轮系统总包角恒为360°弧长部分Z*p常量不随h变化 公式:La2*sqrt((a/2)^2h^2)Z*p 直接求解:hsqrt(((L-a-Z*p)/2)^2-(a/2)^2) import math import jsondefcalculate_vertical_from_links(): 已知-两上链轮水平中心距:120mm(固定)-链条节距:12.7mm-链条节数:从某个起始值开始递增-弧长模型:Z*p 常量链条为弦长绕链轮形成多边形 求底部链轮到两上链轮中心连线的垂直距离 几何关系 La2*sqrt((a/2)^2h^2)Z*phsqrt(((L-a-Z*p)/2)^2-(a/2)^2) horizontal_center_dist120# 两上链轮水平中心距(mm)pitch12.7# 08B链条节距(mm)# 链轮参数teeth11pitch_circle_diameterpitch/math.sin(math.pi/teeth)pitch_circle_radiuspitch_circle_diameter/2# 弦长模型弧长 Z*p常量三链轮总包角360°arc_length_constteeth*pitch #11*12.7139.7mm half_ahorizontal_center_dist/2results[]print(*100)print(根据链条节数计算底部链轮垂直位置弦长模型)print(*100)print(f\n参数:)print(f 两上链轮水平中心距: {horizontal_center_dist} mm)print(f 链条节距: {pitch} mm)print(f 链轮齿数: {teeth})print(f 节圆直径: {pitch_circle_diameter:.2f} mm)print(f 弧长(常量): Z*p {teeth}*{pitch} {arc_length_const:.1f} mm\n)print(f{节数:6} {链条总长:12} {2x斜边:12} {弧长:10} {h(mm):12} {备注})print(-*80)# 从33节开始到50节fornum_linksinrange(33,51):chain_lengthnum_links*pitch# 直接求解: L a 2*diag Z*p# diag (L - a - Z*p) / 2remainderchain_length-horizontal_center_dist-arc_length_constifremainder0:continuediagremainder/2.0# h sqrt(diag^2 - (a/2)^2)h_sqdiag**2-half_a**2ifh_sq0:continuehmath.sqrt(h_sq)# 验证calculated_lengthhorizontal_center_dist2*diagarc_length_constfinal_errorabs(calculated_length-chain_length)result{chain_links:num_links,chain_length_mm:round(chain_length,2),vertical_distance_mm:round(h,3),diagonal_mm:round(diag,3),arc_length_mm:round(arc_length_const,2),calculated_length_mm:round(calculated_length,2),error_mm:round(final_error,3),note:f{num_links}节链条}results.append(result)note_text可用if80h150else超出范围print(f{num_links:6} {chain_length:12.1f} {2*diag:12.1f} {arc_length_const:10.1f} f{h:12.3f} {note_text})print(-*100)print(f\n共计算 {len(results)} 种节数配置)# 过滤出h在80-150mm范围内的结果valid_results[rforrinresultsif80r[vertical_distance_mm]150]output{success:True,message:计算完成弦长模型,parameters:{horizontal_center_distance_mm:horizontal_center_dist,pitch_mm:pitch,teeth:teeth,pitch_circle_diameter_mm:round(pitch_circle_diameter,2),arc_length_const_mm:round(arc_length_const,2),model:L a 2*diag Z*p},total_configurations:len(results),valid_configurations_80_150mm:len(valid_results),results:valid_results}withopen(chain_vertical_by_links.json,w,encodingutf-8)asf:json.dump(output,f,indent2,ensure_asciiFalse)print(f\n有效结果(h 80-150mm范围)已保存到: chain_vertical_by_links.json)print(f共 {len(valid_results)} 个有效配置)returnvalid_resultsif__name____main__:calculate_vertical_from_links()