2026a

# 自定义线性拟合

# 关于自定义线性模型


在曲线拟合器中,您可以使用自定义方程拟合来定义自己的线性或非线性方程。自定义方程拟合使用非线性最小二乘拟合。

您可以在自定义方程中定义自定义线性方程,但非线性拟合效率较低,通常比线性最小二乘拟合慢。如果您需要对自定义方程进行线性最小二乘拟合,请选择线性拟合。线性模型是(可能是非线性)项的线性组合。它们由参数为线性的方程定义。

提示

如果您需要对自定义方程进行线性最小二乘拟合,请选择线性拟合。如果您不知道您的方程是否可以表示为一组线性函数,请选择自定义方程。请参见以交互方式选择自定义方程拟合

# 以交互方式选择线性拟合自定义拟合

  1. 在曲线拟合器中,选择一些曲线数据。在曲线拟合器选项卡的数据部分中,单击选择数据。在选择拟合数据对话框中,选择 X 数据Y 数据值。

    曲线拟合器创建默认多项式拟合。

  2. 更改模型类型。在曲线拟合器选项卡的拟合类型部分中,单击箭头以打开库。在库中,单击自定义组中的线性拟合

    拟合选项窗格中,单击线性拟合时会出现一个示例方程。

  3. 您可以将 x 和 y 更改为任何有效的变量名称。
  4. 下方框显示示例方程。更改系数条目以更改示例项并定义您自己的方程。

有关示例,请参见在曲线拟合器中拟合自定义线性勒让德多项式

# 在命令行中选择线性拟合

要使用线性拟合算法,请指定模型项的单元格数组或字符串数​​组作为 fit 或 fittype 函数的输入。不要在项的表达式中包含系数。如果有常数项,请使用 1 作为数组中的相应表达式。

要指定以下形式的线性模型:

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

如果 term1、term2 等中没有出现系数,则使用单元格数组或字符串数​​组,其中每个不带系数的项都指定为单独的元素。例如:

LinearModelTerms = ["term1", "term2", "term3", ... ]
  1. 确定需要输入到 fittype 的线性模型项。例如:

    在 a、b 和 c 上呈线性。它有三个项 log(x)、x 和 1(因为 c=c*1)。要指定此模型,请使用以下项:LinearModelTerms = ["log(x)","x","1"]。

  2. 使用线性模型项的单元格数组或字符串数​​组作为 fittype 函数的输入:
    using TyCurveFitting
    linearfittype = fittype(["log(x)","x","1"])
    
    linearfittype = 
      线性模型:
        y(a,b,c,x) = a*log(x) + b*x + c
    
  3. 加载一些数据并使用 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)
    
  4. 绘制拟合值和数据。
    plotfit(f,cdate,pop)
    

有关示例,请参见在命令行中拟合自定义线性勒让德多项式

# 拟合自定义线性勒让德多项式

在曲线拟合器中拟合自定义线性勒让德多项式

此示例显示如何使用多个自定义线性方程拟合数据。数据是根据核反应 生成的。方程使用勒让德多项式项的总和。

考虑一个实验,其中 124 MeV 电子从 原子核散射。在随后的反应中,发射出阿尔法粒子并产生残余原子核 。通过分析发射的阿尔法粒子数量与角度的关系,您可以推断出有关 核动力学的某些信息。反应运动学如下所示。

通过将固态探测器放置在 Θα 值从 为增量的位置来收集数据。

有时用勒让德多项式来描述以角度函数表示的变量很有用

其中 是 n 次勒让德多项式,x 是 是拟合系数。有关生成勒让德多项式的信息,请参见 legendre 函数。

对于 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)

此示例显示如何使用仅具有偶数项的四次勒让德多项式来拟合数据:

  1. 加载 阿尔法发射数据。

    using TyCurveFitting
    include(pkgdir(TyCurveFitting) * "/examples/docs/carbon12alpha.jl")
    

    工作区现在包含两个新变量:

        角度是角度向量(以弧度为单位),范围从 ,以 为增量;
        计数是原始阿尔法粒子计数向量,对应于角度中的发射角度。

  2. 打开曲线拟合器
    using TyCurveFitter
    curveFitter()
    
  3. 曲线拟合器中的曲线拟合器选项卡上,在数据部分中,单击选择数据。在选择拟合数据对话框中,分别选择 angle 和 counts 作为 X 数据Y 数据值,以创建对两个变量的默认多项式拟合。
  4. 将拟合类型更改为默认自定义线性拟合。在曲线拟合器选项卡上,在拟合类型部分中,单击箭头以打开图库。在图库中,单击自定义组中的线性拟合

    使用线性拟合而不是自定义方程拟合类型,因为勒让德多项式仅依赖于预测变量和常数。您将为模型指定的方程是 (即此过程开始时给出的方程)。由于角度以弧度表示,因此勒让德项的参数由 给出。

  5. 拟合选项窗格中,更改方程项。
    1. 将系数名称更改为 a2、a4 和 a0。
    2. 将 a2 的值更改为以下内容:
      (1/2)*(3*cos(x)^2-1)
      

      当您编辑时,曲线拟合器会更新拟合度。

    3. 将 a4 的值更改为以下内容:
      (1/8)*(35*cos(x)^4-30*cos(x)^2+3)
      

      拟合结果显示在曲线拟合器中。

  6. 在拟合表窗格中,双击拟合名称值并将其更改为 Leg4Even。
  7. 显示残差。在曲线拟合器选项卡的可视化部分中,单击残差图

    拟合结果似乎很好地遵循了数据的趋势,而残差似乎是随机分布的,没有表现出任何系统性行为。

  8. 检查结果窗格中的数值拟合结果。查看括号中每个系数值及其置信区间。95% 置信区间表明与 相关的系数相当准确,但 系数具有相对较大的不确定性。

  9. 为了证实理论论证,即 α 发射数据最好用仅具有偶数项的四次勒让德多项式来描述,接下来使用偶数项和奇数项来拟合数据:

    首先,复制要修改的勒让德多项式拟合。在曲线拟合器选项卡的文件部分中,单击复制。复制的拟合将显示在拟合窗格的新选项卡中。

  10. 在拟合表窗格中,将新的拟合重命名为 Leg4EvenOdd。
  11. 拟合选项窗格中,更改方程项。

    编辑项如下,以拟合 给出的模型:

    1. 单击最后的 + 按钮两次,添加奇数勒让德项。
    2. 将新系数名称更改为 a1 和 a3。
    3. 将 a1 的值更改为以下内容:
      cos(x)
      
    4. 将 a3 的值更改为以下内容:
      (1/2)*(5*cos(x)^3-3*cos(x))
      
  12. 观察曲线拟合应用程序中绘制的新拟合,并检查结果窗格中的数值结果。

    请注意,奇数勒让德系数(a1 和 a3)可能是删除的候选项,以简化拟合,因为它们的值很小,并且它们的置信区间包含零。这些结果表明奇数勒让德项对拟合的贡献不大,偶数勒让德项与之前的拟合基本没有变化。这证实了 Leg4Even 拟合中的初始模型选择是最佳的。

在命令行中拟合自定义线性勒让德多项式

在命令行中拟合您在曲线拟合器中创建的相同模型。

  1. 要使用线性拟合算法,请指定模型项的单元格数组或字符串数​​组作为 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
    
  2. 在工作区中加载 angle 和 counts 变量。
    include(pkgdir(TyCurveFitting) * "/examples/docs/carbon12alpha.jl")
    
  3. 使用 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)
    
  4. 绘制拟合值和数据。
    plotfit(f,angle,counts)
    

有关线性模型术语的更多详细信息,请参见 fittype 函数。