Calculating covariance matrix from Jacobian using lsqcurvefit

44 ビュー (過去 30 日間)
Wolfgang Klassen
Wolfgang Klassen 2019 年 6 月 4 日
コメント済み: Alan Weiss 2020 年 4 月 29 日
I am trying to calculate the covariance matrix from the residuals vector and the Jacobian matrix, which are optional outputs of the lsqcurvefit function. I keep getting negative values for the diagonal (variance) values, but they should be strictly positive. Does this have something to do with the method that lsqcurvefit uses? I have attached sample data and a sample extPar structure (this usually gets generated other peices of code that call this function). The part of the code that I think is germane is here:
[par,resnorm,R,~,~,~,J] = lsqcurvefit(FID,par0,fitTime,fitData);
pCov = inv(J'*J)*((R'*R)./(numel(fitData) - numel(par)));
The fit function converges to a nice looking solution, am I doing something drastically wrong here?
I am fully aware that the statistics toolbox solves this easily, but unless you give my prof the cash to buy it for me, I'm stuck with this.
  1 件のコメント
David Wilson
David Wilson 2019 年 6 月 5 日
編集済み: David Wilson 2019 年 6 月 5 日
Your analysis looks reasonable. The matrix J'*J is positive definite by definition, and so is its inverse. R'*R will be positive and so is nu = n-m. However numerical ill-conditioning could be the problem. Check the eigenvalues of inv(J'*J), they should be all +ve (or zero). What is the condition # or rcond of J'*J ?
Of course there are square root methods (SVD etc) to do this that avoid the possible ill-conditioning.

サインインしてコメントする。

採用された回答

Alan Weiss
Alan Weiss 2019 年 6 月 6 日
This old documentation example might be of some use.
Alan Weiss
MATLAB mathematical toolbox documentation
  4 件のコメント
Samuel Grauer
Samuel Grauer 2020 年 4 月 29 日
This documentation link appears to be broken. What was the solution?
Alan Weiss
Alan Weiss 2020 年 4 月 29 日
The documentation link is now broken permanently. Sorry. I think that I am not supposed to post the information, which was removed from the doc purposefully.
Alan Weiss
MATLAB mathematical toolbox documentation

サインインしてコメントする。

その他の回答 (1 件)

Matt J
Matt J 2019 年 6 月 5 日
編集済み: Matt J 2019 年 6 月 5 日
J'*J is only guaranteed to be positive semi-definite, which means some of the diagonals can be zero in ideal math. However, computers do not perform ideal math. Due to numerical precision limitations, the calculation can have small inaccuracies and give you slighly negative values in diagonals that are supposed to be zero.

カテゴリ

Help Center および File ExchangeMathematics and Optimization についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by