expm function problem for stiff matrix
10 ビュー (過去 30 日間)
古いコメントを表示
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?
5 件のコメント
採用された回答
Shadaab Siddiqie
2021 年 6 月 18 日
From my understanding you are getting wrong result for certain cases wile using expm function. This issue has been forwarded to the development team for further investigation.
その他の回答 (2 件)
Bobby Cheng
2021 年 8 月 12 日
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 件のコメント
Fangcheng Huang
2022 年 6 月 1 日
編集済み: Fangcheng Huang
2022 年 6 月 1 日
last line, Strange, when use matlab2022 it is right, but when use matlab 2020a, need to change Q*diag(exp(diag(T)))*Q'
Noorolhuda wyal
2022 年 11 月 22 日
a = -1e20;
b = eps;
c = 1;
A = [a,0,b;0,c,0;-b,0,a];
B=vpa(A);
expmA=expm(B)
0 件のコメント
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!