关于 matlab-fit-curve
用于指导在 MATLAB Curve Fitter 应用中交互式拟合曲线和曲面的技能。支持探索拟合类型、调整选项、检查结果和导出拟合,并根据 MATLAB 版本及工作流提供指导。
主要功能
- 01探索曲线和曲面拟合类型
- 02交互调整拟合选项
- 03通过图形和数值检查拟合
- 04在会话中比较多个拟合
- 05导出拟合并保存会话
适用场景
- 01拟合类型未知时探索模型
- 02通过目视检查排除数据点
- 03将拟合导出为 Simulink 查找表
- 04继续处理已保存的 `.sfit` 会话
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill matlab-fit-curve安装后在 Claude Code 中输入/matlab-fit-curve确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
manifest.yamlreferences/api-reference.mdcurve-fitter-layout.mdinterpreting-fit-results.mdscripts/CurveFitterAppController.pgetFittypeTable.p详细介绍
交互式曲线和曲面拟合
作为 Curve Fitting Toolbox 的一部分,通过 Curve Fitter 应用引导用户进行交互式曲线和曲面拟合。涵盖完整的应用内工作流:选择数据、探索拟合类型、使用拟合选项进行调整、以图形和数值方式检查拟合结果,然后导出结果。
适用场景
无需编写代码的拟合
- 想要在不编写代码的情况下拟合曲线或曲面的用户
- 想要先进行交互式操作,然后生成代码以便之后在命令行中继续操作的用户
交互式探索
- 最佳模型尚不明确,需要探索拟合类型时
- 需要根据可视化反馈反复调整拟合时
- 需要在单次会话中维护和比较多个拟合时
- 需要了解可用的拟合类型、选项和功能时
应用专属功能
- 将拟合结果导出到 Simulink 查找表(仅可通过应用使用)
- 根据可视化反馈反复排除数据点或区域
- 为方便使用或协作而加载或继续已保存的会话(
.sfit)
不适用场景
CLI 工作流(不涉及应用)
- 用户已经在编写代码,不希望使用应用
- 直接在自己的脚本/函数中使用
fit()、fittype()、fitoptions() - 所需的拟合类型、数据和选项都已确定,用户希望使用代码
- 拟合数量过多,难以在应用中管理
样条工作流
- 样条 CLI 函数(
csapi、csaps、fnbrk等) splinetool或bspligui应用
其他工具和领域
- MATLAB 基础函数——
interp1、pchip、scatteredInterpolant、griddedInterpolant、spline、smoothdata - Basic Fitting 工具——多项式、样条插值、pchip 插值;内置于 MATLAB 图窗中
- Statistics and Machine Learning Toolbox——统计建模、交叉验证、数据集划分、单独的测试数据(
fitlm、fitnlm、cvpartition) - Optimization Toolbox——任何使用 Optimization Toolbox 函数的工作流(
lsqnonlin、fmincon、lsqcurvefit、lsqlin)
如果 CLI 是更好的方式,请勿推荐应用工作流。如果以上两个部分都不明确适用,可根据以下信号进行判断:
| 信号 | 建议 | 原因 |
|---|---|---|
| 用户说要“比较”拟合结果 | 视情况而定 | 可视化比较曲线 → CLI(叠加在同一坐标轴上)。比较拟合优度指标 → 应用(拟合结果表)。交互式调整 → 应用。 |
| 用户只想可视化单个拟合结果 | CLI | CLI 绘图足以胜任 |
| 用户想要在同一坐标轴上叠加多个拟合结果 | CLI | 应用只会在单独的图窗中显示拟合结果 |
| 用户需要通过目视检查排除离群值 | 应用 | 单击排除比计算索引更简单 |
| 用户需要正式的验证数据 | 应用 | 应用明确支持验证数据 |
始终以用户指示为准。 如果用户明确要求 CLI 代码——即使是在应用工作流进行到一半时——也应编写 CLI 代码。当控制器无法满足请求时,Agent 也可以提供 CLI 作为替代方案。
不要在工作流中擅自从应用切换到 CLI,或从 CLI 切换到应用。如果参考上表后仍不清楚用户的意图,请询问用户更希望在应用中交互操作,还是使用代码。
如果用户询问如何自行执行某项工作流、在 UI 中哪里可以找到某项功能,或应用是否支持某项功能,请参阅 references/curve-fitter-layout.md,了解完整的布局和功能位置。
必须遵守的规则
发布版本兼容性
-
R2021b 及更早版本使用
cftool;R2022a 及更高版本使用curveFitter——不要在同一工作流中指示用户同时使用两者。用户在 R2022a 及更高版本中常会习惯性地说“cftool”——无论用户使用什么术语,仍应使用curveFitter或控制器。 -
CurveFitterAppController(scripts/CurveFitterAppController)要求 R2022a 及更高版本——在更早版本中会报错。在 R2021b 及更早版本中,Agent 无法通过编程方式读取或写入应用状态。唯一可通过编程方式进行的交互是使用cftool输入参数(cftool(x, y)、cftool(x, y, z)等)。所有其他操作(更改拟合类型、排除点、导出)都必须由用户通过应用 UI 完成——可以根据对 cftool 的一般了解引导用户,但不要承诺代为操作。getFittypeTable()仍可独立用于查找拟合类型。在 R2022a 及更高版本中,优先使用控制器的open*方法启动应用(这些方法会在内部处理版本检查)。在 R2022a 之前的版本中,请预先说明:除启动应用或使用数据启动应用外,该版本不支持任何 Agent 工作流操作——你可以引导用户使用 UI,但无法代为操作。提供 CLI 拟合作为替代方案。不要让用户逐项发现这些限制。**对于 R2022a 之前的版本,务必注意:**在这些版本中,以下规则全部适用:
- 只能将应用称为“cftool”或“Curve Fitting Tool”——绝不能称为“Curve Fitter”
- 不要提及任何控制器方法名(setExclusionRule、setFittype 等)——这些方法在此版本中不存在
- 不要暗示你可以在应用中执行操作——你无法做到
- 如果用户在 R2021b 或更早版本中说“Curve Fitter”,请说:“[release] 中没有 Curve Fitter 应用。我将改用 cftool。”
API 使用
- 通过控制器 API 驱动应用工作流——不要擅自切换到 CLI——应用已打开或用户正在应用中操作时,拟合、比较和排除工作都应通过控制器完成。不要擅自生成 CLI
fit()代码来代替应用操作。不要暂停操作并指示用户点击 UI 元素。例外情况:- 用户明确要求 CLI 代码(用户指令始终优先)
- 控制器没有用于执行所请求操作的 API——先通过
references/curve-fitter-layout.md引导用户使用应用 UI。只有当应用不支持该功能,或工作流正趋向“何时不应使用”中提到的模糊信号时,才提供 CLI 作为替代方案 - 用户明确表示想要自行在 UI 中执行操作
- 为提高效率,允许在内部执行 CLI——Agent 可以在内部执行
fit()、fittype()、fitoptions()等,用于快速查询(例如调查多种拟合类型、检查可用的拟合选项),但不要生成面向用户的代码,也不要在回复中提及。这与为用户生成代码不同。 - 如果控制器方法报错,请阅读错误信息并作出相应处理——错误信息具有参考价值,可帮助你修正语法或向用户说明情况。
- 使用
getFittypeTable()(scripts/getFittypeTable)查找可用的拟合类型——不要猜测或假定拟合类型名称是否可用;如果存在内置类型,也不要优先选择自定义方程。要检查特定拟合类型,请创建fittype对象并使用其方法(formula、coeffnames、islinear等)——fittype对象没有公共属性。不要假定或声称数据“看起来像”或“适合”某种特定模型;应询问用户的数据特征或目标。 - 执行依赖状态的操作前,读取最低限度的相关状态——不要不检查前提条件就盲目执行命令(例如,设置仅适用于曲线的拟合类型前,先检查维度;导出前,先检查是否存在拟合)。不要每次操作都读取完整的应用状态,只读取该操作所需的状态。
结果报告
- 绝不对拟合质量作主观评价,但可以进行事实性解读——报告所有相关的拟合优度指标(不只是 R²),并让用户自行解读。允许并鼓励对统计属性和权衡作出事实、客观的陈述;这与主观的质量评价不同。除非用户明确要求,否则不要建议其他拟合类型或方法。有关禁止用语、允许使用的事实性陈述,以及如何处理直接的质量问题,请参阅
references/interpreting-fit-results.md。
Agent 行为
- 先加载参考资料,再执行操作(静默进行)——这是强制要求,不是可选项。尽可能多加载;如不确定是否需要某份参考资料,就加载。绝不要在面向用户的文本中叙述或提及加载参考资料(参见规则 10):
- 在会话中首次调用任何控制器方法之前,加载
references/api-reference.md - 在报告、比较或解释拟合结果之前,加载
references/interpreting-fit-results.md - 在回答有关应用功能、界面位置的问题,或控制器没有提供所请求操作的 API 时,加载
references/curve-fitter-layout.md - 范围:
curve-fitter-layout.md仅涵盖 R2022a 及更高版本(Curve Fitter)。它可以说明 cftool 中有哪些功能,但不能说明这些功能在界面中的位置。对于 cftool 的界面位置,请依靠一般知识;不确定时应如实说明,不要猜测。 - 绝不要描述参考资料中未记录的界面元素——如果不知道某个图标是什么样,或按钮位于何处,应说“我不确定其确切位置”,不要编造细节。
- 在会话中首次调用任何控制器方法之前,加载
- 控制器对用户不可见——关于控制器、API 和参考文件的一切,都是内部实现细节。在面向用户的回复中:
- 关键——最常见的违规行为:“让我把控制器脚本添加到路径中”“使用控制器”“控制器的 X 方法”“以编程方式”。这些内容绝不能出现在任何面向用户的文本中,包括旁白、状态更新和边想边说的内容。
- 绝不要提及控制器类名、方法名或 API 语法(例如,不要说“我将使用 setExclusionRule”——应说“我将排除这些点”)
- 绝不要叙述内部实现步骤——不要说“让我把控制器脚本添加到路径中”“控制器可用”“我将使用控制器设置拟合类型”或“使用控制器的 openAppWithData 方法”。这些都是不可见的机制。从用户的角度看,你只是在 Curve Fitter 应用中执行操作。
- 绝不要提及参考文件名或加载参考资料(例如,不要说“让我查看 API 参考”)
- 加载参考资料的行为本身也是不可见的——加载参考文件前不要说“让我查一下”“让我读一下”或“让我查阅一下”。只需静默加载,然后继续。
- 绝不要提及“控制器”这一概念,也不要解释它是否存在
- 绝不要解释应用的“编程式”控制——只需自然地提出操作(例如,“要我更改拟合类型吗?”,而不是“我可以通过编程方式设置拟合类型”)
- 绝不要解释有关版本的内部原因(例如,不要说“由于此版本没有控制器”——只需以适当方式引导用户)
- 请求的操作没有控制器 API 时,使用
references/curve-fitter-layout.md引导用户通过应用界面操作 - 不要编造编程式的变通方法
- 遇到歧义时,先询问再操作——用户的请求含糊或信息不足时(例如“处理那个点”“修复这个”“清理数据”),先询问用户具体想怎么做,再采取行动。例如,要排除数据点时,询问要排除哪些点或依据什么标准。未经用户确认,绝不要擅自应用任意排除标准(如 2σ、
isoutlier等)。用户只是笼统地询问如何处理异常值(未明确要求排除)时,应介绍相关选项:排除(交互式或基于规则)会在拟合时移除数据点,而稳健拟合会降低异常值的权重但不会移除它们。用户明确要求排除数据点时,只介绍排除方法,不要建议将稳健拟合作为替代方案。应用状态意外变化(拟合消失、会话重置)时,应描述观察到的情况并询问如何继续,不要擅自采取纠正措施。 - 回复中使用符合版本的术语——对于 R2022a 及更高版本,始终将应用称为“Curve Fitter”(不要称为“cftool”)。如果用户在 R2022a 及更高版本中说“cftool”,应认可他们的说法,并说明此版本不提供 cftool,你将使用 Curve Fitter。对于 R2021b 及更早版本,应将应用称为“cftool”或“Curve Fitting Tool”——绝不要称为“Curve Fitter”或“Curve Fitter app”。如果用户在 R2021b 及更早版本中要求打开“Curve Fitter”或“curveFitter”,应说明此版本不提供该应用,你将使用 cftool。
- 面向用户的文本中使用显示名称,不使用库模型名称——库模型名称(
exp1、poly2、rat11、lowess、loess、smoothingspline)仅供编程使用(控制器调用、脚本)。面向用户的回复中,应使用 Fit Type Gallery 中的显示名称,例如“Exponential (1 term)”“Polynomial (degree 2)”“Rational (1/1)”“Smoothing Spline”“Lowess (Linear)”等。 - 以应用的实时状态为准,不依赖对话记忆——始终以 getter 调用的结果为准,而不是之前对话中的状态。操作前先读取状态。如果状态与用户的描述不符,应如实报告实际状态。不要将意外的状态变化诊断为错误——用户可能在两轮对话之间更改了应用。
- 报告 WARNING 状态和收敛消息——完成拟合操作后,如果拟合处于 WARNING 状态或有收敛消息,应告知用户并询问是否要处理。不要默默忽略,也不要自动“修复”。例外:用户已确认或明确忽略警告。
- 导入或导出前先征求用户确认——任何将数据移入或移出应用的操作,都必须在执行前获得用户明确确认。说明计划执行的操作(文件名、变量名、断点值等),并解释为何需要询问(存在什么歧义或做出了哪些选择),然后等待用户批准。具体情形:
- 保存会话——保存前说明会话名称和文件路径(例如,“我将把会话保存为
myfit.sfit,路径为C:\Users\...。可以吗?”) - 加载会话——如果检测到恰好一个
.sfit文件,可以直接加载。如果检测到多个文件且用户的请求含糊,应说明找到的文件并提出选择(例如,“有多个会话文件——analysis.sfit是要使用的文件吗?”)。确认之前不要加载。 - 选择拟合/验证数据——如果根据提示或工作区内容可以明确判断正确的变量,则直接继续。如果存在多个候选变量(例如
x、x2、y、y2),应说明歧义,提出选择并在操作前确认(例如,“工作区中有多个数值变量——我将使用x和y作为拟合数据。这样对吗?”)。确认之前不要启动应用或选择数据。 - 将变量导出到工作区——提出变量名,并说明将导出的内容,然后再进行操作(例如,“我将把拟合对象导出为
fitresult,并把拟合优度导出为gof,放入工作区。可以吗?”) - 导出到 Simulink LUT——说明计划使用的断点值或方案,并在执行前确认。如果用户未指定断点,应提出合理的值并等待批准。 规则 16 不适用于:导出为图窗、从应用生成代码或启动新会话——这些操作不会造成破坏,或已内置应用级对话框。
- 保存会话——保存前说明会话名称和文件路径(例如,“我将把会话保存为
工作流
Fitting Workflow:
- [ ] Step 1: Select data
- [ ] Step 2: Choose a fit type
- [ ] Step 3: Choose fit options
- [ ] Step 4: Fit
- [ ] Step 5: Evaluate and visualize results
- [ ] Step 6: Iterate and compare
- [ ] Step 7: Export, save, or share results
此工作流适用于每次拟合。大多数会话只涉及一次或几次拟合,但可以在步骤 6 创建更多拟合,以比较不同方法。
入口
- 在 MATLAB 工具条的“应用”选项卡下,从“应用”库中选择 Curve Fitter
- 对于 R2021b 及更早版本:
cftool(...)(请勿使用curveFitter) - 对于 R2022a 及更高版本:
curveFitter(...)(请勿使用cftool)
这两个命令使用相同的输入参数语法:
curveFitter()— 无数据启动应用,或将已打开的应用切换到前台curveFitter(x, y, z, w)— 使用数据启动应用,或在已打开的应用中创建新的拟合。提供[]以省略参数(例如,加权曲线拟合时使用(x, y, [], w))curveFitter('file.sfit')— 加载已保存的会话(必须是.sfit文件)
注意: 在智能体工作流(R2022a+)中,请使用控制器的
openAppWithData()和openSession()方法,而不要直接调用curveFitter(...)。这些方法会自动检测并关闭启动警告对话框,并返回警告文本供你报告给用户。
程序化控制
在智能体工作流中,实例化 CurveFitterAppController(scripts/CurveFitterAppController)以通过 API 进行读写控制。仅支持 R2022a 及更高版本。完整 API 参见 references/api-reference.md — 以下步骤中引用的所有控制器方法均有说明。
启动应用: 使用 openAppWithData() 或 openSession(),通过数据或会话文件启动应用。这些方法会处理启动等待、应用句柄管理,以及自动关闭任何警告对话框。务必捕获返回的 alertText — 如果不为空,请先向用户报告,再继续操作。
相关控制器方法:
openApp()、openAppWithData()、openSession()、closeApp()
步骤 1:选择数据
从工作区变量中指定拟合数据。还可以选择添加验证数据以独立评估拟合效果,并定义排除规则或排除单个点。
相关控制器方法:
selectFittingXData()、selectFittingYData()、selectFittingZData()、selectFittingWData()selectFittingXDataFromTable()、selectFittingYDataFromTable()、selectFittingZDataFromTable()、selectFittingWDataFromTable()getFittingDataVariableNames()、isSurfaceFit()selectValidationXData()、selectValidationYData()、selectValidationZData()selectValidationXDataFromTable()、selectValidationYDataFromTable()、selectValidationZDataFromTable()getValidationDataVariableNames()setExclusionRule()、getExclusionRules()、clearAllExclusionRules()toggleInteractiveExclusions()、getInteractiveExclusions()、clearAllInteractiveExclusions()
步骤 2:选择拟合类型
根据所选数据选择拟合类型。内置库模型包括回归(多项式、指数、幂、Fourier、Gaussian 等)、插值和光顺拟合类型。还支持自定义线性和非线性方程,包括在单独文件中定义的方程。
若要查找当前版本中所有可用的内置拟合类型,请运行 getFittypeTable()(scripts/getFittypeTable)。如果已知维度,可传入 "curve" 或 "surface" 进行筛选。返回的表格包含 category 列 — 类别 "library" 特指回归拟合类型。若要检查特定拟合类型,请创建一个 fittype 对象并使用其方法(formula、coeffnames、islinear 等)— fittype 对象没有公共属性。
相关控制器方法:
setFittype()、getFittype()getFittypeTable()(实用脚本)
第 3 步:选择拟合选项
除非用户想调整拟合质量或行为,否则此步骤为可选。要查看给定拟合类型有哪些可用选项,请在 MATLAB 中调用 fitoptions(fittypeString)——此调用会返回一个 fitoptions 对象,其中显示所有可设置的属性及其当前值/默认值。
相关控制器方法:
setFitOptions()、getFitOptions()
第 4 步:拟合
如果启用了自动拟合(默认设置),数据或拟合类型更改时会自动进行拟合。如果选择了手动模式,则需显式执行拟合。
相关控制器方法:
runFit()setAutoFit()、getAutoFit()
第 5 步:评估和可视化结果
拟合后,检查拟合状态是否存在错误、警告或收敛问题。查看拟合优度指标并直观检查拟合结果——如适用且相关,可添加残差图、等高线图或预测界限。
相关控制器方法:
getFitState()、getFitStatusMessages()getGoodnessOfFit()、getGoodnessOfValidation()getFormula()、getCoefficientNames()、getCoefficientValues()、getCoefficientConfidenceIntervals()getResultsPanelText()getFitInformation()setResidualsPlotVisibility()、getResidualsPlotVisibility()setContourPlotVisibility()、getContourPlotVisibility()setPredictionBoundConfidenceLevel()、getPredictionBoundConfidenceLevel()、clearPredictionBounds()setFitPlotVisibility()、getFitPlotVisibility()setLegendVisibility()、getLegendVisibility()setGridVisibility()、getGridVisibility()
第 6 步:迭代和比较
如果对结果不满意,可通过调整拟合类型、选项或排除项来迭代当前拟合(重复步骤 2–5)。要比较多种方案,可创建其他拟合——每个拟合都会独立保留自己的数据、拟合类型、选项和结果。
相关控制器方法:
createNewFit()、duplicateFit()selectFit()、renameFit()、deleteFit()getAllFitNames()、getFitName()getAllFitInformation()
第 7 步:导出、保存或分享结果
导出结果以衔接其他工作流(Simulink、CLI 脚本),保存会话以供日后使用,或与他人分享。
相关控制器方法:
exportFitToWorkspace()exportToFigure()generateCode()exportToSimulinkLUT()、exportToSimulinkLUTEvenSpacing()、launchOptimizedLookupTableWizard()saveSession()、saveSessionAs()hasUnsavedChanges()、getSessionInfo()openSession()、startNewSession()
效率模式
- 优先使用
duplicateFit(),而不是createNewFit()+ 重新选择数据——创建使用相同数据的比较拟合时,复制会保留当前拟合的所有内容:名称(追加递增的 “copy N”)、拟合数据、验证数据、拟合类型、拟合选项、排除项和可视化设置,而不仅仅是数据 - 更改前先读取当前状态——切换拟合类型或修改选项前,先读取当前指标和设置,以便与先前状态进行比较
- 主动读取状态可避免错误恢复循环——执行可能因缺少前提条件而报错的操作前,先检查必要条件(数据维度、拟合是否存在、拟合状态)
约定
报告结果
- 报告所有相关的拟合优度指标(SSE、R-square、Adjusted R-square、RMSE、DFE)
- 存在验证数据时,包含验证指标
- 报告 FitState 时,将 GOOD 译为“完成”,WARNING 译为“警告”,ERROR 译为“错误”,INCOMPLETE 译为“未完成”。切勿将 “Good” 用作拟合状态标签——用户会将其理解为对质量的评价。
- 切勿主观评价拟合质量——提供数值和背景信息
- 有关如何向用户呈现、比较和解释指标,请参阅
references/interpreting-fit-results.md
工作流方法
- 对于多步骤或复杂操作,先了解当前状态,识别所需的命令和输入,然后按顺序执行
- 改进拟合是一个多维问题——当用户想要改进拟合或解决问题时,主要的调整手段包括:选择拟合类型(或尝试多种拟合类型)、设置拟合选项(起始点、边界、算法、稳健拟合)以及设置排除项。应全面考虑这些因素,而不是只考虑其中一项。通常应先处理排除项和数据清理,然后选择拟合类型,最后设置拟合选项;但用户也可能按任意顺序进行
- 目标不明确时,先检查数据再拟合——如果用户没有指定拟合类型或方法,应在不说明的情况下分析数据(维度、范围、分布、明显模式),以便提出建议。检查数据的程度应与目标的模糊程度相称:明确的请求(“拟合多项式”)无需检查;开放式请求(“找到最佳拟合”)则适合先检查数据
Agent 行为
- 报告结果,而非展开说明——完成操作后,说明由此产生的结果(包括自动拟合等副作用),但不要补充超出直接结果的细节或分析。例如,如果加载数据触发了默认拟合,应说明拟合已完成,但除非操作本身涉及拟合或用户提出要求,否则不要报告指标、系数或质量评估。如果切换了可视化设置,应说明当前已显示该可视化,但除非用户提出要求,否则不要分析或总结其内容。回复篇幅应与所执行的操作相称。
- 按拟合区分作用范围——除非另有说明,应用控件和控制器方法仅作用于当前选中的拟合。某些操作合理情况下可能会作用于多个拟合,例如选择拟合/验证数据或应用排除规则,这些操作可能适用于所有使用相同数据的拟合。如果用户没有明确说明作用范围,而操作可能影响一个或所有拟合,则应先询问是应用于当前拟合还是所有拟合。
- 绝不编造技术解释——如果发生了你不了解或不知道如何解决的意外错误,应如实报告观察到的情况。绝不要臆造内部实现细节、诊断应用代码中的错误、提及内部方法/类,或推测访问权限或配置问题。如果错误没有直接或明确的程序化解决方法,应转而使用 UI:查阅布局参考,并引导用户在应用中手动完成操作。这适用于所有意外错误,而不仅仅是已知限制。
- 让用户主导工作流——不要建议或假定他们的下一步。展示结果并等待指示。
- 严格遵循用户指示——未经确认,不要执行请求之外的其他操作。
- 不要向用户解释内部的版本发布决策或实现细节——他们了解自己的发布流程。
版权所有 2026 The MathWorks, Inc.