Origin分段拟合实操:从拐点定位到连续约束与结果检验

发布时间:2026/10/6 4:22:15
Origin分段拟合实操:从拐点定位到连续约束与结果检验 做数据分析的人大概都遇到过这种尴尬一张散点图摆在眼前前面一段走直线后面突然拐了弯你用 Origin 自带的线性拟合、多项式拟合轮番上阵结果总是一端压住了、另一端就飞出去。于是自然会想Origin 到底能不能做分段拟合答案是能但它确实没有一个像 Excel 趋势线那样一键出结果的分段拟合按钮需要你把思路理顺之后自己搭。这篇文章我就把在 Origin 里做分段拟合的完整经验写出来包括两种主流做法、断点处理思路、连续约束的实现以及一堆只有实际跑过才会碰到的坑。1. 先判断你的数据到底该不该分段1.1 三种一眼就该分段的曲线形状不是所有弯弯曲曲的数据都适合分段拟合但有些数据天生就该分。最常见的是材料拉伸曲线。应变从零到某个临界点之前应力随应变线性上升这是弹性段斜率就是弹性模量过了屈服点之后材料进入塑性硬化阶段曲线斜率明显变小甚至二次硬化、颈缩下降都有。两段背后的物理机制完全不同你不可能用一条直线描述整个过程硬用高次多项式去追也只会追出一个没有物理意义的曲线。第二种典型是吸附动力学或热重分析。初始阶段快速失重、快速吸附曲线陡峭经过某个时间点后进入平台期变化速率骤降。这个转折点往往对应表面活性位点耗尽或反应物浓度下降分段拟合可以把快反应和慢反应两个子过程分开描述。第三种是某些响应曲线比如半导体传感器的电阻-温度关系、催化剂活性-温度曲线经常存在“低温区一个机制、高温区换了机制”的切换。气体传感器电阻在对数坐标下往往分成两段直线低温段受表面吸附控制高温段受晶界势垒控制拐点就是机制切换的标志。这类场景的共同特征是存在明确的拐点或机制切换点而且每一段都有相对简单的函数形式。如果你的数据只是整体平滑弯曲那不属于“非分不可”可能用指数、幂律或对数变换就能全局拟合没必要引入分段复杂度。1.2 为什么局部拟合好过硬拉一条高次多项式有人会问分段拟合多麻烦我直接用一个五次多项式把整条曲线撸一遍行不行行但结果往往很丑。高次多项式在拟合“前段直线、后段直线”这类数据时必须靠多次项在中间制造拐弯。拟合误差可能不大但曲线会在两端剧烈摆动外推一点点就离谱而且系数之间互相抵消每个系数单独看都没有意义。这在数学上叫多项式端点振荡是 Runge 现象的老问题。分段拟合的本质是承认“不同区间由不同规律支配”。每一段用一个简单模型参数本身就对应物理量比如弹性模量、硬化系数、吸附速率常数。这样做出来的结果能解释、能外推、能跟别人讨论不只是“画了一条穿过点的线”。所以我的建议是先做一次全局拟合看残差是否呈现明显的系统性偏差如果有、又能在数据背后找到机制切换的理由那就大胆分段。2. 准备动作找拐点、定分段数、决定断点处要不要连续2.1 用一阶微分把拐点从噪声里找出来很多人找拐点靠肉眼这在小噪声、大样本时还行数据稍微乱一点就麻烦——同一个点上午看成拐点下午看成噪声。更可靠的办法是用一阶导数定位。对连续的物理过程拐点本质上就是斜率发生明显变化的位置。比如弹塑性拉伸曲线弹性段斜率恒定为弹性模量进入塑性段后斜率下降下降发生的位置就是屈服点附近。在 Origin 里操作分两步。先平滑菜单路径是 Analysis Signal Processing Smooth选 Savitzky-Golay窗口和多项式阶数根据噪声水平调节窗口选 5 到 15 比较常见。然后做微分Analysis Mathematics Differentiate对平滑后的曲线求一阶导数。把微分曲线画出来之后斜率平台切换的位置会非常清楚。我处理过一组带较强噪声的拉伸数据直接看散点图根本定不准屈服点在 0.048 还是 0.055但平滑微分之后一阶导数在 0.051 附近出现一个明显的台阶这就把拐点位置锁定了。如果一阶导数还是不够清晰可以做二阶导数看极值位置不过那通常是在数据比较光滑时才用。2.2 断点的三种处理模式固定、扫描、参数化拐点找到之后断点怎么处理是决定拟合成功与否的关键。有三种模式。第一种固定断点。如果断点有理论支撑或行业标准比如屈服强度规定用 0.2% 残余应变对应的应力那就直接把断点写死成 0.002。这种情况下拟合最稳定表达式最简单。第二种手动扫描。断点不确定但大概在一个范围内比如 0.045 到 0.06 之间。那就在这个范围里按步长取若干个值每个值固定断点做一次拟合记录残差平方和 SSE画一条 SSE 随断点变化的曲线取谷底对应的断点。这个做法本质上是把断点当作超参数来优化比直接当成拟合参数稳很多。第三种把断点写进自定义函数当作拟合参数让 Origin 自动优化。这个方法理论上最省事但实际上坑很多后面 5.1 节会详细讲。先记住结论断点参与拟合容易不收敛优先选固定或扫描。2.3 C0 连续还是允许跳跃数学模型要贴近物理本质分段拟合还有一个必须提前做决定的点两段曲线在断点处是否要求连续。如果要求两段端点重合这在数学上是 C0 连续。弹塑性双线性模型就是典型的 C0 连续弹性段末端应力等于塑性段起始应力材料不会在屈服点发生应力突变。连续约束会让曲线看起来自然也能减少一个自由参数。如果两段是独立拟合出来的那断点处大概率会有一个台阶也就是应力跳变。有些场景允许这种跳变比如昼夜交替条件下某些环境参数的变化两个状态本来就是突变的。还有一种情况是要求 C1 连续也就是断点处不仅位置重合切线斜率也相同。这个在分段拟合里要慎用因为如果两段都是斜率为正的直线斜率相同意味着它们其实是同一条线分段就没有意义了。C1 连续通常用于分段多项式样条那是另一种处理思路。我的原则很简单连续过程选 C0突变过程允许跳跃不要盲目追求高阶光滑。3. 最稳的做法拆成两段数据独立拟合再合图3.1 拆分工作表的操作和容易出错的地方如果不想碰自定义函数最直接的办法就是把数据拆成两段分别用 Origin 自带的拟合工具跑然后把结果拼到一张图里。先说拆分。假设工作表里 A 列是应变B 列是应力拐点在 0.05。你可以选中应变小于等于 0.05 的所有行复制粘贴到 C 列和 D 列分别命名 strain_1 和 stress_1再把应变大于 0.05 的行复制到 E 列和 F 列命名 strain_2 和 stress_2。这样原数据一分为二。有一个容易出错的细节如果数据里恰好有一个点在断点上这个点该归哪段我建议把它归入第一段第二段从下一个数据点开始。一个点同时参与两段拟合会让断点附近的结果被过度加权反而不好。拆完之后建议先分别画一次散点图确认分段位置正确别急着拟合。我就犯过把两段选反的错第一段用了后半段数据拟合出来斜率是负的整个人都懵了。3.2 第一段线性拟合与第二段非线性拟合的菜单路径拆分之后对第一段进行线性拟合。选中 strain_1 和 stress_1 两列菜单路径 Analysis Fitting Linear Fit对话框里确认输入数据范围。这里有一个很实用的选项如果第一段理论上应该过原点比如线弹性段的应力-应变关系是应力等于弹性模量乘以应变没有初始应力那就在 Linear Fit 对话框里勾选 Fix Intercept at 0强制截距为 0。否则拟合出的截距可能是个不合理的负数。第二段如果是直线直接同样的线性拟合。如果第二段是曲线用 Analysis Fitting Nonlinear Curve Fit在函数库里面选模型比如二次多项式、指数、幂函数甚至自定义。NLFit 的操作和普通线性拟合不太一样要选函数、填初值、点迭代这个流程我放到下一章配合自定义函数一起讲。独立拟合的好处是每段可以使用 Origin 函数库里的任意模型线性就用 Linear Fit非线性就用 NLFit不需要写一行公式。3.3 把独立拟合曲线合并进原图的三个步骤独立拟合完成后Origin 会自动在当前工作表旁边生成拟合结果列类似 FitLinear1 的 X 列和 Y 列。我们要做的就是把它们加到原始数据那张图里。操作三步右键图形的图层图标选择 Layer Contents打开图层内容对话框把 FitLinear1 对应的 Fit 列添加进去在 Plot Details 里调整线型、颜色让它和原始数据区分开。多数情况下线性拟合输出的 Fit 列只覆盖参与拟合的数据范围所以图上不会出现超出区间的内容。如果发现某条拟合曲线“蹿”出了区间多半是在拟合前选中了整列而不是区间数据回去检查一下输入范围就行。把两条拟合曲线都加上之后如果有断点错位的问题看 3.4 节的处理方法。3.4 独立拟合的限制断点处出现台阶怎么办独立拟合最明显的短板是两段参数互不约束断点处可能出现台阶。第一段在 0.05 处算出的应力是 102 MPa第二段从 0.051 开始拟合外推回 0.05 处可能变成 95 MPa。图形上就是两段直线在断点处错开。如果物理上要求 C0 连续可以用一个技巧对第二段做“以断点为原点”的回归。具体来说新建列 dx x - 0.05dy y - y0其中 y0 是第一段在断点处的预测值然后对 dx 和 dy 做线性拟合并勾选 Fix Intercept at 0。这样第二段直线必然从断点处接上第一段连续约束就实现了。这个方法的好处是完全不依赖自定义函数用的是 Origin 自带功能适合不想写表达式的人。缺点是参数在拟合前就要做一系列数据变换步骤多一点而且 y0 本身有第一段拟合误差这个误差没有传递到第二段的统计结果里。要求严格的话还是推荐下一章的自定义函数方案。4. 进阶做法自定义分段函数一次拟合出带连续约束的结果4.1 从 Fitting Function Builder 开始函数类型与表达式写法如果你希望把两段拟合一次做完而且断点处严格连续那就要用到自定义分段函数。先打开函数构造器菜单路径 Tools Fitting Function Builder。选择创建一个新函数类型选 User Defined下面的表达式选 Expression。给函数起个名字比如 PLSeg2这个名字之后会出现在 NLFit 的函数列表里起得短一点、不带空格比较好。接着设置参数。因为我们要做一个连续的双线性分段函数需要三个自由参数第一段斜率 a1、第一段截距 b1、第二段斜率 a2。注意这里故意没有设 b2原因后面马上讲。函数体可以写成一个分段表达式。Origin 的表达式里支持逻辑判断相乘也就是当条件成立时返回 1、不成立时返回 0这是我最推荐的写法。4.2 用条件判断写分段表达式两种写法都给你假设断点固定为 0.05。第一种写法是用 if 函数y if(x 0.05, a1*x b1, a2*x b2);这个写法很直观前半段是第一条直线后半段是第二条直线。但需要 b2 作为一个独立参数四条参数一起拟合断点处连续与否完全不受约束。第二种写法是用逻辑值相乘y (x 0.05) * (a1*x b1) (x 0.05) * (a2*x b2);两种表达式在 Origin 里都能跑。就我个人经验逻辑值相乘的写法在非线性迭代里的解析稳定性更好尤其是当你之后想在表达式里叠加复杂分支条件时if 嵌套一旦写多就容易出现解析错误。所以下面的连续版表达式我都用逻辑值相乘来写。4.3 连续约束用消参实现a1 x0 b1 a2 x0 b2如果两段要求在断点处 C0 连续也就是第一段在 0.05 处的值等于第二段在 0.05 处的值需要满足a1 * 0.05 b1 a2 * 0.05 b2把这个等式整理一下b2 就可以用其他三个参数表示b2 a1 * 0.05 b1 - a2 * 0.05把 b2 代回第二段表达式分段函数就变成y (x 0.05) * (a1*x b1) (x 0.05) * (a2*(x - 0.05) a1*0.05 b1);这个表达式的含义很漂亮第二段是从断点处出发、斜率为 a2 的一条直线它在断点的起点高度正好由第一段决定。这样一来参数从四个减到三个拟合更稳定而且每一段参数的物理意义都很清晰。材料双线性弹塑性模型写出来就是这个形式的。低应变段斜率为弹性模量高应变段斜率为切线硬化模量交点处应力严格连续完全符合固体力学常识。4.4 在 NLFit 里给初值、跑迭代需要注意什么自定义函数保存好之后打开 Analysis Fitting Nonlinear Curve Fit在函数列表里找到 User Defined 下面的 PLSeg2。NLFit 左侧有若干页面Data Selection、Function、Parameters、Bounds 等。先确认 Function 选的是 PLSeg2再回到 Parameters 页面填初值。初值怎么给从图上读。对上面的拉伸数据低应变段斜率目测在 2000 MPa 左右所以 a1 填 2000低应变段截距几乎为零b1 填 0塑性段斜率明显变缓目测 400 到 600 之间a2 填 500。这些初值不需要精确但量级必须对否则迭代很容易飞掉。填好初值之后点左侧的 Fit 按钮开始迭代。正常情况下可以看出 Chi-Square 从几百降到个位数参数逐渐收敛。迭代结束后结果工作表会输出参数值、标准误差、约化卡方、R 平方等指标。如果点完 Fit 之后参数直接变成 NaN 或者明显不合理先别慌绝大多数是初值量级问题参考第 5 节排查。5. 拟合失败排查初值、断点、收敛三个坑一次性讲透5.1 断点当成拟合参数为什么容易翻车这是分段拟合新手最容易踩的坑。为了省事有人会把断点 x0 也写进自定义函数当自由参数让 Origin 自己找最优断点表达式看起来也很简洁y (x x0) * (a1*x b1) (x x0) * (a2*x b2);理论上这是可以的但实际跑下来多半会翻车。原因在于 Origin 的 NLFit 默认用的是基于梯度的 Levenberg-Marquardt 算法这个算法要求目标函数对参数是光滑的至少局部要能求导。而由 if 或逻辑判断产生的分段边界处目标函数对 x0 的导数根本不连续梯度一碰到断点就会跳变迭代极易卡在局部极小甚至来回震荡。我见过最典型的情况是 x0 在两次迭代之间来回跳0.049 和 0.052 反复横跳其他参数的稳定性也一起被带崩。所以我的建议非常明确想把断点交给机器找就老老实实用 2.2 节的扫描法固定断点反复拟合画 SSE-断点曲线找谷底。断点扫描得到的残差曲线往往会有一个很宽的谷取谷底就行了。这种方法虽然笨但每一步都可控、可解释尤其适合论文或报告场景。5.2 初值给量的逻辑先用图上的直线段估一次很多时候拟合发散只怪初值太随便。记住一个原则初值要从图上读不要从空气里猜。打开散点图看第一段直线的斜率大概是多少。如果你在图上看到应变从 0 到 0.05应力从 0 涨到 100 MPa那斜率就是 100 除以 0.05 等于 2000填 2000。截距就是直线延长线在零应变处的值大约为零就填 0。第二段同理。另外一个好习惯是先做一个粗略的线性回归作为初值参考。选中第一段数据快速跑一次 Linear Fit把拟合出的斜率和截距抄进 NLFit 的参数初值里这样成功率会高很多。如果还是发散还有一个压箱底的办法先固定部分参数。比如在 Parameters 页面把 a1 固定为 2000只让 b1 和 a2 参与拟合跑通之后再解除 a1 的固定全部参数一起做一次最终的迭代。这个“先固定一部分、再全部释放”的思路在处理多参数模型时屡试不爽。5.3 我的三步排查清单从发散到收敛的实操记录如果你按照上面的流程还是没跑通按照下面这个三步清单排查。第一步检查模型形状和散点形状是否匹配。表达式选了线性模型散点却是明显弯曲的再怎么调参数都不可能收敛。先在 Function 页面里用“预览”功能看一眼函数曲线形状大致是什么走向方向不对就换模型。第二步检查参数的量级是否合理。在 Parameters 页面把初值跟真实物理量级比一下。如果你拟合的是一个 10 的负 4 次方量级的系数初值却填了 100梯度每一步都可能让参数飞出合理范围。这时候可以先把一个参数 Fix 住拟合其他参数找到合理值后再全部放开。第三步检查表达式中断点使用的区间是否写反。我遇到过把 x 0.05 写成 x 0.05 的情况结果第一段拟合了后半段、第二段拟合了前半段参数符号全部反过来看起来像是收敛了实际上完全错位。验证方法很简单用拟合出的参数手动算几个点对比原始数据一眼就能看出问题。5.4 怎么判断结果是“拟合出来”而不是“凑出来”参数收敛后别急着欢呼。判断拟合质量要问三个问题。第一参数标准误差是否远小于参数值如果拟合出的 a2 标准误差是 500而 a2 本身只有 480这意味着这个参数根本不确定模型可能被数据撑不起来。第二段如果数据太少或噪声太大这种情况很常见。结论通常是别分两段了或者需要补数据。第二残差是不是随 x 呈现系统性变化在 Origin 里生成残差列之后画残差对 x 的散点图如果残差呈现 U 形或趋势性爬坡说明拟合模型在某个区间仍然不合适要么断点位置不对要么函数形式不对。残差应该在零线左右随机分布。第三分段模型的优越性是否经得起统计检验一个简单做法是比较简化 AIC。同一起点下单一线性模型如果残差平方和 SSE_1 0.85分段拟合 SSE_2 0.12样本数 n 20单一模型参数个数 m_1 2分段模型 m_2 3那么简化 AIC 差值为 n * ln(0.85/0.12) 2*(2 - 3) 20 * 1.957 - 2 37.14明显支持分段模型。如果差值很小甚至为负分段拟合就是画蛇添足。最重要的还是那句大白话参数必须能用来讲道理。分段拟合出来的 a1 如果根本不等于已知弹性模量你得先怀疑拟合对不对而不是怀疑弹性模量测错了。6. 结果评价与出图让分段拟合经得起审稿人、导师和老板的追问6.1 光看 R 平方不够残差和参数误差才说明问题R 平方在分段拟合场景下非常具有欺骗性。因为分段拟合本来就是为了贴合数据形状每多分一段 R 平方必然上升。我记得有一次给一个两段直线数据做拟合单一线性模型的 R 平方只有 0.87分段之后就变成 0.993看起来脱胎换骨但实际上只要参数没有物理意义这个提升就是镜花水月。所以我在报告里一定会附上三样东西拟合参数表、参数标准误或置信区间、残差图。参数表要包含每一段的斜率和截距标注断点位置。置信区间如果包含 0就要说明这个参数可能没有统计显著性。残差图则是用来证明残差随机性的这在论文里是很有说服力的证据。6.2 断点竖线、拟合曲线和置信带的出图细节出图是分段拟合里很容易被忽视但同样重要的环节。断点位置必须画出来。最直接的方法是在工作表中新建列X 填两个相同的断点值比如 0.05 和 0.05Y 填一组从最小值到最大值之间的等间隔值然后把这一列作为折线加到图上。这样断点处就有一条竖直参考线读者一眼就能看到机制切换的位置。拟合曲线方面在 NLFit 对话框里通常可以选择是否生成置信带或预测带。如果你的 Origin 版本支持执行完拟合后回到图里双击拟合曲线在 Plot Details 里能找到置信带的显示开关。画出来之后建议用浅色填充区域表示置信区间注意不要盖住原始数据点。图例也需要整理。在 Origin 里右键图例选择 Properties可以把图例改成横向排列避免占太多垂直空间。我一般会在图例里把各条线的名称改成有意义的物理标签比如 Elastic Region、Plastic Region而不是默认的 B 列、C 列。这样图面干净拿出去就能用。6.3 分段数是机制数不是自由数过拟合的边界最后必须泼一盆冷水。分段拟合最大的风险是过拟合尤其是当你发现“三段直线拟合比两段直线拟合 R 平方更高”的时候。分段数应该等于你相信的物理机制数而不是数据特征数。两段直线背后是两个变形机制三段直线背后就必须有第三个机制的理由。如果只是为了让曲线更贴合而不断加分段那你本质上在用折线插值数据点拟合参数的置信区间会越收越紧但预测意义基本归零。判断过拟合还有一个简单信号对每个分段做外推。把第一段拟合直线外推到断点之后很远的位置看新预测值是否荒谬。如果外推结果完全不合理说明这个模型只能描述局部不能作为整体解释那就要重新审视分段方案了。我在实际操作中还有一个习惯把数据随机分成两部分用前半部分拟合用后半部分验证预测误差。如果验证误差远大于拟合误差多半是过拟合。这个方法在分段拟合这种参数较多的模型里特别能说明问题模型不是用来记住数据的是用来预测没见过的数据的。最后再分享一点个人体会。分段拟合这件事真正考验人的不是 Origin 的操作而是你对数据背后机制的理解。断点位置能不能讲清道理每个参数有没有物理含义远比 R 平方的小数点后面多一位重要。我现在的流程固定成三步先靠平滑微分定位拐点再固定断点做连续分段拟合最后用残差和参数误差验证结果。你按照这个思路走一遍会发现 Origin 里看起来麻烦的分段拟合其实是件很顺手的事。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询