Matlab数据拟合

文章目录

  • 引入
  • 1 多项式拟合
  • 2 指定函数拟合
  • 3 曲线拟合工具箱
  • 4 拟合示例
    • 4.1 线性拟合之人口预测模型
    • 4.2 非线性拟合之薄膜渗透率的测定

引入

  使用的数据清单如下:
  1)拟合数据:https://github.com/InkiInki/data/blob/master/test/linear_regression.txt

1 多项式拟合

  代码示例:

function [] = test()
    
    %%载入数据
    data = importdata('linear_regression.txt');
    
    %%
    x = data( : , 1);
    y = data( : , 2);
    f = polyfit(x, y, 10); %多项式拟合, 10为设置的多项式系数
    xi = min(x) : 0.02 : max(x);
    yi = polyval(f, xi); %计算多项式的值
    plot(xi, yi, x, y, 'r*');
end

  拟合结果:
Matlab数据拟合_第1张图片
  图形窗口的拟合可以参照。

2 指定函数拟合

  假设已经知道待拟合数据的函数形式,例如 y = a x + s i n ( x ) ∗ e b x + c y = ax + sin(x) * e^{bx} + c y=ax+sin(x)ebx+c,则示例代码如下:

function [] = test()
    
    %%载入数据
    data = importdata('linear_regression.txt');
    x = data( : , 1);
    y = data( : , 2);
    
    %%
    %已知函数,示例顺序为:函数, 'independent', 自变量名,'coefficients'{变量名};
    f = fittype('a * x + sin(x) * exp(b * x) + c', 'independent', 'x', 'coefficients', {'a', 'b', 'c'}); 
    cfun = fit(x, y, f, 'StartPoint', [0, 0, 0]) % 展示拟合函数;
    xi = min(x) : 0.02 : max(x);
    yi = cfun(xi); %计算多项式的值
    plot(xi, yi, 'b-', x, y, 'r*');
end

  拟合结果:
Matlab数据拟合_第2张图片

     General model:
     cfun(x) = a * x + sin(x) * exp(b * x) + c
     Coefficients (with 95% confidence bounds):
       a =       0.516  (0.2902, 0.7418)
       b =      0.3105  (0.1212, 0.4998)
       c =       3.026  (2.977, 3.074)

3 曲线拟合工具箱

  1)导入需要使用到的数据,例如:

>> data = importdata('linear_regression.txt');
>> x = data( : , 1);
>> y = data( : , 2);

  2)命令窗口输入cftool,出现以下界面:
Matlab数据拟合_第3张图片
  3)进行相应选取即可:
Matlab数据拟合_第4张图片

4 拟合示例

4.1 线性拟合之人口预测模型

  1)下表给出某地区1971-2000年的人口数据:
Matlab数据拟合_第5张图片
  2)在matlab中的表示如下:

	t = 1 : 30;
    y = [33815, 33981, 34004, 34165, 34212, 34327, 34344, 34458, 34498, 34476, 34483, 34488, 34513, 34497, 34511, 34520, 34507, 34509, 34521, 34513, 34515, 34517, 34519, 34519, 34521, 34521, 34523, 34525, 34525, 34527];

  3)绘制如下:

Matlab数据拟合_第6张图片
  4)使用logistic模型,其基本形式如下:

y = 1 a + b e − t y = \frac{1}{a + b e^{-t}} y=a+bet1

  5)令 y ′ = 1 y y' = \frac{1}{y} y=y1 x ′ = e − t x' = e^{-t} x=et,将其转化为直线模型:

y ′ = a + b x ′ y' = a + bx' y=a+bx

  6)代码如下:

function [] = test()
    
    %% 载入数据
    T = 1 : 30;
    Y = [33815, 33981, 34004, 34165, 34212, 34327, 34344, 34458, 34498, 34476, 34483, 34488, 34513, 34497, 34511, 34520, 34507, 34509, 34521, 34513, 34515, 34517, 34519, 34519, 34521, 34521, 34523, 34525, 34525, 34527];
    len = size(T, 2);
    
    %% 线性化处理
    for t = 1 : len
        x(t) = exp(-t);
        y(t) = 1 / Y(t);
    end
    
    %% 计算回归系数B
    c = ones(len, 1);
    X = [c, x'];
    B = inv(X' * X) * X' * y'
    
    %% 
    temp = sum(y) / len;
    for i = 1 : len
        z(i) = B(1, 1) + B(2, 1) * x(i); % 计算回归拟合值
        s(i) = y(i) - temp; % 计算离差
        w(i) = z(i) - y(i); % 计算误差
    end
    
    %%
    S = s * s'; % 计算离差平方和S
    Q = w * w'; % 计算误差平方和Q
    U = S - Q; % 计算回归平方和U
    F = (len - 2) * U / Q % 计算并输出F检验值
    for i = 1 : len
       Y(i) = 1 / (B(1, 1) + B(2, 1) * exp(-i));
    end
    
    plot(T, Y);
end

  7)输入如下:

Matlab数据拟合_第7张图片

B =

   1.0e-04 *

    0.2902
    0.0182

F =

   47.8774

4.2 非线性拟合之薄膜渗透率的测定

  1)以下给出浓度表 (题目略):

t j / s t_j / s tj/s 100 200 300 400 500 600 700 800 900 1000
C j / ( m g ⋅ c m − 3 ) C_j / (mg \cdot cm^{-3}) Cj/(mgcm3) 4.54 4.99 5.35 5.65 5.90 6.10 6.26 6.39 6.50 6.59

  2)以下给出极小化函数:

E ( K , a A , a B ) = ∑ j = 1 10 [ a + b e − 0.02 K t j − C j ] 2 E (K, a_{A}, a_B) = \sum_{j = 1}^{10} [a + b e^{-0.02 K t_j} - C_j]^2 E(K,aA,aB)=j=110[a+be0.02KtjCj]2

  3)代码示例如下:

function [] = test()
    f = @(x, t)x(1) + x(2) * exp(-0.02 * x(3) * t);
    t = linspace(100, 1000, 10);
    c = 1e-5 * [454, 499, 535, 565, 590, 610, 626, 639, 650, 659];
    x0 = [0, 0, 0]; % 初始值
    x = lsqcurvefit(f, x0, t, c) % lsqcurvefit为非线性拟合函数
    f = f(x, t)
    plot(t, c, 'r*', t, f, '-')
end

  4)输出如下:
Matlab数据拟合_第8张图片

x =

    0.0017    0.0029   -0.0308

f =

    0.0047    0.0049    0.0051    0.0053    0.0056    0.0058    0.0061    0.0064    0.0067    0.0070

参考文献:
[1]:MATLAB在数学建模中的应用,卓金武等。

你可能感兴趣的:(#,Matlab)