【问题标题】:Matlab find the best constants for a fitting modelMatlab 找到拟合模型的最佳常数
【发布时间】:2014-12-02 21:00:45
【问题描述】:

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

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)

谢谢

【问题讨论】:

  • 你有问题如何获得这些值(数学上的问题也是如此)还是你的问题是在 matlab 中实现它?因为现在你的问题似乎是关于如何解决这样一个数学问题。如果是这种情况,请查看一些关于最小二乘距离 (wiki link) 或关于如何最小化二乘距离的页面
  • 我的问题是如何在 Matlab 中找到这些值
  • 那么在我看来,您应该编辑您的帖子以包含您所做的、您希望实现的内容(作为代码或至少作为伪代码)以及您真正在努力解决的问题.因为现在这看起来像:“嘿,我想要……为我做这件事”
  • 对不起,我不是这个意思,只是我不确定该怎么做。假设我有以下值数组,那么我该如何继续绘制图表我没有 a & b 以及如何获得 a & b 的最佳优化值。 y=testmatlablefou(:,1); x=testmatlablefou(:,2); t=testmatlablefou(:,3);
  • 我可以尝试这样做,例如 'y1=sqrt(x)*exp(t)' 然后将 y 与 y1 进行比较以尝试得到 a & b

标签: matlab optimization


【解决方案1】:

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

【讨论】:

  • cftool 是否给了我 a & b 的值?
  • 请问您能给我一个提示吗?谢谢
  • 'y = [13.2563 14.9891 24.0338 15.4405 27.1803 16.972 14.8228 15.867 1.81011 0.0985 9.6698 10.0985 9.68119 10.5727 3.49259 2.0371 1.17.12.098917.0985/171111.098517.12.0985 3.49259 2.0985/1211110.0985 3.49259 2.0985 9.1919190.0985 9.1919190.0985 9.1919190.0985 9.17.12.0985] x=[25.7 26 25.9 26.5 26.5 26.4 26.2 26.6 26.6 26.4 26.3 26.1 25.8 25.6 24.7 23.8 22.9 22.5 21.7 21.1 20.2 20]; T = [1818.824 1893.31 1934.15 1921.384 1892.088 1891.962 1838.306 1737.683 1594.182 1186.022 1394.7 839.6656 786.6523 752.3392 506.787 349.4027 113.1767 39.3187 5.880522 0.8564087 0.8591992 0.8583118];'跨度>
  • 上面是几个值的例子,实际上我为每个数组有大约 3000 个值
  • @lefou 请确保yxt 的向量大小相同。
【解决方案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))

结果可能类似于

许多评论后更新

您的数据是列向量,我的解决方案使用行向量。当 errorfunction 试图计算列向量 (y) 和行向量(模型函数的结果)的差异时,就会发生错误。 Easy hack:将它们全部变成行向量并使用我的方法。结果是: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))

虽然结果看起来不太令人满意。但这主要是因为您的数据。看看这里:

【讨论】:

  • 请您查看上面评论中的数据,我没有分享数据,因为我没有找到附加文件的方法
  • 在尝试应用您的方法时,在我的数据上,matlab 出现错误,说明如下: fminsearch 中的错误(第 191 行) fv(:,1) = funfcn(x,varargin{: });
  • 请您向我解释一下为什么生成 X 和 T,以及为什么每个都有 100 个值?谢谢
  • @lefou 我不会试图弄清楚,我应该使用xty 中的哪一个,除非你提供干净的数据,这意味着所有数据向量都是相同的长度。最好编辑您的问题并将数据集放在问题中,而不是在一些评论中。此外,我无法重现您描述的错误,而且这显然不是完整的错误回溯。你需要帮助,所以请尽可能合作。带有XT 的部分仅用于可视化。你会得到更多点的更平滑的线条,并且可以在所有 xt 对上评估模型函数。
  • 请问可以附上文件吗,如果可以怎么办?
猜你喜欢
  • 1970-01-01
  • 2013-10-07
  • 2013-08-24
  • 2021-08-19
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 2013-01-06
相关资源
最近更新 更多