Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab为拟合模型找到最佳常数_Matlab_Optimization - Fatal编程技术网

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

Matlab为拟合模型找到最佳常数,matlab,optimization,Matlab,Optimization,请在下面的链接中查找数据,或者如果您可以向我发送您的私人电子邮件,我可以向您发送数据 在excel表格中,第一列是y,第二列是x,第三列是t,我希望这会让事情变得更清楚,非常感谢您的帮助 我需要使用以下模型,因为它最适合我的数据,但我不知道如何找到a和b的最佳值,这将允许我获得最佳拟合,(如果需要值,我可以附加一个文件),我已经有y、x和t的值: y=a*sqrt(x).exp(b.t) 谢谢使用cftool-命令(曲线拟合工具箱),您可以拟合自己的函数,返回所需的变量(a,b)。确保x数据和

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

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

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

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


谢谢

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

如果不依赖曲线拟合工具箱,也可以使用
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
)和行向量(模型函数的结果)之差时,会发生错误。轻松破解:让它们都成为行向量,并使用我的方法。结果是: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.mat
%为了简单起见,将x和t放入一个2行矩阵中
D(1,:)=x;
D(2,:)=t;

y=重塑(y,1,长度(y));%你在如何获取这些值(数学上的问题也是如此)方面有问题吗?或者你在matlab中实现这些值方面有问题吗?因为现在你的问题似乎是关于如何解决这样一个数学问题。如果是这种情况,请查看一些关于最小平方距离()或关于如何最小化平方距离的页面。我的问题是如何在Matlab中找到这些值。我认为,您应该编辑您的帖子,以包含您所做的,您希望实现的内容(作为代码或至少作为伪代码)你真正在挣扎的是什么。因为现在这看起来像是:“嘿,我想为我做点什么”对不起,我不是这个意思,只是我不知道怎么做。假设我有下面的值数组,那么我在没有a和b的情况下如何绘制图表,以及如何获得a和b的最佳优化值。y=testmatlablefou(:,1);x=testmatlablefou(:,2);t=testmatlablefou(:,3);我可以尝试这样做,例如“y1=sqrt(x)*exp(t)”,然后将y与y1进行比较,以尝试获得a&b。cftool是否可以给我a&b的值?请你给我一个如何做的提示?谢谢你=[13.2563 14.9891 24.0338 15.4405 27.1803 16.972 14.8228 15.867 1.81011 0.50918 16.6698 10.0985 9.16819 10.5727 3.49259 2.0371 1.11696 0.07645 0.16101-0.04732-0.05736];x=[25.72625.926.526.526.426.626.626.426.326.326.1258.624.723.822.922.521.721.1202];t=[1818.824 1893.31 1934.15 1921.384 1892.088 1891.962 1838.306 1737.683 1594.182 1394.7 1186.022 839.6656 786.6523752.3392 506.787 349.4027 113.1767 39.3187 5.880522 0.8564087 0.8591992 0.8583118];'上面是一个很少有值的例子,事实上,每个数组大约有3000个值values@lefou请确保
y
x
t
的向量大小相同。请检查上面注释中的数据,我没有共享数据,因为在尝试应用您的方法时,我没有找到附加文件的方法。在我的数据上,matlab有一个错误,说明如下:fminsearch(第191行)fv(:,1)=funfcn(x,varargin{:});请你解释一下为什么生成X和T,为什么每个都有100个值?Thanks@lefou我不会试图找出我应该使用
x
t
y
中的哪一个,除非您提供干净的数据,这意味着所有数据向量的长度相同。最好编辑您的问题,并将数据集放在问题中,而不是放在某些注释中。此外,我无法重现您描述的错误,这显然不是完整的错误回溯。你需要帮助,所以请尽可能合作。带有
X
T
的零件仅用于可视化。您可以获得更平滑的线和更多的点,并且可以在所有
x
t
对上计算模型函数。如果可以,请附加一个文件,如何?