摘 要:文章简单介绍了Matlab与Mathematica的拟合函数功能,并通过具体例子的数据,分别利用Matlab与Mathematica进行了非线性拟合,对比了它们的应用办法,分析了各自的特点。
关键词:数据拟合,Matlab,Mathematica,内建函数
Matlab与Mathematica是两种常用的数学软件。Matlab具备卓越的数值计算能力,还提供了专业水平的符号计算,文字处理,可视化建模仿真和实时控制等功能。Matlab的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似。Mathematica是一套整合数值以及符号运算的数学工具软件,提供了人们容易使用的顶级科学运算环境。Mathematica具有高阶的演算方法,以及丰富的数学函数库和庞大的数学知识库,让Mathematica在符号运算,逻辑推理等方面比Matlab做得更快更好,也可以提供精确的数值运算结果。对于很多问题的解决,这两种强大的计算软件都可以做到,但Mathematica比Matlab的操作界面更加简洁直观,输入形式也与传统数学公式相一致,这对于没有学过计算机语言的学生操作起来相对更为方便,Mathematica强大的函数库和知识库,使它可以用简单的函数解决问题。
这里我们就数据非线性拟合问题来比较两种软件的应用。
以全国大学生数学建模竞赛2004C题饮酒驾车的数据为例,利用房室模型分析后可建立微分方程组,求得结果为:人若在短时间内喝的酒,则血液中的酒精含量与距离喝酒时间的函数关系为
其中,,,为待定参数。假设一体重为70公斤的人短时间内喝下两瓶啤酒后,隔一定时间测量他的血液中酒精含量(毫克/百毫升),得到数据为
时间(小时) 0.25 0.5 0.75 1 1.5 2 2.5 3 3.5 4 4.5 5 酒精含量 30 68 75 82 82 77 68 68 58 51 50 41 时间(小时) 6 7 8 9 10 11 12 13 14 15 16 酒精含量 38 35 28 25 18 15 12 10 7 7 4
根据表中数据确定参数,,的值。
这里,我们分别利用Matlab与Mathematica的内建函数进行数据拟合,比较他们在使用上的异同,便于大家根据自身实际选择适合自己的数学软件。
首先,我们分别用Matlab与Mathematica做出数据的散点图。
在Matlab命令窗口中,分别定义横坐标,纵坐标,以“·”绘出散点图像。
>> 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中输入数据,按照坐标对形式输入数据,用内建函数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 =;
这里为,为,代表,即为。
在命令窗口中运行以下命令:
>> 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(,[0.2;2;100],t,y)
a =
0.1855
2.0079
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中还集成了一个拟合工具箱模块可以调用,功能十分强大。