Matlab 如何在非线性数据拟合中使用积分:先使用Fsumsquares,然后使用FMINUC进行参数优化
我可以运行任何方程式的代码,但当我引入积分时,命令将无法运行:Matlab 如何在非线性数据拟合中使用积分:先使用Fsumsquares,然后使用FMINUC进行参数优化,matlab,integral,non-linear,Matlab,Integral,Non Linear,我可以运行任何方程式的代码,但当我引入积分时,命令将无法运行: t=dataset_TK1(:,1); dataset_TK4=xlsread('Akis','Sheet1','AG491:AR725'); y_4=dataset_TK4(:,12); Kg=1.76717865712934; N0=1.08E+05; fun1=@(Z) Z^(-1+(X(1)-Kg)/X(3))*exp(Z); Ntotal=@(X,t)integral(fun1,X(2)*exp(-X(3)*
t=dataset_TK1(:,1);
dataset_TK4=xlsread('Akis','Sheet1','AG491:AR725');
y_4=dataset_TK4(:,12);
Kg=1.76717865712934;
N0=1.08E+05;
fun1=@(Z) Z^(-1+(X(1)-Kg)/X(3))*exp(Z);
Ntotal=@(X,t)integral(fun1,X(2)*exp(-X(3)*t),X(2));
X0=[10,10,10];
Fsumsquares=@(X)sum((Ntotal(X,t)-y_4).^2);
opts = optimoptions('fminunc','Algorithm','quasi-newton');
[xunc,ressquared,eflag,outputu] = fminunc(Fsumsquares,X0,opts)
有什么建议吗
谢谢下面的MWE(最小工作示例)代码可以工作,从某种意义上说,它不会引发错误:为了获得它,我用虚拟数组替换了您的excel数据
我限制自己从代码段中的函数中删除不必要的句柄,并在fun1
中将运算符调整为按元素的^
和*
。
此外,在Ntotal
积分中,极限应该是标量,而不是向量。这就是为什么我只从t
中取出一个元素的原因:
% dummies, put your data back
t=ones(1,10);
y_4=[1,2,3,4,5,6,7,8,9,10];
X=[11,3,4,6,2,3,55,22,89,6];
Kg=1.76717865712934;
N0=1.08E+05;
fun1=@(Z) Z.^(-1+(X(1)-Kg)/X(3)).*exp(Z); % changed
Ntotal=integral(fun1,X(2)*exp(-X(3)*t(1)),X(2)); % changed
X0=[10,10,10];
Fsumsquares=@(X) sum((Ntotal-y_4).^2); % changed
opts = optimoptions('fminunc','Algorithm','quasi-newton');
[xunc,ressquared,eflag,outputu] = fminunc(Fsumsquares,X0,opts)
我想积分的极限应该是标量,不能用函数在运行时计算。
fun1
应该是fun1=@(X,Z)
也许?你的代码缺少X
把手下只有Z
,但我必须记录每个时间点。是否有建议的方法?fun1
中的X(1)
和X(3)
,但是X
没有定义,至少没有在您的代码段中定义。t
也在Ntotal
的句柄中,但也在代码段的第一行中定义X
没有定义,而是与t
一样处理Ntotal
在Fsumsquares
中调用时定义了其参数,而fun1
在Ntotal
调用时没有定义参数。我认为函数参数应该一视同仁。