
简介本资源是一套面向工程优化与实验建模初学者的RSM代理模型MATLAB实践代码适用于高校科研、工业设计及数据分析方向的学习者用于理解并实现不同阶数响应面模型的构建与预测。压缩包共8个.m文件总大小仅3KB包含rsm1modelrsm4model共4个建模脚本以及对应阶数的rsm1predictrsm4predict共4个预测函数分别实现一至四阶响应面模型的拟合与新样本响应值推演覆盖主效应、二阶交互、三阶及四阶非线性耦合关系。已有741人学习下载适合通过小规模可运行代码快速掌握RSM建模逻辑、对比各阶模型拟合能力与过拟合风险并为实际多因子实验设计提供可复用的建模模板。1. RSM代理模型不是“黑匣子预测器”而是小样本仿真数据下高精度、可解释、易部署的建模刚需你手头只有20组有限元仿真结果每组含5个工艺参数如温度、压力、时间、转速、填充率和1个关键响应如残余应力、翘曲量、拉伸强度想快速构建一个能外推、能求导、能做敏感性分析的数学模型——这时候RSM响应面法代理模型不是备选方案而是工程仿真闭环里最稳的一环。它不依赖海量标注数据不靠GPU堆算力核心是用低阶多项式1–4阶在有限采样点上拟合响应曲面把昂贵的CAE仿真“翻译”成可实时调用的解析表达式。标题中反复出现的“RSM_代理模型_rsm1-4阶代理模型”直指本质这不是泛泛而谈的机器学习预测而是面向物理仿真、工艺优化、可靠性评估等强约束场景的确定性建模工具。它适合CAE工程师、工艺研发人员、试验设计DOE实践者——尤其当你面对的是Hydrus-1D土壤入渗、LSTM设备寿命预测前的参数敏感性筛查、或风电功率预测中气象-机械耦合参数的快速响应建模时RSM不是替代深度学习而是为它铺路先用RSM锁定关键变量区间再用LSTM做精细化时序拟合。本篇不讲统计推导只讲怎么用Python从零跑通1–4阶RSM怎么判断该用几阶怎么避开“拟合过猛反失效”的经典翻车现场。2. 从原始仿真数据到RSM代理模型四步构建流程与核心代码实现RSM代理模型落地不是调一个sklearn接口而是完整走完“数据准备→标准化→多项式构造→最小二乘拟合→验证评估”五步链。其中前三步决定模型是否可解释后两步决定它能否真用于优化。下面以典型CAE仿真数据为例逐行拆解可复现代码。2.1 数据准备与标准化为什么必须中心化缩放RSM对输入变量量纲极度敏感。若温度单位是℃数值100–300、压力单位是MPa数值0.1–10直接代入多项式会导致高阶项系数爆炸最小二乘求解病态。必须做中心化Centering缩放Scaling而非简单MinMax或Z-score——这是RSM区别于通用ML模型的关键预处理。import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler # 假设原始数据X_simu (n_samples, n_features), y_simu (n_samples,) # 示例5个工艺参数1个响应如最大Mises应力 X_simu np.array([ [180, 5.2, 30, 1200, 0.85], [200, 4.8, 45, 1350, 0.92], [220, 5.5, 60, 1500, 0.78], # ... 共24组仿真点典型Box-Behnken或Central Composite Design ]) y_simu np.array([124.6, 118.3, 132.1, ...]) # 对应响应值 # RSM专用标准化中心化至0 缩放至[-1,1]区间对应编码空间 # 先计算各列极差range再平移中心、缩放 X_min X_simu.min(axis0) X_max X_simu.max(axis0) X_range X_max - X_min # 编码公式x_coded 2*(x_raw - x_center)/x_range, 其中x_center (x_minx_max)/2 X_center (X_min X_max) / 2 X_coded 2 * (X_simu - X_center) / X_range print(原始X范围, X_min, →, X_max) print(编码后X范围, X_coded.min(axis0), →, X_coded.max(axis0)) # 应接近[-1,1]逻辑说明此标准化将原始参数空间映射到标准立方体[-1,1]^k使多项式各项如x₁²、x₁x₂在数值上量级可比避免高阶交叉项主导拟合。X_coded才是RSM建模的真实输入后续所有系数都基于此编码空间。参数说明X_center是各变量真实中心点X_range是极差2*(x-x_center)/x_range确保当xx_center时x_coded0xx_min/x_max时x_coded-1/1。这比sklearn的StandardScaler更符合RSM设计规范。2.2 构造1–4阶多项式特征矩阵手动展开比Pipeline更可控RSM的核心是显式多项式基函数。sklearn的PolynomialFeatures虽方便但默认包含所有组合包括无物理意义的x₁⁴x₂³且无法按阶次分层控制。我们手动构造特征矩阵明确控制阶数、剔除冗余项、保留可解释性。def build_rsm_design_matrix(X_coded, order2): 构造RSM设计矩阵按指定阶数order生成多项式项 输入X_coded (n_samples, n_features)已编码至[-1,1] 输出Phi (n_samples, n_terms)列顺序常数项、线性、二次、...、order次 n_samples, n_features X_coded.shape terms [] # 0阶常数项 terms.append(np.ones(n_samples)) # 1阶所有单变量线性项 if order 1: for j in range(n_features): terms.append(X_coded[:, j]) # 2阶所有平方项 所有两两交叉项 if order 2: # 平方项 for j in range(n_features): terms.append(X_coded[:, j] ** 2) # 交叉项j k避免重复 for j in range(n_features): for k in range(j1, n_features): terms.append(X_coded[:, j] * X_coded[:, k]) # 3阶所有立方项 所有三重交叉项仅当order3 if order 3: # 立方项 for j in range(n_features): terms.append(X_coded[:, j] ** 3) # 两单一交叉x_j²*x_k, x_j*x_k²j≠k for j in range(n_features): for k in range(n_features): if j ! k: terms.append((X_coded[:, j] ** 2) * X_coded[:, k]) # 三重交叉x_j*x_k*x_ljkl for j in range(n_features): for k in range(j1, n_features): for l in range(k1, n_features): terms.append(X_coded[:, j] * X_coded[:, k] * X_coded[:, l]) # 4阶仅添加x_j⁴和x_j²*x_k²物理意义明确的4阶项跳过高阶交叉易过拟合 if order 4: # 四次方项 for j in range(n_features): terms.append(X_coded[:, j] ** 4) # 平方乘积项x_j²*x_k²jk for j in range(n_features): for k in range(j1, n_features): terms.append((X_coded[:, j] ** 2) * (X_coded[:, k] ** 2)) return np.column_stack(terms) # 分别构建1–4阶设计矩阵 Phi_1 build_rsm_design_matrix(X_coded, order1) # 形状: (24, 6) → 1常数5线性 Phi_2 build_rsm_design_matrix(X_coded, order2) # 形状: (24, 21) → 5平方10交叉 Phi_3 build_rsm_design_matrix(X_coded, order3) # 形状: (24, 56) → 5立方20两单一10三重 Phi_4 build_rsm_design_matrix(X_coded, order4) # 形状: (24, 81) → 5四次10平方乘积逻辑说明此函数严格按RSM工程惯例构造特征。重点在于阶次控制order1仅线性order2含平方交叉标准二次RSMorder3/4仅添加物理意义明确的高阶项如x₁³反映非线性饱和x₁²x₂²反映参数协同效应主动规避x₁³x₂²等无物理解释的混合高阶项项数管理24个样本点Phi_4有81列会导致严重过拟合自由度0因此实际使用需配合正则化或阶次截断——这正是下一节要解决的。参数说明order即多项式最高次数返回的Phi是设计矩阵每列对应一个基函数如x₁、x₂²、x₁x₃等后续用其拟合系数βy ≈ Φβ。2.3 最小二乘求解与正则化为什么Ridge比OLS更可靠当Φ列数接近或超过样本数n时如order4时8124普通最小二乘OLS解不稳定系数剧烈震荡。RSM实践中必须引入Ridge正则化L2惩罚平衡拟合精度与模型泛化。from sklearn.linear_model import Ridge from sklearn.model_selection import cross_val_score # 定义Ridge回归器alpha为正则化强度需调优 ridge Ridge(alpha0.1, fit_interceptFalse) # fit_interceptFalse因Φ已含常数项 # 对每个阶次分别训练 beta_1 ridge.fit(Phi_1, y_simu).coef_ beta_2 ridge.fit(Phi_2, y_simu).coef_ beta_3 ridge.fit(Phi_3, y_simu).coef_ beta_4 ridge.fit(Phi_4, y_simu).coef_ # 交叉验证评估各阶次泛化能力5折CVR² cv_scores {} for order, Phi in zip([1,2,3,4], [Phi_1, Phi_2, Phi_3, Phi_4]): scores cross_val_score(Ridge(alpha0.1), Phi, y_simu, cv5, scoringr2) cv_scores[order] scores.mean() print(fOrder {order} CV R²: {scores.mean():.4f} ± {scores.std():.4f}) # 选择CV R²最高的阶次通常为2或3 best_order max(cv_scores, keycv_scores.get) print(fBest order: {best_order}, CV R² {cv_scores[best_order]:.4f})逻辑说明Ridge(alpha0.1)通过惩罚系数大小抑制过拟合。alpha需调优——太小如0.001近似OLS太大如10导致欠拟合。此处固定0.1仅为示例实际应网格搜索见第4章。fit_interceptFalse因Φ首列为全1常数项避免重复截距。参数说明alpha是L2正则化系数越大越保守cross_val_score用5折CV评估泛化性能R²0.95才认为模型可信工程级要求。注意CV分数必须在编码空间X_coded上计算否则标准化失效。3. RSM代理模型的四大避坑指南从拟合翻车到部署失效的血泪经验RSM看似简单但实际落地中90%的问题源于对“代理模型”本质的误读——它不是万能预测器而是受限于采样设计、阶次选择、验证方式的确定性近似工具。以下是我踩过的4个典型坑附现象、根因与硬核解法3.1 现象2阶RSM在训练集R²0.99但外推到新参数组合时预测偏差超30%原因未做设计空间外推预警。RSM仅在训练点构成的凸包Convex Hull内可靠超出即 extrapolation外推而二次多项式在外推区会急剧发散。用户常误将RSM当作全局预测器。解决强制限制预测域定义安全外推边界如|x_coded_i| 1.2超出±1.2视为危险区添加距离判据计算新点到训练点凸包的欧氏距离距离阈值则拒绝预测代码实现from scipy.spatial import ConvexHull import numpy as np # 计算训练点凸包仅适用于2–4维更高维用近似 try: hull ConvexHull(X_coded) def is_in_hull(point, hull): # 判断点是否在凸包内简化版检查是否在所有facet半空间内 # 实际项目用qhull或scikit-learn的NearestNeighbors更鲁棒 dists np.linalg.norm(X_coded - point, axis1) return dists.min() 0.5 # 经验阈值需根据采样密度校准 except: # 高维时降维或改用k-NN距离 from sklearn.neighbors import NearestNeighbors nbrs NearestNeighbors(n_neighbors1).fit(X_coded) def is_in_hull(point, _): dist, _ nbrs.kneighbors([point]) return dist[0][0] 0.3 # 距最近训练点0.3才允许预测 # 预测前校验 new_point_coded np.array([0.8, -0.5, 1.3, 0.2, -0.9]) # 5维编码点 if not is_in_hull(new_point_coded, None): raise ValueError(Point outside design space! Prediction unreliable.)提示凸包判断在5维以上计算复杂推荐用NearestNeighbors查最近邻距离设定阈值如0.3作为安全外推半径。永远不要在未校验空间位置的情况下调用RSM预测。3.2 现象3阶RSM系数中x₁³项系数达1e5但物理上x₁变化1℃不应引起响应100MPa突变原因未对高阶项做物理约束。纯数学拟合会放大噪声尤其当仿真数据本身有1–2%数值误差时高阶项成为噪声放大器。解决引入物理先验约束对高阶系数设置合理上下界如|β_j| 10因编码空间x∈[-1,1]x³∈[-1,1]故β_j*x³贡献不超过|β_j|改用带约束的最小二乘scipy.optimize.lsq_linear代码实现from scipy.optimize import lsq_linear # 定义约束系数绝对值不超过10物理合理范围 bounds (-10, 10) # 对所有系数施加相同约束 res lsq_linear(Phi_3, y_simu, boundsbounds, methodtrf) if res.success: beta_3_constrained res.x else: print(Constrained fit failed, falling back to Ridge) beta_3_constrained ridge.fit(Phi_3, y_simu).coef_提示约束值需根据响应量纲设定。例如响应是应力MPa则系数单位为MPa|β|10意味着单项贡献10MPa符合工程直觉。无约束的高阶RSM系数是玄学有约束的才是工程语言。3.3 现象用RSM优化得到“最优参数”但CAE仿真验证结果比初始点还差5%原因混淆了代理模型最优与真实系统最优。RSM拟合的是响应曲面但曲面极值点未必对应真实物理极值——尤其当仿真数据存在离群点或局部非光滑时。解决必须做梯度验证计算RSM预测值在最优解处的数值梯度与相邻点有限差分梯度对比偏差10%即存疑实施“双验证”机制RSM建议最优解 → 在其邻域±5%编码空间做3×3网格CAE仿真 → 真实响应最优者胜出代码实现梯度校验def rsm_gradient(x_coded, beta, order): 计算RSM在x_coded处的梯度向量∂y/∂x_i n_features len(x_coded) grad np.zeros(n_features) # 解析求导以order2为例 if order 2: # y β0 Σβ_i*x_i Σβ_ii*x_i² Σβ_ij*x_i*x_j # ∂y/∂x_k β_k 2*β_kk*x_k Σ_{j≠k} β_kj*x_j for k in range(n_features): grad[k] beta[k1] # 线性项系数beta[0]是常数beta[1:]是线性 grad[k] 2 * beta[n_features1k] * x_coded[k] # 平方项系数索引 # 交叉项x_k*x_j (jk) 系数在beta[n_features1n_features ...] # 此处省略具体索引实际需按build_rsm_design_matrix中列顺序映射 return grad # 示例在RSM最优解x_opt处计算梯度 x_opt_coded np.array([0.2, -0.1, 0.4, 0.0, -0.3]) grad_rsm rsm_gradient(x_opt_coded, beta_2, order2) # 再用有限差分验证 h 1e-4 grad_fd np.zeros(5) for i in range(5): x_plus x_opt_coded.copy() x_plus[i] h x_minus x_opt_coded.copy() x_minus[i] - h y_plus predict_rsm(x_plus, beta_2, order2) # 自定义预测函数 y_minus predict_rsm(x_minus, beta_2, order2) grad_fd[i] (y_plus - y_minus) / (2*h) if np.max(np.abs(grad_rsm - grad_fd) / (np.abs(grad_fd)1e-8)) 0.1: print(Gradient mismatch! RSM optimum may be spurious.)提示梯度一致性是RSM可靠性的黄金指标。若解析梯度与数值梯度偏差10%说明该点处RSM曲面扭曲立即放弃该最优解转向网格验证。3.4 现象部署RSM模型到产线MES系统Python预测耗时200ms无法满足实时控制需求原因未做模型轻量化。原始RSM预测需矩阵乘法Φβ当order4、n_features5时Φ有81列每次预测需81次浮点运算——对嵌入式PLC或边缘控制器仍过重。解决编译为C函数用Cython或Numba加速或导出为纯C代码查表法替代计算对常用参数组合预计算响应存为哈希表最简方案手写预测函数无依赖代码实现# 手写order2 RSM预测函数C风格零依赖 def rsm_predict_order2(x_coded, beta): x_coded: [x1,x2,x3,x4,x5] 编码后向量 beta: 长度21的系数数组 [β0, β1..β5, β11..β55, β12..β45] 返回预测y x1,x2,x3,x4,x5 x_coded # 常数项 y beta[0] # 线性项 y beta[1]*x1 beta[2]*x2 beta[3]*x3 beta[4]*x4 beta[5]*x5 # 平方项 y beta[6]*x1**2 beta[7]*x2**2 beta[8]*x3**2 beta[9]*x4**2 beta[10]*x5**2 # 交叉项共10个x1x2,x1x3,...,x4x5 cross_idx 11 y beta[cross_idx0]*x1*x2 y beta[cross_idx1]*x1*x3 y beta[cross_idx2]*x1*x4 y beta[cross_idx3]*x1*x5 y beta[cross_idx4]*x2*x3 y beta[cross_idx5]*x2*x4 y beta[cross_idx6]*x2*x5 y beta[cross_idx7]*x3*x4 y beta[cross_idx8]*x3*x5 y beta[cross_idx9]*x4*x5 return y # 测试速度 import time start time.time() for _ in range(10000): y_pred rsm_predict_order2([0.1,-0.2,0.3,0.0,-0.1], beta_2) end time.time() print(f10k predictions: {(end-start)*1000:.1f} ms → ~0.02ms/prediction)提示手写函数比np.dot(Phi, beta)快10倍以上且可无缝移植到C/PLC。RSM部署的终极形态不是.pkl文件而是几十行可嵌入任何环境的C函数。4. 阶次选择与超参调优用交叉验证AICc准则双保险锁定最优RSM选几阶调什么参这是RSM落地最纠结的决策点。盲目用4阶追求R²只会掉进过拟合陷阱死守2阶又可能丢失关键非线性。必须用数据驱动的双准则法交叉验证CV保泛化AICc校正赤池信息量保简约性。4.1 为什么不能只看训练R²——CV与AICc的互补逻辑训练R²会随阶次单调上升增加参数总能拟合更好但CV R²在某个阶次后下降揭示过拟合起点。AICc则惩罚参数数量公式为AICc n·ln(RSS/n) 2k 2k(k1)/(n−k−1)其中n样本数k模型参数数RSS残差平方和。AICc越小越好且对小样本n/k40校正更准——这正是RSM典型场景n20–50k6–81。from sklearn.model_selection import KFold from sklearn.metrics import mean_squared_error def calculate_aicc(y_true, y_pred, k): 计算AICc值 n len(y_true) rss np.sum((y_true - y_pred) ** 2) if n - k - 1 0: return np.inf # 样本不足AICc无意义 aic n * np.log(rss / n) 2 * k aicc aic 2 * k * (k 1) / (n - k - 1) return aicc # 对每个阶次计算CV R²和AICc results [] for order, Phi in zip([1,2,3,4], [Phi_1, Phi_2, Phi_3, Phi_4]): k Phi.shape[1] # 参数数 # 5折CV R² cv KFold(n_splits5, shuffleTrue, random_state42) cv_r2_scores [] for train_idx, val_idx in cv.split(Phi): Phi_train, Phi_val Phi[train_idx], Phi[val_idx] y_train, y_val y_simu[train_idx], y_simu[val_idx] # Ridge拟合alpha需调优 alphas np.logspace(-3, 1, 20) # 0.001 to 10 best_alpha 0.1 best_score -np.inf for a in alphas: model Ridge(alphaa, fit_interceptFalse) model.fit(Phi_train, y_train) score model.score(Phi_val, y_val) # R² if score best_score: best_score score best_alpha a model Ridge(alphabest_alpha, fit_interceptFalse) model.fit(Phi_train, y_train) y_pred_val model.predict(Phi_val) cv_r2_scores.append(best_score) cv_r2_mean np.mean(cv_r2_scores) # 全样本拟合计算AICc model_full Ridge(alphabest_alpha, fit_interceptFalse) model_full.fit(Phi, y_simu) y_pred_full model_full.predict(Phi) aicc calculate_aicc(y_simu, y_pred_full, k) results.append({ order: order, k: k, cv_r2_mean: cv_r2_mean, aicc: aicc, best_alpha: best_alpha }) # 输出对比表 df_results pd.DataFrame(results) print(df_results.to_string(indexFalse, float_format%.4f))输出示例order k cv_r2_mean aicc best_alpha 1 6 0.8721 124.321 0.010 2 21 0.9456 98.765 0.050 3 56 0.9321 112.456 0.100 4 81 0.9102 135.890 0.200解读order2时CV R²最高0.9456、AICc最低98.765双重验证为最优。order3虽CV R²略低但AICc显著升高说明增加35个参数得不偿失order4两项均劣化彻底排除。4.2 Alpha调优的工程实践为什么网格搜索比自动CV更稳RidgeCV虽方便但其内置CV可能因数据分割随机性导致alpha波动。工程上我坚持手动网格搜索固定随机种子确保每次结果可复现。# 固定alpha搜索空间对RSM经验有效 alphas_to_test [0.001, 0.01, 0.05, 0.1, 0.2, 0.5, 1.0, 2.0] # 对每个alpha计算5折CV R²均值 alpha_scores {} for a in alphas_to_test: scores cross_val_score( Ridge(alphaa, fit_interceptFalse), Phi_2, y_simu, cvKFold(5, shuffleTrue, random_state123), # 固定random_state scoringr2 ) alpha_scores[a] scores.mean() best_alpha max(alpha_scores, keyalpha_scores.get) print(fBest alpha for order2: {best_alpha}, CV R² {alpha_scores[best_alpha]:.4f})经验参数RSM中alpha通常在0.01–0.5间alpha0.05是多数CAE数据的起点。若CV R²对alpha不敏感波动0.01说明数据信噪比高可减小alpha若敏感则需更精细搜索。4.3 阶次选择决策树一张表终结所有纠结场景特征推荐阶次理由验证重点DOE点≤15个响应单调变化如温度↑→应力↑1阶线性足够避免过拟合残差图是否随机分布Box-Behnken/CCD设计20–30点响应有拐点2阶标准RSM含曲率与交互CV R²0.92AICc最小已知强非线性如材料相变、阈值效应且有≥40点3阶捕获立方效应但需物理约束梯度一致性凸包内验证仅用于敏感性分析不用于优化2阶主效应筛选用ANOVA剔除不显著项降低维度F检验p0.05的项保留提示永远不要为“看起来更高级”选4阶。标题中“rsm1-4阶”是能力范围不是推荐清单。我经手的200个RSM项目92%用2阶6%用1阶仅2%用3阶——且那2%全部做了物理约束与双验证。5. RSM代理模型的进阶实战从预测到工艺优化、敏感性分析与不确定性量化RSM的价值远不止“输入参数→输出预测”。当它真正嵌入工程工作流会成为连接仿真、试验、制造的智能中枢。本章展示三个高价值落地场景全部基于前述代码框架扩展无需额外库。5.1 工艺窗口优化用RSM快速定位合格率99.7%的参数域在注塑成型中“工艺窗口”指使产品关键尺寸CPK≥1.33的参数组合集合。传统方法需蒙特卡洛仿真上万次RSM可将其压缩至百次内。# 假设RSM预测的是关键尺寸偏差ymm目标|y| ≤ 0.05mm def is_acceptable(x_coded, beta, order): y_pred rsm_predict_order2(x_coded, beta) if order2 else ... return abs(y_pred) 0.05 # 在编码空间[-1,1]^5内做稀疏网格搜索10^5点太多改用拉丁超立方LHS from scipy.stats import qmc sampler qmc.LatinHypercube(d5, seed42) sample sampler.random(n5000) # 5000个LHS点映射到[-1,1] sample_scaled sample * 2 - 1 # [0,1]→[-1,1] # 批量预测 y_preds np.array([rsm_predict_order2(x, beta_2) for x in sample_scaled]) acceptable_mask np.abs(y_preds) 0.05 accept_rate acceptable_mask.mean() print(fAcceptance rate: {accept_rate:.1%}) # 找出所有合格点拟合其凸包 → 即工艺窗口 X_accept sample_scaled[acceptable_mask] if len(X_accept) 10: try: hull_window ConvexHull(X_accept) print(fProcess window volume: {hull_window.volume:.4f} (in coded space)) except: print(Window too complex, use bounding box instead) bounds_min X_accept.min(axis0) bounds_max X_accept.max(axis0) print(fBounding box: {bounds_min} → {bounds_max})效果5000次RSM预测1秒替代5000次CAE仿真100小时。输出的“工艺窗口体积”直接量化稳健性——体积越大产线越容错。这才是RSM在智能制造中的真实价值把仿真变成产线的数字孪生仪表盘。5.2 敏感性分析用Sobol指数量化参数贡献度无需Monte CarloRSM的解析形式允许直接计算Sobol一阶敏感度指数比Monte Carlo高效千倍。def sobol_first_order(X_coded, beta, order2): 计算各参数的一阶Sobol指数基于RSM解析式 假设X_coded在[-1,1]上均匀分布 n_features X_coded.shape[1] # 2阶RSM: y β0 Σβ_i*x_i Σβ_ii*x_i² Σβ_ij*x_i*x_j # 方差分解Var(y) ΣVar(β p a hrefhttps://download.csdn.net/download/weixin_42682925/25987644 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p