我安装了曲线拟合工具箱,并且正在尝试将扩散数据拟合到特定函数。
该函数是以下形式的误差函数:
y = 3500 - 2500 * erf( ( x-x0 ) / ( 2 * sqrt( D * t )) )
我希望该应用程序为我提供合理的值D and x0,而 t 是预定义的常数。拟合所基于的数据点包括 x 和 y 的值。
我知道D 应该在 1e-11 左右 and x0 约为 0.0014但该函数不会自行找到这些解决方案。 Matlab 输出错误“输入内容必须真实、完整。“尝试使用曲线拟合应用程序的默认参数时。
当我设定起始猜测时x0到0.0014或0.0015,它会找到正确的解决方案。但仅限于这两个值。为了找到正确的解决方案D我需要在方程中设置一个前置因子,如本例所示(1e-12):
y = erf( ( x-x0 ) / ( 2 * sqrt( 1e-12 * D * t )) )
通过这种方式,matlab 可以找到正确的解,但仅限于 1e-10 到 1e-13 之间的前置因子。
这是一个很大的问题,因为 D 的正确解决方案将在 1e-3 和 1e-15 之间变化,具体取决于我要使用的数据集。 x0 的值也会变化。所以这样我就无法实现一个通用的解决方案。
您对如何处理这个问题有什么建议吗?我不敢相信matlab无法解决这个问题,一定有办法。是因为数值太小了吗?
这是我正在使用的示例数据集:
y = [6000 6000 6000 6000 6000 6000 6000 6000 6000 5750 5500 5250 5000 4500 4000 3250 2750 2250 1750 1500 1400 1250 1250 1150];
x = [0:0.0001:0.0023];
当在方程中使用以下固定参数时,所得直线非常适合数据点。但 matlab 不会找到它们。
D = 7.1e-11;
t = 900;
x0 = 0.0015;
(请记住,这些参数基于比我在这里提供的数据集更大、更准确的数据集)
任何帮助都会很棒!非常感谢。
这是一个工作示例,其中包含所有预定义参数以使拟合工作。代码由曲线拟合工具 (cftool) 生成:
%% Fit: 'untitled fit 1'.
% Input data
C = [6000 6000 6000 6000 6000 6000 6000 6000 6000 5750 5500 5250 5000 4500 4000 3250 2750 2250 1750 1500 1400 1250 1250 1150]';
x = [0:0.0001:0.0023]';
[xData, yData] = prepareCurveData( x, C );
% Set up fittype and options.
ft = fittype( '3500-2500*erf((x-x0)/(2*sqrt(1e-10*D*900)))', 'independent', 'x', 'dependent', 'y' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Display = 'Off';
opts.MaxIter = 4000;
opts.StartPoint = [0.5 0.0014];
opts.Upper = [1 Inf];
% Fit model to data.
[fitresult, gof] = fit( xData, yData, ft, opts )
% Plot fit with data.
figure( 'Name', 'untitled fit 1' );
h = plot( fitresult, xData, yData );
legend( h, 'C vs. x', 'untitled fit 1', 'Location', 'NorthEast' );
% Label axes
xlabel x
ylabel C
grid on
(图只是为了方便)
请注意,我在 sqrt() 项中包含了前置因子 1e-10,并且我使用 0.0014 作为 x0 的起始猜测,否则拟合将不起作用。