Matlab找到拟合模型的最佳常数

时间:2014-10-08 08:55:44

标签: matlab optimization

请在下面的链接中找到数据,或者如果您可以将您的私人电子邮件发送给我,我可以将数据发送给您

https://dl.dropboxusercontent.com/u/5353938/test_matlab_lefou.xlsx

在excel表中,第一列是y,第二列是x,第三列是t,我希望这会让事情变得更加清晰,非常感谢你的帮助。

我需要使用以下模型,因为它最适合我的数据,但我不知道的是如何找到a和b的最佳值,这将使我获得最好的适合,(如果你需要值,我可以附加一个文件),我已经有了y,x和t的值:

y = a * sqrt(x).exp(b.t)

由于

2 个答案:

答案 0 :(得分:2)

如果不依赖曲线拟合工具箱,也可以使用fminsearch解决此问题。我首先生成一些您已经拥有但未与我们分享的数据。必须对参数a和b进行初始猜测(p0)。然后我通过最小化数据和拟合之间的平方误差来进行优化,从而得到向量p_fit,其包含a和b的优化参数。最后,结果是可视化的。

% ----- Generating some data for x, y and t (which you already got)
N = 10; % num of data points
x = linspace(0,5,N);
t = linspace(0,10,N);

% random parameters
a = rand()*5; % a between 0 and 5
b = (rand()-1); % b between -1 and 0
y = a*sqrt(x).*exp(b*t) + rand(size(x))*0.1; % noisy data

% ----- YOU START HERE WITH YOUR PROBLEM -----
% put x and t into a 2 row matrix for simplicity
D(1,:) = x;
D(2,:) = t;

% create model function with parameters p(1) = a and p(2) = b
model = @(p, D) p(1)*sqrt(D(1,:)).*exp(p(2)*D(2,:));
e = @(p) sum((y - model(p,D)).^2); % minimize squared errors
p0 = [1,-1]; % an initial guess (positive a and probably negative b for a decay)
[p_fit, r1] = fminsearch(e, p0); % Optimize 


% ----- VISUALIZATION ----
figure
plot(x,y,'ko')
hold on
X = linspace(min(x), max(x), 100);
T = linspace(min(t), max(t), 100);
plot(X, model(p_fit, [X; T]), 'r--')
legend('data', sprintf('fit: y(t,x) = %.2f*sqrt(x)*exp(%.2f*t)', p_fit))

结果可能看起来像this

多次评论后更新

您的数据是列向量,我的解决方案使用行向量。当错误函数试图计算列向量(y)和行向量(模型函数的结果)的差异时发生错误。轻松破解:将它们全部用于行向量并使用我的方法。结果是:a = 0.5296,b = 0.0013。 但是,优化取决于初始猜测p0,您可能希望稍微使用它。

clear variables
load matlab.mat

% put x and t into a 2 row matrix for simplicity
D(1,:) = x;
D(2,:) = t;
y = reshape(y, 1, length(y)); % <-- also y is a row vector, now

% create model function with parameters p(1) = a and p(2) = b
model = @(p, D) p(1)*sqrt(D(1,:)).*exp(p(2)*D(2,:));
e = @(p) sum((y - model(p,D)).^2); % minimize squared errors
p0 = [1,0]; % an initial guess (positive a and probably negative b for a decay)
[p_fit, r1] = fminsearch(e, p0); % Optimize 

% p_fit = nlinfit(D, y, model, p0) % as a working alternative with dependency on the statistics toolbox

% ----- VISUALIZATION ----
figure
plot(x,y,'ko', 'markerfacecolor', 'black', 'markersize',5)
hold on
X = linspace(min(x), max(x), 100);
T = linspace(min(t), max(t), 100);
plot(X, model(p_fit, [X; T]), 'r-', 'linewidth', 2)
legend('data', sprintf('fit: y(t,x) = %.2f*sqrt(x)*exp(%.2f*t)', p_fit))

但结果看起来并不太令人满意。但这主要是因为你的数据。看看这里:enter image description here

答案 1 :(得分:1)

使用cftool - 命令(曲线拟合工具箱),您可以适合您自己的函数,返回您需要的变量(a,b)。确保您的x数据和y数据位于单独的变量中。您还可以为测量指定重量。