forked from yuemingl/SymJava
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTransformation.java
More file actions
69 lines (59 loc) · 1.52 KB
/
Copy pathTransformation.java
File metadata and controls
69 lines (59 loc) · 1.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package symjava.math;
import java.util.HashSet;
import symjava.matrix.ExprMatrix;
import symjava.relational.Eq;
import symjava.symbolic.Expr;
import symjava.symbolic.Func;
import symjava.symbolic.Symbol;
import symjava.symbolic.utils.Utils;
/**
* Transformation is a system of equations that define the change of variables
* For example:
* x = r + s
* y = r - s
* This will change (x,y) to (r+s, r-s)
*
*/
public class Transformation {
public Eq[] eqs = null;
public Transformation(Eq ...eqs) {
for(Eq e : eqs) {
if(!(e.arg1 instanceof Symbol || e.arg1 instanceof Func))
throw new RuntimeException("The left hand side must be a symbol or function!");
}
this.eqs = eqs;
}
public Expr[] getFromVars() {
Expr[] rlt = new Expr[eqs.length];
for(int i=0; i<rlt.length; i++) {
rlt[i] = eqs[i].arg1;
}
return rlt;
}
public Expr[] getToVars() {
Expr[] rlt = new Expr[eqs.length];
HashSet<Expr> set = new HashSet<Expr>();
for(Eq e : eqs) {
Expr[] freeVars = e.getFreeVars();
for(Expr expr : freeVars)
set.add(expr);
}
rlt = set.toArray(new Expr[0]);
Utils.sortExprs(rlt);
return rlt;
}
public Expr getJacobian() {
return getJacobianMatrix().det();
}
public ExprMatrix getJacobianMatrix() {
Expr[] fromVars = this.getFromVars();
Expr[] toVars = this.getToVars();
ExprMatrix m = new ExprMatrix(fromVars.length, toVars.length);
for(int i=0; i<fromVars.length; i++) {
for(int j=0; j<toVars.length; j++) {
m.set(i, j, eqs[i].arg2.diff(toVars[j]));
}
}
return m;
}
}