root/applications/pmsm/simulator_zdenek/test_Ch.cpp @ 1466

Revision 1466, 4.3 kB (checked in by smidl, 12 years ago)

opraven test Ch

Line 
1#include "ekf_example/matrix_vs.h"
2#include "ekf_example/ekf_obj.h"
3int main(){
4        int i;
5        mat A = 0.99*eye(5);
6        A(0,3) = 0.06;
7        A(0,2) = 0.01;
8        A(1,2) = 0.01;
9        A(1,3) = -0.07;
10        A(3,2) = 0.0001;
11
12//      RNG_randomize();
13       
14        mat U=eye(5);
15        for (int i=0; i<5;i++) {
16                for (int j=i+1; j<5;j++) U(i,j)=2*randu(1)(0)-1;
17        }
18        mat Q = 0.1*diag(vec(" 0.2000 0.3000 0.4000 0.5000 0.6"));
19        vec R = vec(" 0.2000 0.3000");
20       
21                vec D = randu(5)*0.9;
22                vec xref = ones(5);
23
24                mat Ch = U*diag(sqrt(D));
25               
26                int16 PSI[25];
27                int16 PSICh[25]={0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0};
28                int16 Chf[25]={0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0};
29                int16 Cf[10]={0,0,0,0,0, 0,0,0,0,0};
30                int16 multip=(1<<15)-1;
31               
32        /////////// COPY
33        imat Af=round_i(A*multip);
34        mat_to_int16(Af, PSI);
35        mat_to_int16(round_i(Ch*multip),Chf);           
36        int16 Qf[25];
37        mat_to_int16(round_i(sqrt(Q)*multip), Qf);
38        int16 Rf[2];
39        vec_to_int16(round_i(R*multip), Rf);
40       
41       
42        ////////////// Test mmultAU
43        mmultACh(PSI,Chf,PSICh,5,5);   
44       
45        mat PhiCh =round(A*32768)*round(Ch*32768)/32768/32768; 
46        imat PChcmp;
47        int16_to_mat(PSICh,PChcmp,5,5);
48        cout << "Psi: " << round_i(PhiCh*multip) <<endl;
49        cout << "PSI fix: " << PChcmp <<endl;
50        cout << "Delta PSI: " << round_i(PhiCh*multip-PChcmp) <<endl;
51       
52        mat_to_int16(round_i(PhiCh*multip),PSICh); //<< make is same
53
54        mat PhiU= A*U;
55/////////// Test Thorton:
56        int dim=5;double sigma; int j,k; 
57        vec Din = D;
58        mat G=eye(5);
59        for (i=dim-1; i>=0;i--){
60                sigma = 0.0; 
61                for (j=0; j<dim; j++) {
62                        sigma += PhiU(i,j)*PhiU(i,j) *Din(j); 
63                        sigma += G(i,j)*G(i,j) * Q(j,j); 
64                }
65                D(i) = sigma; 
66                for (j=0;j<i;j++){ 
67                        sigma = 0.0; 
68                        for (k=0;k<dim;k++){ 
69                                sigma += PhiU(i,k)*Din(k)*PhiU(j,k); 
70                        }
71                        for (k=0;k<dim;k++){ 
72                                sigma += G(i,k)*Q(k,k)*G(j,k); 
73                        }
74                        //
75                        U(j,i) = sigma/D(i); 
76                        for (k=0;k<dim;k++){ 
77                                PhiU(j,k) = PhiU(j,k) - U(j,i)*PhiU(i,k); 
78                        }
79                        for (k=0;k<dim;k++){ 
80                                G(j,k) = G(j,k) - U(j,i)*G(i,k); 
81                        }
82                }
83        }
84
85imat M55(5,5);
86int16_to_mat(PSICh,M55,5,5);
87cout << "PSICh: " << M55 << endl;
88int16_to_mat(Qf,M55,5,5);
89cout << "Qf: " << M55 << endl;
90
91Ch = U*diag(sqrt(D));
92
93       
94        householder(PSICh,Qf,5);
95//      givens(PSICh,Qf,5);
96
97        /////// disp
98       
99        cout << endl<<"after householder " <<endl;
100
101        imat Chcmp;
102        int16_to_mat(PSICh,Chcmp,5,5);
103        cout << "Ch(UD): " << round_i(Ch*multip) << endl;
104        cout << "Ch: " << (Chcmp) << endl;
105        cout << "Delta Ch: " << round_i(Ch*multip-Chcmp) << endl;
106       
107        // synchronize
108        vec d=diag(Ch*Ch.T());
109        mat Ch2 = 0.9*diag(1./sqrt(d))*Ch;
110        mat_to_int16(round_i(Ch2*multip),Chf);         
111
112        D = pow(diag(Ch2),2);
113        U = sqrt(diag(1./D));
114        U = Ch2*U;
115               
116        vec     ydif = 2*randu(2)-1;
117        vec     xp = 2*randu(5)-1;
118       
119        int16 difz[2];
120        vec_to_int16(round_i(ydif*multip), difz);
121        int16 xf[5];
122        vec_to_int16(round_i(xp*multip), xf);
123
124        cout << "x: "<< round_i(xp*multip) <<endl;
125        cout << "xf: "; for (i=0; i<5;i++) cout << xf[i] << ","; cout << endl;
126       
127       
128        int16 xf_old[5];
129        for (int i=0; i<5;i++) xf_old[i]=xf[i];
130       
131        /////// Test bierman
132        double dz,alpha,gamma,beta,lambda;
133        vec a;
134        vec b;
135        mat C = zeros(2,5);
136        C(0,0)=.2;C(1,1)=0.4;C(0,1)=0.3;
137       
138        for (int iy=0; iy<2; iy++){
139                a     = U.T()*C.get_row(iy);    // a is not modified, but
140                b     = elem_mult(D,a);                          // b is modified to become unscaled Kalman gain.
141                dz    = ydif(iy); 
142               
143                alpha = R(iy); 
144                gamma = 1/alpha; 
145                for (j=0;j<dim;j++){
146                        beta   = alpha; 
147                        alpha  = alpha + a(j)*b(j); 
148                        lambda = -a(j)*gamma; 
149                        gamma  = 1.0/alpha; 
150                        D(j) = beta*gamma*D(j); 
151                       
152                        //                      cout << "a: " << alpha << "g: " << gamma << endl;
153                        for (i=0;i<j;i++){
154                                beta   = U(i,j); 
155                                U(i,j) = beta + b(i)*lambda; 
156                                b(i)   = b(i) + b(j)*beta; 
157                        }
158                }
159                double dzs = gamma*dz;  // apply scaling to innovations
160                xp   = xp + dzs*b; // multiply by unscaled Kalman gain
161               
162                //cout << "Ub: " << U << endl;
163                //cout << "Db: " << D << endl <<endl;
164               
165        }
166       
167        Ch = U*diag(sqrt(D));
168        mat_to_int16(round_i(C*multip),Cf);             
169
170        int16_to_mat(Chf,M55,5,5);
171        cout << "bef Carlson: " << M55 << endl;
172
173        int16 detS, rem;
174        carlson_fastC(difz,xf, Chf, Cf,Rf, 2, 5, &detS, &rem);
175       
176        cout << endl<<"after Carlson" <<endl;
177        cout << "x: "<< round_i(xp*multip) <<endl;
178        cout << "xf: "; for (i=0; i<5;i++) cout << xf[i] << ","; cout << endl;
179
180        {
181                imat Chcmp;
182                int16_to_mat(Chf,Chcmp,5,5);
183                cout << "Ch: " << round_i(Ch*multip) << endl;
184                cout << "Ch fix: " << Chcmp << endl;
185                cout << "Delta Ch: " << round_i(Ch*multip-Chcmp) << endl;
186        }
187       
188return 0;       
189}
Note: See TracBrowser for help on using the browser.