如何使用一个拟合参数将隐式方程拟合到数据集:MATLAB

How to fit an implicit equation to a data set, with one fitting parameter: MATLAB

我正在尝试将隐式方程拟合到从论文中提取的一组数据,如下所示。

数据集包含跨越半径 R 的间隙的粒子浓度 phiphiR 的数据如下。

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 坐标和 Rphi 的给定值。因为函数 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('');

输出:

您可以通过更改参数 nphiMKuKcMin 来验证绘图和函数 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)]);

输出: