How to calculate expm of a badly scaled matrix?

7 Ansichten (letzte 30 Tage)
alex corno
alex corno am 4 Jun. 2013
I'm using expm for a matrix with big and small coefficients and I get NaN in the result. Is there a method to get the good matrix exponential even if the matrix is badly scaled? Normally there is a exponential for every matrix.
ALEX
  2 Kommentare
Matt J
Matt J am 4 Jun. 2013
Bearbeitet: Matt J am 4 Jun. 2013
Suppose you had a simple badly scaled matrix like
>> A=diag( [1e6,1] )
A =
1000000 0
0 1
What would you like the result of expm(A) to be? The following has no NaNs. Would it be an okay answer?
>> expmA=diag( exp([1e6,1]) )
expmA =
Inf 0
0 2.7183
alex corno
alex corno am 4 Jun. 2013
I think I have a different problem. My matrix isn't even invertible, there are two zero lines, moreover there are some coefficients that are of order of 1e6. In my opinion at some point Matlab is doing some inversion that's why expm doesn't work properly with badly scaled matrices. In my problem I changed the units of physical parameters (distance -> µm Stresses -> kPa) and now it works. But I'm looking for some existent function (transformation) which would enable to calculate expm for any matrix (apart for huge numbers that shouldn't appear in a physical problem there's no chance that e^100 will be a coefficient in a transfer matrix)
Alexandru

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Richard Brown
Richard Brown am 5 Jun. 2013
In particular, have you tried the alternative versions expmdemo1 and expmdemo3 ?

Weitere Antworten (2)

Matt J
Matt J am 4 Jun. 2013
Bearbeitet: Matt J am 4 Jun. 2013
I think I have a different problem. My matrix isn't even invertible, there are two zero lines, moreover there are some coefficients that are of order of 1e6. In my opinion at some point Matlab is doing some inversion that's why expm doesn't work properly with badly scaled matrices.
No, it's not an invertibility issue. The reason for the NaNs is the big 1e6 order numbers. Below is an example of a non-invertible matrix on which EXPM works fine.
>> expm(diag([1,0]))
ans =
2.7183 0
0 1.0000
  3 Kommentare
alex corno
alex corno am 4 Jun. 2013
Yes, OK but is there a way in Matlab(a transformation or something) to get expm even if the matrix is badly scaled? In my case I just changed the units of my unknowns but is there a better method?
Matt J
Matt J am 4 Jun. 2013
Bearbeitet: Matt J am 4 Jun. 2013
Even if the matrix is well-scaled, you could have the same problem, for example:
>> A=diag([1e6,1e6]); %a well-scaled matrix
>> expm(A)
ans =
NaN NaN
NaN NaN
The bottom line is, you must avoid matrices with large eigenvalues, and then things should be fine. Otherwise, they will not be fine.
There are any number of transformations you could consider to reduce the magnitude of the eigenvalues. Dividing the matrix by a large number is one way, but I can't know if that suits your application.

Melden Sie sich an, um zu kommentieren.


alex corno
alex corno am 5 Jun. 2013
Thank you for your help. I think the function balance() is what I was looking for.
Alexandru

Kategorien

Mehr zu Mathematics finden Sie in Help Center und File Exchange

Produkte

Community Treasure Hunt

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

Start Hunting!

Translated by