2026a

# fittype


曲线与曲面拟合的拟合类型

函数库: TyCurveFitting

# 语法

aFittype = fittype(libraryModelName)

aFittype = fittype(expression)
aFittype = fittype(expression; Key=Value)

aFittype = fittype(linearModelTerms)
aFittype = fittype(linearModelTerms;Key=Value)

aFittype = fittype(functionHandle)
aFittype = fittype(functionHandle; Key=Value)

# 说明

aFittype = fittype(libraryModelName) 为 libraryModelName 指定的内置模型设置 FitType 对象 aFittype。示例


aFittype = fittype(expression) 为 Syslab 表达式 expression 所表示的模型设置 FitType 对象 aFittype。


aFittype = fittype(expression; Key=Value) 构造 FitType 对象时使用一个或更多的 Name-Value 对参数指定的额外选项。示例


aFittype = fittype(linearModelTerms) 为 linearModelTerms 指定的自定义线性模型设置 FitType 对象 aFittype。示例


aFittype = fittype(linearModelTerms;Key=Value) 构造 FitType 对象时使用一个或更多的 Name-Value 对参数指定的额外选项。示例


aFittype = fittype(functionHandle) 使用由 functionHandle 指定的函数句柄模型设置 FitType 对象 aFittype。示例


aFittype = fittype(functionHandle; Key=Value) 构造 FitType 对象时使用一个或更多的 Name-Value 对参数指定的额外选项。示例

# 示例

为内置模型构造FitType

指定内置模型名称以构造 FitType 对象。

为三次多项式内置模型构造 FitType 对象。

using TyCurveFitting
f = fittype("poly3")
线性模型 poly3:
  y(p1,p2,p3,p4,x) = p1*x^3 + p2*x^2 + p3*x + p4

为 rational33(分子分母均为三次多项式的有理模型)构造 FitType 对象。

f = fittype("rational33")
常规模型 rational33:
  y(p1,p2,p3,p4,q1,q2,q3,x) = (p1*x^3 + p2*x^2 + p3*x + p4) / (x^3 + q1*x^2 + q2*x + q3)

可使用的内置模型名称,请参见线性模型项

构造自定义非线性模型并指定问题参数与自变量

为自定义非线性模型构造 FitType并指定其问题参数与自变量。

为自定义非线性模型构造 FitType并指定其问题参数为 n ,自变量为 u。

using TyCurveFitting
g = fittype("a*u+b*exp(n*u)",problem="n",independent="u")
常规模型:
  y(a,b,n,u) = a*u+b*exp(n*u)      

为自定义非线性模型构造 FitType 并指定其自变量为 time,因变量为 height。

g = fittype("a*time^2+b*time+c",independent="time",dependent="height")
常规模型:
  height(a,b,c,time) = a*time^2+b*time+c

为对数拟合构造 FitType 结构体,并进行拟合,使用 FitType 创建拟合然后绘制拟合。

x = 1:100
y = @. 5+7*log(x)
myfittype = fittype("a+b*log(x)",dependent="y",independent="x",coefficients=["a","b"])
常规模型:
  y(a,b,x) = a+b*log(x)
myfit = fit(myfittype,x,y)
常规模型:
  y(a,b,x) = a+b*log(x)

系数(置信边界为 95%):
  a = 4.9999999999999964 (4.999999999999995, 4.999999999999998)
  b = 7.000000000000001 (7.0, 7.000000000000002)
plotfit(myfit,x,y)
创建自定义线性模型

为了使用自定义线性算法,使用字符串向量指定函数。

假设您想为 fittype 输入线性模型: a*x+b*sin(x)+c。这个模型对于 a,b,c 都是线性的。它有三项,分别为 x,sin(x) 和 1(因为 c=c*1)。为了指定这个模型,您可以指定如下的字符串向量:LinearModelTerms=["x","sin(x)","1"]。

以字符串向量模型项作为 fittype 的输入。

using TyCurveFitting
ft = fittype(["x","sin(x)","1"])
线性模型:
  y(a,b,c,x) = a*x + b*sin(x) + c

为 a*cos(x)+b 创建线性模型拟合。

ft2 = fittype(["cos(x)","1"])
线性模型:
  y(a,b,x) = a*cos(x) + b

再次创建拟合并指定参数名。

ft3 = fittype(["cos(x)","1"],coefficients=["a1","a2"])
线性模型:
  y(a1,a2,x) = a1*cos(x) + a2
使用函数句柄定义的曲线拟合
using TyCurveFitting
function piecewiseLine(x, t)
    if x < t[5]
        fo = t[1] + t[2] * x
    else
        fo = t[3] + t[4] * x
    end
    return fo
end

定义一些数据并为这个函数 piecewiseLine 创建拟合类 ft,使用拟合类 ft 创建拟合,然后绘制结果。

x = vec([0.81 0.91 0.13 0.91 0.63 0.098 0.28 0.55 0.96 0.96 0.16 0.97 0.96])
y = vec([0.17 0.12 0.16 0.0035 0.37 0.082 0.34 0.56 0.15 -0.046 0.17 -0.091 -0.071])
ft = fittype(piecewiseLine)
f = fit(ft, x, y,startpt= [1, 0, 1, 0, 0.5]);
plotfit(f, x, y)
使用内置函数句柄创建拟合

把内置函数与工作区数据传入 fittype 与 fit 函数。

创建以及绘制一条 S-形曲线。接下来的步骤中,将会对这条曲线进行移动与拉伸来拟合数据。

using TyPlot
using TyCurveFitting
using TyMath
xs = 0:0.1:1
ys = [0; 0; 0.04; 0.1; 0.2; 0.5; 0.8; 0.9; 0.96; 1; 1]
xi = LinRange(0, 1, 241)
plot(xi, interp1(xs,ys,xi,"pchip"), linewidth=2)
hold("on")
plot(xs, ys, "o"; markerfacecolor="r")
hold("off")
title("S-curve")

使用函数句柄创建拟合类,该函数使用从工作区来的曲线断点(xs)与曲线在断点处的高(ys)数据。系数为 b(基)与 h(高)。

fcn(x,t) = interp1(xs,t[1].+t[2].*ys,x,"pchip")
ft = fittype(fcn)

指定示例参数基 b=1.1 与高 h=-0.8并绘制该拟合类。

plot(xi,ft(1.1,-0.8,xi),linewidth=2)
title("Fittype with b=1.1 and h=-0.8")

读取一些数据,使用使用工作区数据的拟合类 ft 进行拟合。

xdata = [0.012,0.054,0.13,0.16,0.31,0.34,0.47,0.53,0.53,0.57,0.78,0.79,0.93]
ydata = [0.78,0.81,1,1.1,0.96,0.88,0.56,0.5,0.5,0.5,0.63,0.62,0.39]
f = fit(ft,xdata,ydata,startpt=[0,1])
plotfit(f,xdata,ydata)
title("Fitted S-curve")
使用带问题参数的自定义函数拟合

这个示例展示了问题参数的使用。

读取数据并为带有问题参数的自定义函数模型创建 FitType。

using TyPlot
using TyCurveFitting
xdata = [0.098; 0.13; 0.16; 0.28; 0.55; 0.63; 0.81; 0.91; 0.91; 0.96; 0.96; 0.96; 0.97];
ydata = [0.52; 0.53; 0.53; 0.48; 0.33; 0.36; 0.39; 0.28; 0.28; 0.21; 0.21; 0.21; 0.2];
g = fittype("a*x^2+b*x+c", problem="c")

读取其系数名。

coeffnames(g)
ans = 2-element Vector{String}:

 "a"
 "b"

注意到 c 不是一个系数。读取其参数名。

argnames(g)
ans = 4-element Vector{String}:

 "a"
 "b"
 "c"
 "x"

注意到 c 是一个参数。调用 fit 并指定 c 的值。

f1 = fit(g, xdata, ydata, problem=0, startpt=[1.0, 2])

这里指定初值是为了确保可重复性。再次进行拟合,并为 c 赋予一个不同的值。

f2 = fit(g, xdata, ydata, problem=1, startpt=[1.0, 2])

绘制结果,注意到指定 c 为常数无法形成一个好的拟合。

plotfit(f1, xdata, ydata)
hold("on")
plotfit(f2, "b")
hold("off")

# 输入参数

libraryModelName - 拟合内置模型
字符串 | 向量

内置模型,指定为字符串或向量。这个表格展示了一些常见例子。

内置模型名称 描述
"poly1" 线性多项式曲线
"poly11" 线性多项式曲面
"poly2" 二次多项式曲线
"linearinterp" 分段线性插值
"cubicinterp" 分段三次插值
"smoothingspline" 平滑样条(曲线)
"lowess" 局部线性回归(曲面)

在指定需要阶数输入的模型时以及大于 10 次的多项式模型时,可以以两元素向量,第一个元素为模型名称,第二个元素为指定阶数输入。例如:12 次多项式,可以输入["poly",12],3 阶高斯,可以输入["gauss",3]。

可选的内置模型名称,请参见模型名称与方程

示例:"poly2", ["poly",13]

数据类型: String

expression - 表达式
字符串

拟合模型,指定为字符串。

数据类型: String

linearModelTerms - 拟合模型
字符串向量

拟合模型,指定为字符串向量。使用向量中的每一项作为表达式,不要在表达式中包含系数。请参见线性模型项

数据类型: String

functionHandle - 函数句柄
函数句柄

拟合模型,指定为函数句柄。请参见函数句柄的要求

# 关键字参数

实现 Key1=Value1,...,KeyN=ValueN 功能的关键字参数,其中 Key 与 Value 相互对应。关键字参数必须在其余参数以及一个英文分号以后,但是内部出现顺序不重要。

示例:coefficients=["a1","a2"]

coefficients - 系数名
字符串 | 字符串向量

系数名,指定为字符串或字符串向量。

dependent - 因变量(响应变量)名称
"y"(默认)| 字符串

因变量(响应变量)名称,指定为字符。如果您不指定因变量名称,则函数假设 y 为因变量名称。

independent - 自变量(预测变量)名称
"x"(默认)| 字符串 | 字符串向量

自变量(预测变量)名称,指定为字符串或者字符串向量。如果您不指定自变量名称,则函数假设 x 为自变量名称。

problem - 问题参数(固定参数)名称
字符串 | 字符串向量

问题参数(固定参数)名称,指定为字符串或字符串向量。

# 输出参数

aFittype - 拟合模型
FitType 对象

拟合模型,以 FitType 项式返回。一个 FitType 包含了描述模型的所有信息。为了创建拟合,您需要数据,FitType(和 fitoptions),排除规则。您可以把 Fittype 作为 fit 函数的输入。

# 更多信息

因变量与自变量名

如何知道什么变量是自变量或因变量呢?

为了了解自变量、因变量与系数,考虑以下方程。

  • 是因变量;

  • 是自变量;

  • 是系数。

自变量就是您能控制的变量,因变量是您能测量的变量,即,自变量决定着因变量。系数为拟合算法估计的参数。

例如,如果您有 census 数据,则年份为自变量,因为它不取决于其他因素。人口为因变量,因为它的值与 census 的年份有关。如果一个参数比如增长率是模型的一部分,也就是希望模型估计这个值,那么这个参数就是一个系数。

fittype 函数使用输入的拟合类型的变量名来决定这些参数。fittype 假设 x 为自变量名称,y 为因变量名称,其他所有变量都是模型的系数。

函数句柄的要求

如果拟合类型表达式输入为函数句柄,则输入必须满足一定要求,比如输入顺序。特定的输入顺序可以使得 fittype 函数决定什么输入是要估计的参数、问题变量和自变量。

函数句柄的输入参数顺序必须为:

f(x,coefficients,problemparameters)

您至少需要一个系数。问题参数为可选参数。第一个输入 x 表示自变量名称,曲线拟合要求输入 x 为向量,曲面拟合要求输入 x 为 nx2 矩阵。

其次,传入的函数仅需处理标量情况(对于 x 为矩阵情形,仅需处理 2 元向量情况)。

函数句柄使得将其他数据传入 fittype 与 fit 函数变得容易了。

线性模型项

如何定义线性模型项?

为了使用线性拟合算法,指定 linearModelTerms 为字符串向量。例如:

afittype = fittype([expr1,...,exprn])

把模型包含的项指定在字符串向量 expr1,...,exprn 中。不要在这些项里包含系数。如果存在常数项,可以在字符串表达式的相应位置置 "1"。

为了指定具有以下形式的线性模型:

coeff1*term1+coeff2*term2+coeff3*term3+...

其中所有的 term1,term2,... 都没有出现系数,可以将这些不含系数的项的表达式指定为字符串向量:

linearModelTerms = ["term1","term2","term3",...]

例如,模型

a*x+b*sin(x)+c

在 a,b,c 上都是线性的。它总共有三项 x,sin(x) 和 1(因为 c=c*1),因此上述表达式应为:

linearModelTerms = ["x","sin(x)","1"]

# 算法

如果 fittype 表达式输入为字符串,则工具箱使用非线性拟合算法拟合模型。

如果 fittype 表达式输入为字符串向量,则工具箱使用线性拟合算法拟合模型。

# 另请参阅

fit | fitoptions