expm function problem for stiff matrix
Mostrar comentarios más antiguos
For very specific matrix A:
a = -1e20;
b = eps;
c = 1;
A = [a,0,b;0,c,0;-b,0,a];
disp('A:'), disp(num2str(A))
A:
-1e+20 0 2.220446049250313e-16
0 1 0
-2.220446049250313e-16 0 -1e+20
is known exact matrix exponential as:
expA = exp(a)*( ...
[1,0,0;0,0,0;0,0,1]*cos(b)+ ...
[0,0,1;0,0,0;-1,0,0]*sin(b))+ ...
[0,0,0;0,exp(c),0;0,0,0];
expA =
0 0 0
0 2.7183 0
0 0 0
the Matlab function expm give wrong result:
expm(A)
ans =
0 0 0
0 1 0
0 0 0
but direct computing of expm(A) via definition gives again right result:
[V,D] = eig(A);
expmA = V*diag(exp(diag(D)))/V
expmA =
0 0 0
0 2.7183 0
0 0 0
So, what is wrong with expm function? Bad implementation of Pade's approximation?
Respuesta aceptada
Más respuestas (2)
Bobby Cheng
el 12 de Ag. de 2021
This is a weakness of the scaling and squaring algorithm. Inside EXPM, which you can read the implementation, there are special treatments for diagonal to deal with extreme cases, but it is only triggered if the input is of the Schur form due to performance. You can call SCHUR to create the Schur factorization, and pass the Schur form to EXPM to trigger the special diagonal treatment.
>> a = -1e20;
>> b = eps;
>> c = 1;
>> A = [a,0,b;0,c,0;-b,0,a];
>> [Q T] = schur(A);
>> Q*expm(T)*Q'
ans =
0 0 0
0 2.7183 0
0 0 0
1 comentario
Fangcheng Huang
el 1 de Jun. de 2022
Editada: Fangcheng Huang
el 1 de Jun. de 2022
last line, Strange, when use matlab2022 it is right, but when use matlab 2020a, need to change Q*diag(exp(diag(T)))*Q'
a = -1e20;
b = eps;
c = 1;
A = [a,0,b;0,c,0;-b,0,a];
B=vpa(A);
expmA=expm(B)
Categorías
Más información sobre Linear Algebra en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
