# 自定义线性拟合
# 关于自定义线性模型
在曲线拟合器中,您可以使用自定义方程拟合来定义自己的线性或非线性方程。自定义方程拟合使用非线性最小二乘拟合。
您可以在自定义方程中定义自定义线性方程,但非线性拟合效率较低,通常比线性最小二乘拟合慢。如果您需要对自定义方程进行线性最小二乘拟合,请选择线性拟合。线性模型是(可能是非线性)项的线性组合。它们由参数为线性的方程定义。
提示
如果您需要对自定义方程进行线性最小二乘拟合,请选择线性拟合。如果您不知道您的方程是否可以表示为一组线性函数,请选择自定义方程。请参见以交互方式选择自定义方程拟合。
# 以交互方式选择线性拟合自定义拟合
-
在曲线拟合器中,选择一些曲线数据。在曲线拟合器选项卡的数据部分中,单击选择数据。在选择拟合数据对话框中,选择 X 数据和 Y 数据值。
曲线拟合器创建默认多项式拟合。
-
更改模型类型。在曲线拟合器选项卡的拟合类型部分中,单击箭头以打开库。在库中,单击自定义组中的线性拟合。
在拟合选项窗格中,单击线性拟合时会出现一个示例方程。

- 您可以将 x 和 y 更改为任何有效的变量名称。
- 下方框显示示例方程。更改系数和项条目以更改示例项并定义您自己的方程。
有关示例,请参见在曲线拟合器中拟合自定义线性勒让德多项式。
# 在命令行中选择线性拟合
要使用线性拟合算法,请指定模型项的单元格数组或字符串数组作为 fit 或 fittype 函数的输入。不要在项的表达式中包含系数。如果有常数项,请使用 1 作为数组中的相应表达式。
要指定以下形式的线性模型:
coeff1 * term1 + coeff2 * term2 + coeff3 * term3 + ...
如果 term1、term2 等中没有出现系数,则使用单元格数组或字符串数组,其中每个不带系数的项都指定为单独的元素。例如:
LinearModelTerms = ["term1", "term2", "term3", ... ]
-
确定需要输入到 fittype 的线性模型项。例如:
在 a、b 和 c 上呈线性。它有三个项 log(x)、x 和 1(因为 c=c*1)。要指定此模型,请使用以下项:LinearModelTerms = ["log(x)","x","1"]。
-
使用线性模型项的单元格数组或字符串数组作为 fittype 函数的输入:
using TyCurveFitting linearfittype = fittype(["log(x)","x","1"])linearfittype = 线性模型: y(a,b,c,x) = a*log(x) + b*x + c -
加载一些数据并使用 fittype 作为 fit 函数的输入。
include(pkgdir(TyCurveFitting) * "/examples/docs/census.jl") f = fit(linearfittype,cdate,pop)f = 常规模型: y(a,b,c,x) = a*log(x) + b*x + c 系数(置信边界为 95%): a = -46627.15771149236 (-49732.00077353874, -43522.31464944597) b = 25.901349093033918 (24.257397100208163, 27.545301085859673) c = 302878.9889673144 (282563.32013030146, 323194.6578043274)或者,您可以指定线性模型项的单元格数组或字符串数组作为拟合函数的输入:
f = fit(["log(x)","x","1"],cdate,pop) -
绘制拟合值和数据。
plotfit(f,cdate,pop)
有关示例,请参见在命令行中拟合自定义线性勒让德多项式。
# 拟合自定义线性勒让德多项式
在曲线拟合器中拟合自定义线性勒让德多项式
此示例显示如何使用多个自定义线性方程拟合数据。数据是根据核反应
考虑一个实验,其中 124 MeV 电子从
通过将固态探测器放置在 Θα 值从
有时用勒让德多项式来描述以角度函数表示的变量很有用
其中
对于 alpha 发射数据,您可以通过调用理论模型将系数直接与核动力学关联起来。此外,理论模型为上面显示的无穷和引入了约束。特别是,通过考虑反应的角动量,仅使用偶数项的四次勒让德多项式应该可以有效地描述数据。
您可以使用 Rodrigues 公式生成勒让德多项式:
勒让德多项式四次及以下
| n | Pn(x) |
|---|---|
| 0 | 1 |
| 1 | x |
| 2 | (1/2)(3x^2– 1) |
| 3 | (1/2)(5x^3 – 3x) |
| 4 | (1/8)(35x^4 – 30x^2 + 3) |
此示例显示如何使用仅具有偶数项的四次勒让德多项式来拟合数据:
加载
阿尔法发射数据。 using TyCurveFitting include(pkgdir(TyCurveFitting) * "/examples/docs/carbon12alpha.jl")工作区现在包含两个新变量:
-
角度是角度向量(以弧度为单位),范围从
到 ,以 为增量; - 计数是原始阿尔法粒子计数向量,对应于角度中的发射角度。
-
打开曲线拟合器
using TyCurveFitter curveFitter() - 在曲线拟合器中的曲线拟合器选项卡上,在数据部分中,单击选择数据。在选择拟合数据对话框中,分别选择 angle 和 counts 作为 X 数据和 Y 数据值,以创建对两个变量的默认多项式拟合。
-
将拟合类型更改为默认自定义线性拟合。在曲线拟合器选项卡上,在拟合类型部分中,单击箭头以打开图库。在图库中,单击自定义组中的线性拟合。
使用线性拟合而不是自定义方程拟合类型,因为勒让德多项式仅依赖于预测变量和常数。您将为模型指定的方程是
(即此过程开始时给出的方程)。由于角度以弧度表示,因此勒让德项的参数由 给出。 -
在拟合选项窗格中,更改方程项。
- 将系数名称更改为 a2、a4 和 a0。
-
将 a2 的值更改为以下内容:
(1/2)*(3*cos(x)^2-1)当您编辑时,曲线拟合器会更新拟合度。
-
将 a4 的值更改为以下内容:
(1/8)*(35*cos(x)^4-30*cos(x)^2+3)
拟合结果显示在曲线拟合器中。
-
在拟合表窗格中,双击拟合名称值并将其更改为 Leg4Even。

-
显示残差。在曲线拟合器选项卡的可视化部分中,单击残差图 。
拟合结果似乎很好地遵循了数据的趋势,而残差似乎是随机分布的,没有表现出任何系统性行为。
检查结果窗格中的数值拟合结果。查看括号中每个系数值及其置信区间。95% 置信区间表明与
和 相关的系数相当准确,但 系数具有相对较大的不确定性。 
-
为了证实理论论证,即 α 发射数据最好用仅具有偶数项的四次勒让德多项式来描述,接下来使用偶数项和奇数项来拟合数据:
首先,复制要修改的勒让德多项式拟合。在曲线拟合器选项卡的文件部分中,单击复制。复制的拟合将显示在拟合窗格的新选项卡中。
- 在拟合表窗格中,将新的拟合重命名为 Leg4EvenOdd。
-
在拟合选项窗格中,更改方程项。
编辑项如下,以拟合
给出的模型: - 单击最后的 + 按钮两次,添加奇数勒让德项。
- 将新系数名称更改为 a1 和 a3。
-
将 a1 的值更改为以下内容:
cos(x) -
将 a3 的值更改为以下内容:
(1/2)*(5*cos(x)^3-3*cos(x))
-
观察曲线拟合应用程序中绘制的新拟合,并检查结果窗格中的数值结果。
请注意,奇数勒让德系数(a1 和 a3)可能是删除的候选项,以简化拟合,因为它们的值很小,并且它们的置信区间包含零。这些结果表明奇数勒让德项对拟合的贡献不大,偶数勒让德项与之前的拟合基本没有变化。这证实了 Leg4Even 拟合中的初始模型选择是最佳的。
在命令行中拟合自定义线性勒让德多项式
在命令行中拟合您在曲线拟合器中创建的相同模型。
-
要使用线性拟合算法,请指定模型项的单元格数组或字符串数组作为 fittype 函数的输入。使用您在曲线拟合器中输入的相同项进行 Leg4Even 拟合,并且不指定任何系数。
linearft = fittype(["(1/2)*(3*cos(x)^2-1)", "(1/8)*(35*cos(x)^4-30*cos(x)^2+3)","1"])linearft = 线性模型: y(a,b,c,x) = a*(1/2)*(3*cos(x)^2-1) + b*(1/8)*(35*cos(x)^4-30*cos(x)^2+3) + c -
在工作区中加载 angle 和 counts 变量。
include(pkgdir(TyCurveFitting) * "/examples/docs/carbon12alpha.jl") -
使用 fittype 作为 fit 函数的输入,并在工作区中指定 angle 和 counts。
f = fit(linearft,angle,counts)f = 线性模型: y(a,b,c,x) = a*(1/2)*(3*cos(x)^2-1) + b*(1/8)*(35*cos(x)^4-30*cos(x)^2+3) + c 系数(置信边界为 95%): a = 23.862563109518256 (4.436495720227633, 43.28863049880888) b = 201.88816967750975 (180.17344445069108, 223.60289490432842) c = 102.8744963216409 (93.21325865031496, 112.53573399296685) -
绘制拟合值和数据。
plotfit(f,angle,counts)
有关线性模型术语的更多详细信息,请参见 fittype 函数。