我有一个已知的模型,我正在尝试使其适合实际数据。

fun = @(b,x) b(1)*x(:,1)./(x(:,2).^b(2));
beta0 = [70 1.1]; % expected range is 40-130, and 1.0-1.3
[beta,r]=nlinfit(X,tmp_y,fun,beta0);

当我使用nlinfit时,它告诉我我的函数正在返回Inf的值。我深入到代码中,发现在拟合的第二次迭代中,它过度补偿了第二个beta项,使其降至-80。如果x(:,2)的值非常大,则会导致x的所有值均被零除。

我可以设置一些选项来防止这种情况发生吗?我已经阅读了文档,但是我不太了解所有选项的实际作用。

最佳答案

让我们假设您的代码中唯一的问题是,由于出现了一些零值或负值,因此值之间存在差异。在这种情况下,有一个简单的技巧可以解决此问题。而不是直接估计b(i),而是定义c(i)= ln(b(i)),这意味着b(i)= exp(c(i))。因此,在方程式中将b(i)替换为exp(c(i))。

fun = @(c,x)exp(c(1))* x(:,1)./(x(:,2)。^ exp(c(2)));

在估计c(i)之后,评估b(i)= exp(c(i))。请注意,在这种情况下,您允许c(i)具有零和负值,但b(i)始终为正。

关于matlab - Matlab nlinfit正在发散,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21911939/

10-12 23:53