如何使用一个拟合参数将隐式方程拟合到数据集:MATLAB
How to fit an implicit equation to a data set, with one fitting parameter: MATLAB
我正在尝试将隐式方程拟合到从论文中提取的一组数据,如下所示。
数据集包含跨越半径 R
的间隙的粒子浓度 phi
。 phi
和 R
的数据如下。
phi(Ri) = phi(1);
Ri = R(1);
n = 2;
phiM = 0.68
Kc / Ku = fitting parameters.
R = [4.47 4.59 4.69 4.81 4.92 5.02 5.13 5.24 5.35 5.46 5.57 5.68];
phi = [0.569 0.570 0.573 0.576 0.578 0.581 0.585 0.589 0.593 0.595 0.598 0.602];
我正在尝试将等式 16 拟合到所提供的数据集。对于如何将方程拟合到方程两边的一组数据,我完全不知所措。我之前已经将数据拟合到方程式中。但是它总是明确的 (y = f(x)
) 。
每次我尝试在曲线拟合工具箱中输入拟合方程时,我都会被警告方程两边不能有 y
。对于这些不能使用曲线拟合工具的方程怎么办?
非常感谢任何有关我如何学习此类拟合的帮助或指导。
让我们从定义您的已知变量开始,如您的问题所示:
% Known parameters
R = [4.47 4.59 4.69 4.81 4.92 5.02 5.13 5.24 5.35 5.46 5.57 5.68];
phi = [0.569 0.570 0.573 0.576 0.578 0.581 0.585 0.589 0.593 0.595 0.598 0.602];
phi_Ri = phi(1); Ri = R(1);
n = 2; phiM = 0.68;
现在定义你的函数,但是减去左边的部分,这样我们就可以让等式等于零。此函数将根据 x
参数 (R
)、y
参数 (phi
) 和唯一未知的 kk
定义为Ku/Kc 在 (16).
F = @(x,y,kk) ((x/Ri).^2).*((1-phi_Ri/phiM)./(1-y/phiM)).^(n*(1-kk)) - (y/phi_Ri);
现在我们可以使用 fminsearch
和对 kk
的一些初始猜测来找到 "best" 值。您可以随心所欲地定义 "best",在这种情况下,我采用了 F
的范数,这意味着计算出的 x
和 距离 与y
坐标和 R
和 phi
的给定值。因为函数 F
应该等于 0,所以最小化它才有意义!
% Min search based on norm, with initial guess KuKcMin = 1
KuKcMin = fminsearch(@(KuKc) norm(F(R,phi,KuKc)), 1);
在这个例子中,KuKcMin = 1.6735
所以 Kc/Ku = 1/1.6735 = 0.5975 类似于纸上的右图。
现在我们必须使用ezplot
来绘制隐函数,我们还要绘制原始点。
ezplot(@(x,y)F(x,y,KuKcMin), [4.2,6,0.56,0.61]); % 4-element array is axes limits
hold on;
plot(R,phi,'o');
xlabel('R'); ylabel('\phi'); title('');
输出:
您可以通过更改参数 n
、phiM
和 KuKcMin
来验证绘图和函数 F
是否正常工作,以重现上面论文中的绘图:
编辑:
作为输入传递给 ezplot
的轴范围是整个绘图范围,而不仅仅是 可见 。您的新数据不在旧限制范围内,因此我们必须适应!
phi = [0.285 0.285 0.293 0.298 0.299 0.303 0.309 0.310 0.310 0.312 0.315 0.317 0.318 0.318 0.321 0.321 0.321 0.324 0.327 0.325 0.326 0.332 0.335 0.333 0.336];
R = [4.190 4.365 4.540 4.714 4.889 5.063 5.238 5.413 5.587 5.762 5.937 6.111 6.286 6.460 6.635 6.810 6.984 7.159 7.333 7.508 7.683 7.857 8.032 8.206 8.381];
phi_Ri = phi(1); Ri = R(1); n = 2; phiM = 0.68;
F = @(x,y,kk) ((x/Ri).^2).*((1-phi_Ri/phiM)./(1-y/phiM)).^(n*(1-kk)) - (y/phi_Ri);
KuKcMin = fminsearch(@(KuKc) norm(F(R,phi,KuKc)), 1);
% NOTE: change the ezplot <-- axes limits -->
ezplot(@(x,y)F(x,y,KuKcMin), [4.18,8.4,0.28,0.34]); % 4-element array is axes limits
hold on; plot(R,phi,'o'); xlabel('R'); ylabel('\phi'); title('');
为了使您的代码更通用,您始终可以在与数据相同的范围内使用 ezplot
。您可能想要添加一些填充或舍入。
ezplot(@(x,y)F(x,y,KuKcMin), [min(R),max(R),min(phi),max(phi)]);
输出:
我正在尝试将隐式方程拟合到从论文中提取的一组数据,如下所示。
数据集包含跨越半径 R
的间隙的粒子浓度 phi
。 phi
和 R
的数据如下。
phi(Ri) = phi(1);
Ri = R(1);
n = 2;
phiM = 0.68
Kc / Ku = fitting parameters.
R = [4.47 4.59 4.69 4.81 4.92 5.02 5.13 5.24 5.35 5.46 5.57 5.68];
phi = [0.569 0.570 0.573 0.576 0.578 0.581 0.585 0.589 0.593 0.595 0.598 0.602];
我正在尝试将等式 16 拟合到所提供的数据集。对于如何将方程拟合到方程两边的一组数据,我完全不知所措。我之前已经将数据拟合到方程式中。但是它总是明确的 (y = f(x)
) 。
每次我尝试在曲线拟合工具箱中输入拟合方程时,我都会被警告方程两边不能有 y
。对于这些不能使用曲线拟合工具的方程怎么办?
非常感谢任何有关我如何学习此类拟合的帮助或指导。
让我们从定义您的已知变量开始,如您的问题所示:
% Known parameters
R = [4.47 4.59 4.69 4.81 4.92 5.02 5.13 5.24 5.35 5.46 5.57 5.68];
phi = [0.569 0.570 0.573 0.576 0.578 0.581 0.585 0.589 0.593 0.595 0.598 0.602];
phi_Ri = phi(1); Ri = R(1);
n = 2; phiM = 0.68;
现在定义你的函数,但是减去左边的部分,这样我们就可以让等式等于零。此函数将根据 x
参数 (R
)、y
参数 (phi
) 和唯一未知的 kk
定义为Ku/Kc 在 (16).
F = @(x,y,kk) ((x/Ri).^2).*((1-phi_Ri/phiM)./(1-y/phiM)).^(n*(1-kk)) - (y/phi_Ri);
现在我们可以使用 fminsearch
和对 kk
的一些初始猜测来找到 "best" 值。您可以随心所欲地定义 "best",在这种情况下,我采用了 F
的范数,这意味着计算出的 x
和 距离 与y
坐标和 R
和 phi
的给定值。因为函数 F
应该等于 0,所以最小化它才有意义!
% Min search based on norm, with initial guess KuKcMin = 1
KuKcMin = fminsearch(@(KuKc) norm(F(R,phi,KuKc)), 1);
在这个例子中,KuKcMin = 1.6735
所以 Kc/Ku = 1/1.6735 = 0.5975 类似于纸上的右图。
现在我们必须使用ezplot
来绘制隐函数,我们还要绘制原始点。
ezplot(@(x,y)F(x,y,KuKcMin), [4.2,6,0.56,0.61]); % 4-element array is axes limits
hold on;
plot(R,phi,'o');
xlabel('R'); ylabel('\phi'); title('');
输出:
您可以通过更改参数 n
、phiM
和 KuKcMin
来验证绘图和函数 F
是否正常工作,以重现上面论文中的绘图:
编辑:
作为输入传递给 ezplot
的轴范围是整个绘图范围,而不仅仅是 可见 。您的新数据不在旧限制范围内,因此我们必须适应!
phi = [0.285 0.285 0.293 0.298 0.299 0.303 0.309 0.310 0.310 0.312 0.315 0.317 0.318 0.318 0.321 0.321 0.321 0.324 0.327 0.325 0.326 0.332 0.335 0.333 0.336];
R = [4.190 4.365 4.540 4.714 4.889 5.063 5.238 5.413 5.587 5.762 5.937 6.111 6.286 6.460 6.635 6.810 6.984 7.159 7.333 7.508 7.683 7.857 8.032 8.206 8.381];
phi_Ri = phi(1); Ri = R(1); n = 2; phiM = 0.68;
F = @(x,y,kk) ((x/Ri).^2).*((1-phi_Ri/phiM)./(1-y/phiM)).^(n*(1-kk)) - (y/phi_Ri);
KuKcMin = fminsearch(@(KuKc) norm(F(R,phi,KuKc)), 1);
% NOTE: change the ezplot <-- axes limits -->
ezplot(@(x,y)F(x,y,KuKcMin), [4.18,8.4,0.28,0.34]); % 4-element array is axes limits
hold on; plot(R,phi,'o'); xlabel('R'); ylabel('\phi'); title('');
为了使您的代码更通用,您始终可以在与数据相同的范围内使用 ezplot
。您可能想要添加一些填充或舍入。
ezplot(@(x,y)F(x,y,KuKcMin), [min(R),max(R),min(phi),max(phi)]);
输出: