# 曲线与曲面拟合对象与对象函数
这个主题说明了如何创建曲线与曲面拟合对象以及如何使用它们的对象函数对它们进行操作。在命令行窗口或者编写曲线与曲面拟合的 Syslab 程序来使用曲线拟合工具箱中的对象与对象函数。您也可以将曲线拟合工具箱与其他 Syslab 工具箱结合使用以创建曲线与曲面拟合工作流。
这个主题专注于如何编程式地创建与操作曲线与曲面拟合。
# 曲线拟合对象
在 Syslab 编程中,所有的工作区变量都是某个类型的对象(实例),这些类型包括但不限于 Float, String 以及 Funtion(函数句柄)。您也可以使用面向对象方法(OO)构造 Syslab 的自定义类型。
对象函数为仅操作某一特定类的对象的函数。对象函数通过限制输入数据的类型来使得对象函数仅能操作特定的数据类型,对其它类型的操作只能通过多重派发进行实现。通过构造细致的数据类型并通过多重派发实现对象函数对各类型的(不同的)操作是面对对象方法的目标。
曲线拟合工具箱为您提供了进行曲线拟合的数据类型:
FitType - 包含描述对您的数据的参数模型的所有信息的对象。对象函数允许您读取以及改变这些信息。
FitResult - 曲线与曲面拟合结果的共用类型,包含特定拟合的参数、拟合统计量等信息。对象函数允许您通过绘制、外插以及积分等后处理拟合。
一些对象函数对于两个对象都适用。比如,用于判断模型是否线性的适用于 FitType 对象函数 islinear 对 FitType 和 FitResult 都可以使用。而返回参数值的 coeffvalues 以及返回信赖区间的 confint 就仅能对 FitResult 对象使用。
曲线拟合对象存在依赖于类型以及拟合模型的域。比如,下述代码使用两个代码构造了 FitType 对象 f 与 FitResult 对象 c。
using TyCurveFitting
f = fittype("a*x^2+b*exp(n*x)")
常规模型:
y(a,b,n,x) = a*x^2+b*exp(n*x)
c = assign_result(f,1,10.3,-1e2)
c = 常规模型:
y(a,b,n,x) = a*x^2+b*exp(n*x)
系数:
a = 1.0
b = 10.3
n = -100.0
注意到 FitType 的输出仅有基本信息,比如它的 formula 与 indepnames 。
FitResult 与 FitType 对象在预测基值 x 的求值使用 fvallm 函数。您可以使用以下用法间接调用 fvallm 函数。
y = cfun(x) # FitResult 对象
y = ffun(coef1,coef2,...,x) # FitType 对象
# 曲线拟合对象函数
曲线拟合的对象函数允许您创建、读取以及调整曲线拟合对象。它们同样允许您使用像 plotfit, integrate 这样的对象函数对包含在曲线拟合对象中的所有信息进行操作。
列在下表的函数对 FitType 与 FitResult 对象均可以使用。
| FitType 对象函数 | 说明 |
|---|---|
| argnames | 读取输入参数名称 |
| category | 读取拟合类别 |
| coeffnames | 读取系数名称 |
| dependnames | 读取因变量名称 |
| fvallm | 模型在特定点进行求值 |
| fittype | 构造 FitType 对象 |
| formula | 读取公式 |
| indepnames | 读取自变量名称 |
| islinear | 决定模型是否线性 |
| numargs | 读取输入参数个数 |
| numcoeffs | 读取系数个数 |
| probnames | 读取问题参数名称 |
| set_option | 设置模型拟合选项 |
| typecur | 读取模型名称 |
列在下表的函数仅能对 FitResult 对象使用。
| 曲线拟合对象函数 | 说明 |
|---|---|
| assign_result | 构造 FitResult 对象 |
| coeffvalues | 读取系数值 |
| confint | 读取拟合系数信赖区间 |
| differentiate1 | 微分曲线拟合 |
| differentiate2 | 微分曲面拟合 |
| integrate | 积分曲线拟合 |
| plotfit | 绘制曲线拟合 |
| plot3fit | 绘制曲面拟合 |
| predipredintnt | 读取预测区间 |
| probvalues | 读取问题参数值 |
| quad2d | 数值积分曲面拟合 |
有些对象函数没有出现在上表也没有参考文档。这些额外的对象函数一般是曲线拟合工具箱使用的底层函数,因此一般对撰写一般的曲线拟合程序没有用处。
虽然您对 FitType 对象的域对象可以任意读取与修改(有些无法借助对象函数来完成),但是 FitType 对象的许多域都来自于其他域,因此不使用对象函数而私自更改这些域值可能会导致它无法成为对象函数的合法输入,比如:
using TyCurveFitting
f = fittype("a*cos(b*x-c)")
常规模型:
y(a,b,c,x) = a*cos(b*x-c)
formula(f)
ans = "a*cos(b*x-c)"
argnames(f)
ans = 4-element Vector{String}:
"a"
"b"
"c"
"x"
您通过提供公式构造了 FitType 对象,其参数名是由其公式所推断的,因此希望更改其参数名的话,修改其公式即可。