在做曲线拟合时,常用的是最小二乘法(method of least squares)。我们知道线性拟合很容易做,非线性模型的拟合就难多了。为了降低拟合难度,很多时候我们可以把模型转换为非线性的形式。这里讨论下一元非线性函数的线性化方法,并举一个用matlab来做拟合的例子。 用幂函数 y=ax^2做例子。这个函数怎么非线性化呢?在微积分中有种常用的技巧,对于幂函数和指数函数常常用取对数的方法是使之简化,因为对数运算可以把幂指运算转化为加法和乘法运算,这就转换成了我们更熟悉、更擅长的问题。 对y=ax^b等号两边取自然对数,得 lny = lna + blnx) 令Y=lny,X=lnx,得Y = lna + bX,这是一个线性函数,这样我们就完成了线性化处理。此函数可以用非线性拟合函数polyfit拟合,调用格式为 p= polyfit(x,y,n),其中:
- x,y为需要拟合的数据,用数组方式输入;
- n表示多项式的最高阶数,特别地,当n=1时可以省略;
- 输出参数p为拟合多项式的系数。
|
Nu |
11.6 |
18.1 |
23.5 |
26.9 |
32.2 |
36.8 |
39.0 |
43.2 |
|
Re |
3520 |
6050 |
8400 |
9970 |
12520 |
14810 |
15900 |
18080 |
用经验模型Nu = a Re^b对表格中的的数据进行拟合,确定模型中的参数a,b。
令y=Nu,x=lnRe,则
y=lna + bx
以下为程序段:
>> Re=[3520 6050 8400 9970 12520 14810 15900 18080]‘;
>> Nu=[11.6 18.1 23.5 26.9 32.2 36.8 39.0 43.2]‘;
>> y=log(Nu)
y =
2.4510
2.8959
3.1570
3.2921
3.4720
3.6055
3.6636
3.7658
>> x=log(Re)
x =
8.1662
8.7078
9.0360
9.2073
9.4351
9.6031
9.6741
9.8026
>> p=polyfit(x,y,1)
p =
0.8011 -4.0852
即b=0.8011,lna=-4.0852
>> a=exp(-4.0852)
a =
0.0168
于是得关系式为:
Nu=0.0168Re^0.8011