摘 要
文章简单介绍了Matlab与Mathematica的拟合函数功能,并通过具体例子的数据,分别利用Matlab与Mathematica进行了非线性拟合,对比了它们的应用办法,分析了各自的特点。关键词
数据拟合;Matlab;Mathematica;内建函数
Matlab与Mathematica是两种常用的数学软件。Matlab具备卓越的数值计算能力,还提供了专业水平的符号计算,文字处理,可视化建模仿真和实时控制等功能。Matlab的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似。Mathematica是一套整合数值以及符号运算的数学工具软件,提供了人们容易使用的顶级科学运算环境。Mathematica具有高阶的演算方法,以及丰富的数学函数库和庞大的数学知识库,让Mathematica在符号运算,逻辑推理等方面比Matlab做得更快更好,也可以提供精确的数值运算结果。对于很多问题的解决,这两种强大的计算软件都可以做到,但Mathematica比Matlab的操作界面更加简洁直观,输入形式也与传统数学公式相一致,这对于没有学过计算机语言的学生操作起来相对更为方便,Mathematica强大的函数库和知识库,使它可以用简单的函数解决问题。
这里我们就数据非线性拟合问题来比较两种软件的应用。
以全国大学生数学建模竞赛2004C题饮酒驾车的数据为例,利用房室模型分析后可建立微分方程组,求得结果为:人若在短时间内喝的酒,则血液中的酒精含量y与距离喝酒时间t的函数关系为
y=A(e -αt -e -βt )
其中,A,α,β为待定参数。假设一体重为70公斤的人短时间内喝下两瓶啤酒后,隔一定时间测量他的血液中酒精含量(毫克/百毫升),得到数据为:
根据表中数据确定参数A,α,β的值。
这里,我们分别利用M a t l a b 与Mathematica的内建函数进行数据拟合,比较他们在使用上的异同,便于大家根据自身实际选择适合自己的数学软件。
首先,我们分别用Matlab与Mathematica 做出数据的散点图。
在Matlab命令窗口中,分别定义横坐标t,纵坐标y,以“!”绘出散点图像。
>> t = [ 0.25,0.5,0.75,1,1.5,2,2.5,3,3.5,4,4.5,5,6,7,8,9,10,11,12,13,14,15,16 ];
>> y = [ 30,68,75,82,82,77,68,68,58,51,50,41,38,35,28,25,18,15,12,10,7,7,4 ];
>> plot = ( t,y,/□)
即可绘制出带坐标的散点图。
在Mathematica的NoteBook中输入数据,按照坐标对形式输入数据,用内建函数
Matlab与Mathematica在非线性拟合中的应用比较
郑丽 李亮 陈宇
邯郸职业技术学院基础部,河北 邯郸 056001
ListPlot将数据绘制散点图。
In[1]:= data=
pg=ListPlot[data]
就可以输出的带坐标的散点图。
当数据需手动输入时,Mathematica可以随时将录入错误的数据加以修正,而在Matlab命令窗口中,如果需要修正数据,就必须调出已输入过的数据再加以修改,查找起来不如Mathematica方便。作图时Matlab使用绘图命令plot = ( t,y,/□),而Mathematica用ListPlot[data],两种软件绘图操作都很方便。
其次,利用软件的内建函数对此数据进行非线性拟合,做出比较。
用Matlab的内建函数对参数求解,可调用最小二乘拟合函数lsqcurvefit( ),先定义非线性函数fun.m文件:
function y = fun(a,t)
y =a(3)*exp(-a(1)*t)-*exp(-a(2)*t))
这里a(1)为α,a(2)为β,a(3)代表A,即为y=A(e -αt -e -βt )。
在命令窗口中运行以下命令:
>> t = [ 0.25,0.5,0.75,1,1.5,2,2.5,3,3.5,4,4.5,5,6,7,8,9,10,11,12,13,14,15,16 ];
>> y = [ 30,68,75,82,82,77,68,68,58,51,50,41,38,35,28,25,18,15,12,10,7,7,4 ];
>> a = lsqcurvefit(/fun,[0.2;2;100],t,y)
a =
0.1855 2.0079 114.4329
即α=0.1855,β=2.0079,A=114.4329。根据拟合出的参数值将其代回,作出曲线图与散点图的对比图,可以看出,此曲线拟合程度较好。
函数lsqcurvefit是非线性最小二乘法拟合函数,使用格式为lsqcurvefit(fun,x0,xdata,ydata,…),其中fun是要拟合的函数,x0是各参数的初值,xdata是横坐标,ydata是纵坐标。输入命令时,一般是随意取一组初值,再把算出来的值当作初值继续算,直到两者相差不大为止。如果改变初值,可能会导致给出的参数值产生较大改变。如将本例中初值分别设为0.1,10,79,则求得三个参数值分别为0.1855,2.0079,114.4332,结果变化不大。而当初值设为10,100,10时,求得三个参数值分别为0.1235,100.00,79.4943,改变较大。可见用函数lsqcurvefit做拟合时,初值选取具有不确定性。查看Matlab的帮助文档,nlinfit与lsqcurvefit同属于非线性最小二乘拟合,一
般来说都能得到比较接近的结果。但是由于nlinfit使用的是牛顿方法,在使用时也需要给出参数的初值,当问题对初值比较敏感时,不同的初值会导致差异较大。在本例中当初始值设为0.2,10,50时,用nlinfit也可以拟合,而当初值改为0.2,50,100时,非线性拟合命令nlinfit失效。由此可见,在Matlab 中用内建函数lsqcurvefit与nlinfit做非线性拟合时,对初值的依赖性是比较大的。当然,Matlab用于拟合的函数还有很多,基于软件Matlab的扩展性,在Matlab中还集成了一个拟合工具箱模块可以调用,功能十分强大。
下面我们在Mathematica的Notebook上,调用内建函数FindFit对数据进行非线性拟合,这里可以按照函数y=A(e -αt -e -βt )解析式直接进行定义。
In[3]:= modle =A(e -αt -e -βt );
FindFit[data,modle,{ A,α,β},t]
Out[4]= {A→114.433,α→0.185502,β→2.00794}
In[5]:= modle /.%
Out[5]= 114.433(-e -2.00794t +e -0.185502t )In[6]:= fitg = Plot[ %,{t,0,20}]; Show[ pg,fitg ]
在Out[7]中同样可以得到曲线图fitg与散点图pg的对比图。
在软件Mathematica中,可以按照函数y=A(e -αt -e -βt )的形式进行定义,便于查找与对照。这里对参数求解使用的内建函数格式为FindFit[data,expr,pars,vars],其用途是求出参数pars的数值,给出关于自变量vars 的函数expr对data最佳拟合。表达式expr对参数可以线性或非线性依赖,在线性情况下,FindFit求出全局最优拟合,在非线性情况下,FindFit通常求出局部最优拟合。
通过对比分析,Mathematica与Matlab 都能方便快捷的进行数据拟合运算,计算结果完全一致。在录入数据及表达式方面,Mathematica比Matlab 界面更为直观,并且方便数据输入与命令修改。另外在Mathematica中,也可以直接输入α、β 、γ等希腊字母,函数表达式与常规书写一致,这对无编程基础的学生来说,操作与修改都很直观,便于查找计算结果。在拟合函数方面, Mathematica里有Fit和FindFit两种用于拟合的内建函数。Fit采用函数列表,用一个确定且有效的步骤找到产生最佳二乘拟合的函数线性组合。FindFit既能用于线性拟合,也能用于非线性拟合,通过搜索产生数据最佳拟合的参数值,可以设置选项参数选择所需的搜索精确度、最大迭代次数等,也可以通过设置 选择需要的内部运算方法,如Method QuasiNewton表示用牛顿方法,Method NMinimize表示用搜索全局极小值的办法。一般情况下,不必设置选项参数直接用FindFit拟合,系统会自动寻找最佳拟合方法求出参数值。Matlab里提供了fit,polyfit,nlinfit,lesqcurvefit等几类线性、非线性拟合函数,用函数lesqcurvefit或nlinfit进行非线性拟合时,需要选取初值,计算结果受初值影
DOI:10.3969/j.issn.1001-8972.2012.13.130