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_Gnuplot_Curve Fitting_Originlab_Igor - Fatal编程技术网

Matlab 如何在实验数据上进行非线性数据拟合

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)

我有一些实验数据。因此,我需要拟合以下函数来确定其中一个变量。本程序中使用了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) = [-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