Scilab上的非线性回归

时间:2018-09-22 08:14:46

标签: regression scilab non-linear-regression

我是scilab的新手(我正在使用5.5.2),我需要进行非线性回归。 我有一个点的数据集,其行为类似于正弦波,所以我想找到该正弦波的参数。

这是我的数据集:

t1=[11800, 11805, 11810, 11817, 11824, 11829, 11834, 11839, 11844, 11849, 11854, 11859, 11866, 11871, 11878, 11883, 11888, 11893, 11898, 11903, 11908, 11915, 11920, 11928, 11933, 11938, 11943, 11948, 11953, 11958, 11965, 11970, 11975, 11980, 11987, 11992, 11997, 12002, 12007, 12014, 12019, 12024, 12029, 12037, 12042, 12047, 12052, 12057, 12063, 12069, 12074, 12079, 12084, 12091, 12096, 12101, 12106, 12111, 12119, 12123, 12128, 12133, 12138, 12146, 12151, 12156, 12161, 12169, 12174, 12179, 12184, 12188, 12193, 12201, 12206, 12211, 12218, 12223, 12228, 12233, 12238, 12243, 12251, 12256, 12260, 12268, 12273, 12278, 12283, 12288, 12292, 12297, 12302, 12310, 12317, 12322, 12327, 12332, 12337]


v1=[
0.36
0.59
0.81
0.92
0.90
0.76
0.54
0.31
0.17
0.19
0.36
0.59
0.81
0.92
0.90
0.76
0.54
0.31
0.17
0.19
0.36
0.59
0.81
0.92
0.90
0.77
0.54
0.31
0.17
0.19
0.35
0.59
0.81
0.92
0.90
0.77
0.55
0.32
0.18
0.19
0.35
0.59
0.80
0.92
0.90
0.77
0.55
0.32
0.17
0.19
0.35
0.59
0.80
0.92
0.90
0.79
0.55
0.32
0.18
0.18
0.35
0.59
0.80
0.92
0.92
0.79
0.57
0.32
0.18
0.18
0.35
0.58
0.80
0.92
0.92
0.79
0.57
0.32
0.18
0.18
0.35
0.58
0.80
0.92
0.92
0.79
0.57
0.34
0.18
0.18
0.34
0.58
0.80
0.92
0.92
0.80
0.57
0.34
0.18
]

为了进行非线性回归,我添加了包含nlinregr函数的工具箱,并按如下方式调用它:

fun='A*sin(W*t1+P)'
dfun='[sin(W*t1+P), A*t1*cos(W*t1+P), A*cos(W*t1+P)]'

[p, yhat,stat]=nlinregr([t1 v1], 't1 v1', fun, dfun,'A W P', 'v1')

使用“ fun”正试图拟合的正弦波函数,“ dfun”由解析导数构成的矩阵,具体取决于我的参数A,W和P。

在执行此功能时,出现错误“不相乘”,但是2小时后,我仍然无法指出问题出在哪里....

有人可以帮我吗?

1 个答案:

答案 0 :(得分:2)

datafit 专用于这种非线性拟合。这是一个原生的 Scilab 函数。 执行拟合并显示结果的代码:

t1 = [11800, 11805, 11810, 11817, 11824, 11829, 11834, 11839, 11844, 11849, 11854, 11859, 11866, 11871, 11878, 11883, 11888, 11893, 11898, 11903, 11908, 11915, 11920, 11928, 11933, 11938, 11943, 11948, 11953, 11958, 11965, 11970, 11975, 11980, 11987, 11992, 11997, 12002, 12007, 12014, 12019, 12024, 12029, 12037, 12042, 12047, 12052, 12057, 12063, 12069, 12074, 12079, 12084, 12091, 12096, 12101, 12106, 12111, 12119, 12123, 12128, 12133, 12138, 12146, 12151, 12156, 12161, 12169, 12174, 12179, 12184, 12188, 12193, 12201, 12206, 12211, 12218, 12223, 12228, 12233, 12238, 12243, 12251, 12256, 12260, 12268, 12273, 12278, 12283, 12288, 12292, 12297, 12302, 12310, 12317, 12322, 12327, 12332, 12337];

v1 = [0.36 0.59 0.81 0.92 0.9 0.76 0.54 0.31 0.17 0.19 0.36 0.59 0.81 0.92 0.9 0.76 0.54 0.31 0.17 0.19 0.36 0.59 0.81 0.92 0.9 0.77 0.54 0.31 0.17 0.19 0.35 0.59 0.81 0.92 0.9 0.77 0.55 0.32 0.18 0.19 0.35 0.59 0.8 0.92 0.9 0.77 0.55 0.32 0.17 0.19 0.35 0.59 0.8 0.92 0.9 0.79 0.55 0.32 0.18 0.18 0.35 0.59 0.8 0.92 0.92 0.79 0.57 0.32 0.18 0.18 0.35 0.58 0.8 0.92 0.92 0.79 0.57 0.32 0.18 0.18 0.35 0.58 0.8 0.92 0.92 0.79 0.57 0.34 0.18 0.18 0.34 0.58 0.8 0.92 0.92 0.8 0.57 0.34 0.18];

function g = gap(p, Data)
    // v = p(1) + p(2)*sin(p(3)*t+p(4))
    // p = [v_offset,  amplitude, angular_frequency, phase]
    t = Data(1,:)
    v = Data(2,:)
    g = v - (p(1) + p(2)*sin(p(3)*t+p(4)))
endfunction

p0 = [0.50 0.35 2*%pi/50 0.5];  // initial guess of fitting parameters
[p, dmin, status] = datafit(gap, [t1 ; v1], p0, "ar",200)

vfit = p(1) + p(2)*sin(p(3)*t1+p(4));
clf
subplot(2,1,1), plot(t1,v1), title "Given data" fontsize 3
subplot(2,1,2), plot(t1, vfit-v1), title "Fit - data" fontsize 3

结果:

--> [p, dmin, status] = datafit(gap, [t1 ; v1], p0, "ar",200)
 p  = 
   0.572807   0.3879044   0.114452   131.77806
    offset    amplitude   angular      phase
                          frequency

 dmin  = 
   0.0331676         average v distance between data and fit

 status  =
   9.                 means "OK"

enter image description here