Skip to content

Commit 61faa87

Browse files
committed
add test for expm()
1 parent 1d14fba commit 61faa87

File tree

3 files changed

+190
-1
lines changed

3 files changed

+190
-1
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44
.settings/
55
/doc/
66
/target/
7-
/src/test/java/
7+
/src/tests/java/
88
/upload/

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@
3636
<version>1.1.0</version>
3737
<scope>compile</scope>
3838
</dependency>
39+
<dependency>
40+
<groupId>junit</groupId>
41+
<artifactId>junit</artifactId>
42+
<version>4.13.2</version>
43+
<scope>test</scope>
44+
</dependency>
3945
</dependencies>
4046

4147
<properties>
Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
/*
2+
* Copyright 2020, 2025 Stefan Zobel
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package net.jamu.matrix;
17+
18+
import static org.junit.Assert.assertTrue;
19+
import org.junit.Test;
20+
21+
/**
22+
* Tests for Expm
23+
*/
24+
public final class ExpmTest {
25+
26+
@Test
27+
public void testComplex() {
28+
ComplexMatrixD C = Matrices.createComplexD(2, 2);
29+
C.set(0, 0, 1.0, 0.0);
30+
C.set(1, 0, 2.0, 0.0);
31+
C.set(0, 1, -1.0, 0.0);
32+
C.set(1, 1, 3.0, 0.0);
33+
// C = i * C
34+
C = C.scaleInplace(0.0, 1.0);
35+
// C = e^C
36+
C = C.expm();
37+
38+
// expected
39+
// reference: scipy.linalg.expm()
40+
ComplexMatrixD expm = Matrices.createComplexD(2, 2);
41+
expm.set(0, 0, 4.2645929667E-01, 1.8921755097E+00);
42+
expm.set(1, 0, -2.1372148428E+00, -9.7811251808E-01);
43+
expm.set(0, 1, 1.0686074214E+00, 4.8905625904E-01);
44+
expm.set(1, 1, -1.7107555461E+00, 9.1406299158E-01);
45+
assertTrue(Matrices.approxEqual(expm, C));
46+
}
47+
48+
@Test
49+
public void testComplexZero() {
50+
ComplexMatrixD zeros = Matrices.createComplexD(3, 3);
51+
ComplexMatrixD identity = Matrices.identityComplexD(3);
52+
assertTrue(Matrices.approxEqual(identity, zeros.expm()));
53+
}
54+
55+
@Test
56+
public void testRealZero() {
57+
MatrixD zeros = Matrices.createD(3, 3);
58+
MatrixD identity = Matrices.identityD(3);
59+
assertTrue(Matrices.approxEqual(identity, zeros.expm()));
60+
}
61+
62+
@Test
63+
public void testRealMatlab() {
64+
// https://www.mathworks.com/help/matlab/ref/expm.html
65+
MatrixD A = Matrices.createD(3, 3);
66+
A.set(0, 0, 1);
67+
A.set(0, 1, 1);
68+
A.set(0, 2, 0);
69+
A.set(1, 0, 0);
70+
A.set(1, 1, 0);
71+
A.set(1, 2, 2);
72+
A.set(2, 0, 0);
73+
A.set(2, 1, 0);
74+
A.set(2, 2, -1);
75+
MatrixD eA = A.expm();
76+
77+
MatrixD expm = Matrices.createD(3, 3);
78+
expm.set(0, 0, 2.7183);
79+
expm.set(0, 1, 1.7183);
80+
expm.set(0, 2, 1.0862);
81+
expm.set(1, 0, 0.0);
82+
expm.set(1, 1, 1.0);
83+
expm.set(1, 2, 1.2642);
84+
expm.set(2, 0, 0.0);
85+
expm.set(2, 1, 0.0);
86+
expm.set(2, 2, 0.3679);
87+
assertTrue(Matrices.approxEqual(expm, eA, 1.0e-4));
88+
}
89+
90+
@Test
91+
public void testRealJuliaA1() {
92+
// A1: https://gist.github.com/sdewaele/2c176cb634280cf8a23c5970739cea0e
93+
MatrixD A1 = Matrices.createD(3, 3);
94+
A1.set(0, 0, 4);
95+
A1.set(0, 1, 2);
96+
A1.set(0, 2, 0);
97+
A1.set(1, 0, 1);
98+
A1.set(1, 1, 4);
99+
A1.set(1, 2, 1);
100+
A1.set(2, 0, 1);
101+
A1.set(2, 1, 1);
102+
A1.set(2, 2, 4);
103+
A1 = A1.transpose();
104+
MatrixD eA1 = A1.expm();
105+
106+
MatrixD expm = Matrices.createD(3, 3);
107+
expm.set(0, 0, 147.866622446369);
108+
expm.set(0, 1, 127.781085523181);
109+
expm.set(0, 2, 127.781085523182);
110+
expm.set(1, 0, 183.765138646367);
111+
expm.set(1, 1, 183.765138646366);
112+
expm.set(1, 2, 163.679601723179);
113+
expm.set(2, 0, 71.797032399996);
114+
expm.set(2, 1, 91.8825693231832);
115+
expm.set(2, 2, 111.968106246371);
116+
assertTrue(Matrices.approxEqual(expm, eA1));
117+
}
118+
119+
@Test
120+
public void testRealJuliaA3() {
121+
// A3: https://gist.github.com/sdewaele/2c176cb634280cf8a23c5970739cea0e
122+
MatrixD A3 = Matrices.createD(3, 3);
123+
A3.set(0, 0, -131);
124+
A3.set(0, 1, 19);
125+
A3.set(0, 2, 18);
126+
A3.set(1, 0, -390);
127+
A3.set(1, 1, 56);
128+
A3.set(1, 2, 54);
129+
A3.set(2, 0, -387);
130+
A3.set(2, 1, 57);
131+
A3.set(2, 2, 52);
132+
A3 = A3.transpose();
133+
MatrixD eA3 = A3.expm();
134+
135+
MatrixD expm = Matrices.createD(3, 3);
136+
expm.set(0, 0, -1.50964415879218);
137+
expm.set(0, 1, -5.6325707998812);
138+
expm.set(0, 2, -4.934938326092);
139+
expm.set(1, 0, 0.367879439109187);
140+
expm.set(1, 1, 1.47151775849686);
141+
expm.set(1, 2, 1.10363831732856);
142+
expm.set(2, 0, 0.135335281175235);
143+
expm.set(2, 1, 0.406005843524598);
144+
expm.set(2, 2, 0.541341126763207);
145+
assertTrue(Matrices.approxEqual(expm, eA3));
146+
}
147+
148+
@Test
149+
public void testRealJuliaA4() {
150+
// A4: https://gist.github.com/sdewaele/2c176cb634280cf8a23c5970739cea0e
151+
MatrixD A4 = Matrices.createD(2, 2);
152+
A4.set(0, 0, 0.25);
153+
A4.set(0, 1, 0.25);
154+
A4.set(1, 0, 0);
155+
A4.set(1, 1, 0);
156+
MatrixD eA4 = A4.expm();
157+
158+
MatrixD expm = Matrices.createD(2, 2);
159+
expm.set(0, 0, 1.2840254166877416);
160+
expm.set(0, 1, 0.2840254166877415);
161+
expm.set(1, 0, 0.0);
162+
expm.set(1, 1, 1.0);
163+
assertTrue(Matrices.approxEqual(expm, eA4));
164+
}
165+
166+
@Test
167+
public void testRealJuliaA5() {
168+
// A5: https://gist.github.com/sdewaele/2c176cb634280cf8a23c5970739cea0e
169+
MatrixD A5 = Matrices.createD(2, 2);
170+
A5.set(0, 0, 0);
171+
A5.set(0, 1, 0.02);
172+
A5.set(1, 0, 0);
173+
A5.set(1, 1, 0);
174+
MatrixD eA5 = A5.expm();
175+
176+
MatrixD expm = Matrices.createD(2, 2);
177+
expm.set(0, 0, 1.0);
178+
expm.set(0, 1, 0.02);
179+
expm.set(1, 0, 0.0);
180+
expm.set(1, 1, 1.0);
181+
assertTrue(Matrices.approxEqual(expm, eA5));
182+
}
183+
}

0 commit comments

Comments
 (0)