lmcurvefit

curve fitting using Levenberg Marquardt algorithm
12 téléchargements
Mise à jour 17 sept. 2024

Afficher la licence

% the following examples are available here
% https://www.mathworks.com/help/optim/ug/lsqcurvefit.html
% you can compare to the result from lmcurvefit to that of inbuilt matlab
% function lsqcurvefit
%% Example 1 (Unconstrained Curve Fitting)
close all
xdata = [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3]';
ydata = [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5]';
x0 = [100;-1];
times = linspace(xdata(1),xdata(end))';
scatter(xdata, ydata, 'o'); hold on;
plt = plot(times, myfun1(x0, times), 'r');
model = @(x,xdata) myfun1(x, xdata, times, plt);
[x_lm, ~, ~, ~, output] = lmcurvefit(model, x0, xdata, ydata,[],[],[],[])
%% Example 2 (Box Constrained Curve Fitting)
close all
xdata = linspace(0, 3)';
ydata = exp(-1.3*xdata)+0.05*rand(size(xdata));
lb = [0;-2];
ub = [3/4; -1];
x0 = [1/2;-2];
scatter(xdata, ydata, 'o'); hold on;
plt = plot(xdata, myfun2(x0, xdata), 'r');
model = @(x,xdata) myfun2(x, xdata, xdata, plt);
[x_lm, ~, resnorm_lm, residual_lm, output] = ...
lmcurvefit(model, x0, xdata, ydata, [], [], lb, ub);
%% Example 3 (Linear InEquality Constraint)
close all; clc
rng default
xdata = linspace(2,7)';
ydata = myfun3([2,4,5,0.5]',xdata) + 0.1*randn(size(xdata));
lb = zeros(4,1);
ub = 7*ones(4,1);
A = [-1 -1 1 1];
b = 0;
startpt = [1 2 3 1]';
options = optimoptions(@lsqcurvefit, Display='iter');
scatter(xdata, ydata, 'o'); hold on;
plt = plot(xdata, myfun3(startpt,xdata), 'r');
fineq = @(x)A*x - b;
fun = @(x, xdat) myfun3(x,xdat, plt);
[x_lm, ~, resnorm_lm, residual_lm, output_lm] = ...
lmcurvefit(fun, startpt, xdata, ydata, fineq, [], lb, ub);
%% Example 4 (Nonlinear InEquality Constraint)
close all; clc
rng default
xdata = linspace(2,7)';
ydata = myfun3([2,4,5,0.5]',xdata) + 0.1*randn(size(xdata));
lb = zeros(4,1);
ub = 7*ones(4,1);
startpt = [1 2 3 1]';
options = optimoptions(@lsqcurvefit, Display='iter');
scatter(xdata, ydata, 'o'); hold on;
plt = plot(xdata, myfun3(startpt,xdata), 'r');
fineq = @(x)x(1)^2 + x(2)^2 - 4^2;
fun = @(x, xdat) myfun3(x,xdat, plt);
[x_lm, ~, resnorm_lm, residual_lm, output_lm] = ...
lmcurvefit(fun, startpt, xdata, ydata, fineq, [], lb, ub);
%% model functions
function F = myfun1(x,xdata, times, plt)
F = x(1)*exp(x(2)*xdata);
if(nargin > 2)
plt.YData = x(1)*exp(x(2)*times);
drawnow; pause(0.01);
end
end
function F = myfun2(x,xdata, times, plt)
F = x(1)*exp(x(2)*xdata);
if(nargin >2)
plt.YData = x(1)*exp(x(2)*times);
drawnow; pause(0.01);
end
end
function F = myfun3(x,xdata, plt)
a = x(1); b = x(2); t0 = x(3); c = x(4);
F = a + b*atan(xdata - t0) + c*xdata;
if(nargin>2)
plt.YData = F;
drawnow; pause(0.01);
end
end

Citation pour cette source

Lateef Adewale Kareem (2024). lmcurvefit (https://www.mathworks.com/matlabcentral/fileexchange/172344-lmcurvefit), MATLAB Central File Exchange. Extrait(e) le .

Compatibilité avec les versions de MATLAB
Créé avec R2024a
Compatible avec toutes les versions
Plateformes compatibles
Windows macOS Linux

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!
Version Publié le Notes de version
2.0.0

Algorithm is improved with back tracking. function handle for the updating the figure has been removed. But the example still shows how to achieve that by updating the plot inside the objective function.

1.0.25

corrected second example

1.0.2

Added functionality for bound and constraints. added jacobian file too.

1.0.1

improved stopping criteria

1.0.0