Non-linear model is the one in which observational data is modeled by a non-linear combination of one or more model parameters and observational variables.
The non-linear equation is of the form:
In this case, we use the MATLAB function lsqcurvefit
:
%% Fit Model
% - Utpal Kumar
clear; close all; clc
% generate some random data
Kdp = 0:40;
Zdr = 100:100+length(Kdp)-1;
xdata = [Kdp; Zdr]; %define independent variable
noise = 0.1*randn(size(xdata(1,:)));
ydata = 26.778*xdata(1,:).^0.946 .*xdata(2,:).^-1.249 + noise; %define dependent, ydata
% define optimization options
options = optimset('Display','iter','FunValCheck','on', ...
'MaxFunEvals',Inf,'MaxIter',Inf, ...
'TolFun',1e-6,'TolX',1e-6);
paramslb = [-Inf -Inf -Inf]; % lower bound
paramsub = [ Inf Inf Inf]; % upper bound
% define the initial seed
params0 = [20,0.9,-1.2];
% define model function
modelfun = @(pp,xdata) pp(1)*xdata(1,:).^pp(2).*xdata(2,:).^pp(3);
[params,resnorm,residual,exitflag,output] = lsqcurvefit(modelfun,params0,xdata,ydata,paramslb,paramsub,options);
params
% compute model fit
modelfit = modelfun(params,xdata);
% check squared error (the aim is to minimize squared error)
squarederror = sum((ydata(:)-modelfit(:)).^2)
% visualize the data and results
figure;
scatter3(xdata(1,:),xdata(2,:),ydata,'k') %scatter plot of data
hold on
[X,Y] = meshgrid(xdata(1,:),xdata(2,:));
Z = params(1)*X.^params(2) .*Y.^params(3);
s = surf(X,Y,Z,'FaceColor','interp','FaceAlpha',0.7); %surface plot of the results with the estimated parameters
s.EdgeColor = 'none';
colorbar
title(sprintf('squared error = %.1f; params: [%.2f, %.2f, %.2f]',squarederror,params(1),params(2),params(3)));
OUTPUT:
Norm of First-order
Iteration Func-count f(x) step optimality
0 4 3.00771 45.8
1 8 1.01784 10 18.5
2 12 1.01784 20 18.5
3 16 0.749083 5 3.19
4 20 0.749083 10 3.19
5 24 0.739709 2.5 0.941
6 28 0.736382 5 2.32
7 32 0.730617 5 2.06
8 36 0.725309 5 1.68
9 40 0.720793 5 1.39
10 44 0.716863 5 1.17
11 48 0.716863 10 1.17
12 52 0.714394 2.5 0.363
13 56 0.702756 5 1.61
14 60 0.702475 10 2.95
15 64 0.69606 2.5 0.302
16 68 0.692996 5 0.649
17 72 0.692936 10 2.11
18 76 0.689562 2.5 0.248
19 80 0.685872 5 1.03
20 84 0.684458 10 1.45
21 88 0.682476 10 1.15
22 92 0.680904 10 0.983
23 96 0.679528 10 0.849
24 100 0.678304 10 0.74
25 104 0.677204 10 0.649
26 108 0.677204 20 0.649
27 112 0.676476 5 0.188
28 116 0.675021 10 0.279
29 120 0.675021 20 0.279
30 124 0.674572 5 0.461
31 128 0.673816 10 0.439
32 132 0.673816 20 0.439
33 136 0.673347 5 0.165
34 140 0.666859 10 1.04
35 144 0.666859 20 1.04
36 148 0.66599 5 0.11
37 152 0.665912 10 0.313
38 156 0.665785 10 0.301
39 160 0.665663 10 0.278
40 164 0.665549 10 0.257
41 168 0.665443 10 0.238
42 172 0.665344 10 0.221
43 176 0.665251 10 0.206
44 180 0.665164 10 0.192
45 184 0.665082 10 0.18
46 188 0.665082 20 0.18
47 192 0.665025 5 0.0544
48 196 0.66496 10 0.135
49 200 0.66496 20 0.135
50 204 0.664915 5 0.0478
51 208 0.664852 10 0.117
52 212 0.664852 20 0.117
53 216 0.664813 5 0.043
54 220 0.664754 10 0.101
55 224 0.664754 20 0.101
56 228 0.664719 5 0.0385
57 232 0.664664 10 0.0868
58 236 0.664664 20 0.0868
59 240 0.664633 5 0.0342
60 244 0.664581 10 0.0722
61 248 0.664581 20 0.0722
62 252 0.664553 5 0.0296
63 256 0.664503 10 0.0543
64 260 0.664503 20 0.0543
65 264 0.664479 5 0.0227
66 268 0.664421 10 0.0334
67 272 0.664421 20 0.0334
68 276 0.664401 5 0.0725
69 280 0.664365 10 0.0896
70 284 0.664364 20 0.321
71 288 0.66428 5 0.0308
72 292 0.66425 10 0.0596
73 296 0.664243 20 0.273
74 300 0.664181 5 0.027
75 304 0.664156 10 0.0495
76 308 0.664146 20 0.235
77 312 0.6641 5 0.0237
78 316 0.664078 10 0.0421
79 320 0.664068 20 0.205
80 324 0.664032 5 0.0208
81 328 0.664015 10 0.0369
82 332 0.664006 20 0.181
83 336 0.663979 20 0.174
84 340 0.663953 20 0.163
85 344 0.663931 20 0.152
86 348 0.663912 20 0.143
87 352 0.663895 20 0.134
88 356 0.663881 20 0.126
89 360 0.66387 20 0.119
90 364 0.663861 20 0.112
91 368 0.663854 20 0.105
92 372 0.66385 20 0.0991
93 376 0.663847 19.0329 0.0845
94 380 0.663842 0.413735 2.64e-05
95 384 0.663842 0.0136481 3.46e-08
Local minimum found.
Optimization completed because the size of the gradient is less than
the selected value of the optimality tolerance.
<stopping criteria details>
params =
804.4592 0.9611 -1.9579
squarederror =
0.6638