Matlab 如何在实验数据上进行非线性数据拟合
我有一些实验数据。因此,我需要拟合以下函数来确定其中一个变量。本程序中使用了Levenberg–Marquardt最小二乘法 我在Igor Pro软件中使用了曲线拟合选项。我定义了新的拟合函数,并试图定义自变量和因变量。 然而,我不知道是什么原因导致了这个错误: “fitting函数返回了至少一个X变量的INF” 我的职能是:Matlab 如何在实验数据上进行非线性数据拟合,matlab,gnuplot,curve-fitting,originlab,igor,Matlab,Gnuplot,Curve Fitting,Originlab,Igor,我有一些实验数据。因此,我需要拟合以下函数来确定其中一个变量。本程序中使用了Levenberg–Marquardt最小二乘法 我在Igor Pro软件中使用了曲线拟合选项。我定义了新的拟合函数,并试图定义自变量和因变量。 然而,我不知道是什么原因导致了这个错误: “fitting函数返回了至少一个X变量的INF” 我的职能是: sin(theta) = -1+2*sqrt(alpha/x)*exp(-beta*(x-alpha)^2) beta = 1.135e-4; sin(theta)
sin(theta) = -1+2*sqrt(alpha/x)*exp(-beta*(x-alpha)^2)
beta = 1.135e-4;
sin(theta) = [-0.81704 -0.67649 -0.83137 -0.73468 -0.66744 -0.43602 0.45368 0.75802 0.96705 0.99717 ]
x = [72.01 59.99 51.13 45.53 36.15 31.66 30.16 29.01 25.62 23.47 ]
有没有建议在这里找到alpha
变量
是否有任何方便的软件或程序用于非线性曲线拟合?在gnuplot中,它看起来是这样的。拟合不是很好,但这不是gnuplot的“错误”,但显然这个数据不能很好地拟合这个函数 代码:
### nonlinear curve fitting
reset session
$Data <<EOD
72.01 -0.81704
59.99 -0.67649
51.13 -0.83137
45.53 -0.73468
36.15 -0.66744
31.66 -0.43602
30.16 0.45368
29.01 0.75802
25.62 0.96705
23.47 0.99717
EOD
f(x) = -1+2*sqrt(alpha/x)*exp(-beta*(x-alpha)**2)
# initial guessed values
alpha = 25
beta = 1
set fit nolog results
fit f(x) $Data u 1:2 via alpha,beta
plot $Data u 1:2 w lp pt 7, \
f(x) lc rgb "red"
print sprintf("alpha=%g, beta=%g",alpha,beta)
### end of code
alpha=25.818, beta=0.0195229
如果可能有用的话,我对你的数据进行的方程搜索结果与标准的四参数逻辑方程“y=d+(a-d)/(1.0+pow(x/c,b))”非常吻合,参数a=0.96207949,b=44.14292256,c=30.67324939,d=-0.74830947产生RMSE=0.0565和R-squared=0.9943,我已经包含了使用这个等式的Python图形装配工的代码 Matlab 我稍微更改了函数,
-1
更改为-gamma
,并优化以查找gamma
代码如下所示
ydata = [-0.81704 -0.67649 -0.83137 -0.73468 -0.66744 -0.43602 0.45368...
0.75802 0.96705 0.99717 ];
xdata = [72.01 59.99 51.13 45.53 36.15 31.66 30.16 29.01 25.62 23.47 ];
sin_theta = @(alpha, beta, gamma, xdata) -gamma+2.*sqrt(alpha./xdata).*exp(beta.*(xdata-alpha).^2);
%Fitting function as function of array(x) required by lsqcurvefit
f = @(x,xdata) sin_theta(x(1),x(2), x(3),xdata);
% [alpha, beta, gamma]
x0 = [25, 0, 1] ;
options = optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt', 'FunctionTolerance', 1e-30);
[x,resnorm,residual,exitflag,output] = lsqcurvefit(f,x0,xdata,ydata,[], [], options);
% Accuracy
RMSE = sqrt(sum(residual.^2)/length(residual));
alpha = x(1); beta = x(2); gamma = x(3);
%Plotting data
data = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'ro',data,f(x,data),'b-', 'linewidth', 3)
legend('Data','Fitted exponential')
title('Data and Fitted Curve')
set(gca,'FontSize',20)
结果
alpha = 26.0582, beta = -0.0329, gamma = 0.7881 instead of 1, RMSE = 0.1498
图表
为什么
sin(θ)
不依赖于theta
?我用完全不同的软件将公布的方程拟合到这个数据集,得到了相同的结果,基于我的分析结果,我必须同意你的看法。关于这个数据集,这个方程很糟糕。
alpha = 26.0582, beta = -0.0329, gamma = 0.7881 instead of 1, RMSE = 0.1498