【问题标题】:How to use integration in Nonlinear Data-Fitting: Fsumsquares and then fminunc for parameter optimization如何在非线性数据拟合中使用积分:Fsumsquares 和 fminunc 进行参数优化
【发布时间】:2021-01-17 16:13:22
【问题描述】:

我可以运行任何方程的代码,但是当我引入积分时,命令将无法运行:

    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)

有什么建议吗?

谢谢

【问题讨论】:

  • 我想积分的极限应该是标量,不能用函数计算运行时。
  • fun1 应该是 fun1 = @(X,Z) 可能吗?您的代码缺少X,句柄下只有Z
  • 但我必须及时记录每个时间点。有建议的方法吗?
  • X(1)X(3)fun1 中,但 X 没有定义,至少在你的代码 sn-p 中没有。
  • 而且tNtotal的句柄中,但也在代码sn-p的第一行定义。 X 没有被定义,而是与t 相同。 NtotalFsumsquares 中调用时定义了其参数,而fun1Ntotal 调用时没有定义参数。我认为函数参数都应该一视同仁。

标签: matlab integral non-linear


【解决方案1】:

下面的 MWE(最小工作示例)代码有效,从某种意义上说它不会引发错误:为了获得它,我用虚拟数组替换了您的 excel 数据。

我限制自己从您的 sn-p 函数中删除不必要的句柄,并将运算符调整为元素方面的 .^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)

【讨论】:

    猜你喜欢
    • 2018-11-07
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多