Igor Pro实用教程:图表绘制、数据分析与程序设计
上QQ阅读APP看书,第一时间看更新

3.2.2 普通自定义拟合函数

系统内置公式在绝大多数情况下并不能满足需求,这时就需要自定义拟合函数。自定义拟合函数是由用户定义的函数,包括两类:在Igor编程环境下按照一定格式定义的函数;利用XOP扩展包定义的函数。

拟合过程中,拟合命令会自动调用用户自定义函数来完成拟合。

由用户定义但被系统调用,这样的函数叫作回调函数。Igor里回调函数的例子非常多,如后面讲到的图形用户界面程序设计,每一个控件一般都有一个回调函数。一些命令,如IntegrateODE、FindRoots等,也都需要指定一个回调函数。

自定义拟合函数需要满足一定的格式,最方便的方法是通过数据拟合对话框来创建。下面通过一个例子来介绍如何创建自定义拟合函数。执行菜单命令【Analysis】|【Curve Fitting】打开数据拟合对话框。如果【Curve Fitting】命令是灰色的,可在命令行窗口输入下面的命令:

        Make w

创建一个名为w的wave,不进行任何操作,此时Igor检测到当前目录下存在能被拟合的wave,就会将【Curve Fitting】命令置于可选状态,表示可以进行数据拟合操作。

在打开的数据拟合窗口(见图3-30)中,单击【Function and Data】选项卡中的【New Fit Function】按钮,弹出如图3-31所示的窗口。

图3-30 创建新的自定义拟合函数

图3-31 自定义拟合函数设计对话框

在【Fit Function Name】文本框中输入自定义拟合函数的名字;【Fit Coefficients】文本框中输入拟合参数名字,可以是任意字母或者是合法的字母组合;【Independent Variables】文本框中输入自变量名字,一般可以输入x、y等,数量没有限制;在【Fit Expression】文本框中输入函数表达式,如图3-32所示。

图3-32 创建自定义拟合函数

这里创建了一个名为fsqure的函数,拟合参数为a、b、c,自变量为x,表达式为

f(x)=a∗x∗x+b∗x+c

其中,a、b、c代表对应拟合参数wave中的第1个、第2个和第3个数据,如拟合参数wave取默认值W_coef,则W_coef[0]=a, W_coef[1]=b, W_coef[2]=c。注意,要使用Igor支持的标准运算符连接每一个量,如a∗x不能写成ax,否则会报错。

单击【Test Compile】按钮可以编译并检测输入的函数是否正确,单击【Save Fit Function Now】按钮保存自定义函数。保存以后就可以使用fsqure对数据进行拟合了,此时【Function】下拉列表框中会自动列出fsqure以供选择。

自定义拟合函数可以修改。在【Function and Data】选项卡中【Function】下拉列表框选择自定义函数(在这里为fsqure),然后单击【Edit Fit Function】按钮就可以修改,修改窗口和创建窗口操作完全一样。

下面来举一个利用fsqure拟合数据的例子。首先创建一个用来拟合的实验数据,如图3-33所示。

图3-33 自定义拟合函数测试数据

        Make/O/N=200 trialdata
         SetScale/P x, -2,0.02, trialdata
         SetRandomSeed 0.5
        trialdata=x∗x-2∗x-1+gnoise(0.2)
        Display trialdata
        ModifyGraph mode=3, marker=8, rgb=(0,0,65280)

打开数据拟合窗口,在【Function and Data】选项卡中,单击【Function】下拉列表框选择fsqure, 【Y Data】中选中trialdata,切换到【Coeficients】选项卡,设定a、b、c的初始值分别为1、-2、-1,其他选项保持不变,单击【Do It】按钮,设置窗口如图3-34所示。

拟合结果如图3-35所示。

图3-35 自定义函数拟合结果

图3-35下方的拟合过程窗口表示一共经过两次迭代就完成了拟合,K0代表a, K1代表b, K2代表c,可以看到拟合结果是符合预期的。单击【OK】按钮完成拟合。观察图3-36所示的历史命令行窗口,可以看到Igor利用对话框的设置自动生成对FuncFit命令的调用代码。后面是拟合的结果。

图3-36 自定义拟合输出信息

当使用自定义函数拟合时,Igor调用FuncFit命令进行拟合。在使用自定义函数拟合时必须指定初始参数,在拟合时如果没有在【Coefficients】选项卡中专门指定【Coefficient Wave】, Igor将自动创建一个名为W_Coef的wave,用户需要指定初始值,不指定初始参数将无法拟合。由于快速拟合不需要指定初始参数值,所以快速拟合无法使用自定义函数。