[2052] | 1 |
|
---|
| 2 | #include <cmath>
|
---|
| 3 |
|
---|
| 4 | #include "bancroft.h"
|
---|
| 5 | #include "bncconst.h"
|
---|
| 6 |
|
---|
| 7 | void bancroft(const Matrix& BBpass, ColumnVector& pos) {
|
---|
| 8 |
|
---|
| 9 | if (pos.Nrows() != 4) {
|
---|
| 10 | pos.ReSize(4);
|
---|
| 11 | }
|
---|
| 12 | pos = 0.0;
|
---|
| 13 |
|
---|
| 14 | for (int iter = 1; iter <= 2; iter++) {
|
---|
| 15 | Matrix BB = BBpass;
|
---|
| 16 | int mm = BB.Nrows();
|
---|
| 17 | for (int ii = 1; ii <= mm; ii++) {
|
---|
| 18 | double xx = BB(ii,1);
|
---|
| 19 | double yy = BB(ii,2);
|
---|
| 20 | double traveltime = 0.072;
|
---|
| 21 | if (iter > 1) {
|
---|
| 22 | double zz = BB(ii,3);
|
---|
| 23 | double rho = sqrt( (xx-pos(1)) * (xx-pos(1)) +
|
---|
| 24 | (yy-pos(2)) * (yy-pos(2)) +
|
---|
| 25 | (zz-pos(3)) * (zz-pos(3)) );
|
---|
| 26 | traveltime = rho / t_CST::c;
|
---|
| 27 | }
|
---|
| 28 | double angle = traveltime * t_CST::omega;
|
---|
| 29 | double cosa = cos(angle);
|
---|
| 30 | double sina = sin(angle);
|
---|
| 31 | BB(ii,1) = cosa * xx + sina * yy;
|
---|
| 32 | BB(ii,2) = -sina * xx + cosa * yy;
|
---|
| 33 | }
|
---|
| 34 |
|
---|
| 35 | Matrix BBB;
|
---|
| 36 | if (mm > 4) {
|
---|
| 37 | SymmetricMatrix hlp; hlp << BB.t() * BB;
|
---|
| 38 | BBB = hlp.i() * BB.t();
|
---|
| 39 | }
|
---|
| 40 | else {
|
---|
| 41 | BBB = BB.i();
|
---|
| 42 | }
|
---|
| 43 | ColumnVector ee(mm); ee = 1.0;
|
---|
| 44 | ColumnVector alpha(mm); alpha = 0.0;
|
---|
| 45 | for (int ii = 1; ii <= mm; ii++) {
|
---|
| 46 | alpha(ii) = lorentz(BB.Row(ii).t(),BB.Row(ii).t())/2.0;
|
---|
| 47 | }
|
---|
| 48 | ColumnVector BBBe = BBB * ee;
|
---|
| 49 | ColumnVector BBBalpha = BBB * alpha;
|
---|
| 50 | double aa = lorentz(BBBe, BBBe);
|
---|
| 51 | double bb = lorentz(BBBe, BBBalpha)-1;
|
---|
| 52 | double cc = lorentz(BBBalpha, BBBalpha);
|
---|
| 53 | double root = sqrt(bb*bb-aa*cc);
|
---|
| 54 |
|
---|
| 55 | Matrix hlpPos(4,2);
|
---|
| 56 | hlpPos.Column(1) = (-bb-root)/aa * BBBe + BBBalpha;
|
---|
| 57 | hlpPos.Column(2) = (-bb+root)/aa * BBBe + BBBalpha;
|
---|
| 58 |
|
---|
| 59 | ColumnVector omc(2);
|
---|
| 60 | for (int pp = 1; pp <= 2; pp++) {
|
---|
| 61 | hlpPos(4,pp) = -hlpPos(4,pp);
|
---|
| 62 | omc(pp) = BB(1,4) -
|
---|
| 63 | sqrt( (BB(1,1)-hlpPos(1,pp)) * (BB(1,1)-hlpPos(1,pp)) +
|
---|
| 64 | (BB(1,2)-hlpPos(2,pp)) * (BB(1,2)-hlpPos(2,pp)) +
|
---|
| 65 | (BB(1,3)-hlpPos(3,pp)) * (BB(1,3)-hlpPos(3,pp)) ) -
|
---|
| 66 | hlpPos(4,pp);
|
---|
| 67 | }
|
---|
| 68 | if ( fabs(omc(1)) > fabs(omc(2)) ) {
|
---|
| 69 | pos = hlpPos.Column(2);
|
---|
| 70 | }
|
---|
| 71 | else {
|
---|
| 72 | pos = hlpPos.Column(1);
|
---|
| 73 | }
|
---|
| 74 | }
|
---|
| 75 | }
|
---|
| 76 |
|
---|
| 77 | double lorentz(const ColumnVector& aa, const ColumnVector& bb) {
|
---|
| 78 | return aa(1)*bb(1) + aa(2)*bb(2) + aa(3)*bb(3) - aa(4)*bb(4);
|
---|
| 79 | }
|
---|