/** * @param y data * @param k parameter giving the length 2 * k + 1 of the averaging interval * @param l oder of the averaging polynomial * @param p probability defining confidence limits */ public TimeSeries(double[] y, int k, int l, double p) { this.y = y; this.k = k; this.l = l; this.p = p; n = y.length; eta = new double[n + 2 * k]; coneta = new double[n + 2 * k]; // quantile of Student's distribution pprime = 0.5 * (p + 1.); nf = 2 * k - l; talpha = StatFunct.quantileStudent(pprime, nf); // compute matrices depending on k and l k21 = 2 * k + 1; l1 = l + 1; a = new DatanMatrix(k21, l1); for (int i = 0; i < k21; i++) { for (int j = 0; j < l1; j++) { if (j == 0) a.setElement(i, j, -1.); else a.setElement(i, j, a.getElement(i, j - 1) * (double) (i - k)); } } ata1 = a.multiplyTransposedWith(a); ata1.choleskyInversion(); ata1at = ata1.multiplyWithTransposed(a); ata1at = ata1at.multiply(-1.); // moving averages and confidence limits for inner part ymat = new DatanMatrix(y); for (int i = 2 * k; i < n; i++) { ytmp = ymat.getSubmatrix(k21, 1, i - 2 * k, 0); x = ata1at.multiply(ytmp); eta[i] = x.getElement(0, 0); etatmp = a.multiply(x); etatmp = etatmp.add(ytmp); sy2 = etatmp.multiplyTransposedWith(etatmp); double s = sy2.getElement(0, 0) / (double) nf; double a0 = Math.sqrt(Math.abs(ata1.getElement(0, 0))); coneta[i] = a0 * Math.sqrt(s) * talpha; // moving averages and confidence limits for end sections if (i == 2 * k || i == n - 1) { tt = new double[l + 1]; if (i == 2 * k) { iadd = 2 * k; is = -1; } else { iadd = n - 1; is = 1; } for (int i1 = 1; i1 <= 2 * k; i1++) { j = is * i1; for (int i2 = 0; i2 < l + 1; i2++) { for (int i3 = 0; i3 <= i2; i3++) { if (i3 == 0) tt[i2] = 1.; else tt[i2] = tt[i2] * (double) j; } } tmat = new DatanMatrix(tt); seta2 = tmat.multiplyTransposedWith(ata1.multiply(tmat)); double se2 = s * seta2.getElement(0, 0); etai = tmat.multiplyTransposedWith(x); eta[iadd + j] = etai.getElement(0, 0); coneta[iadd + j] = Math.sqrt(Math.abs(se2)) * talpha; } } } }
protected void compute() { n = (int) ni[0].parseInput(); t0 = ni[1].parseInput(); deltat = ni[2].parseInput(); x1 = ni[3].parseInput(); x2 = ni[4].parseInput(); sigma = ni[5].parseInput(); // generate data points t = new DatanVector(n); y = new DatanVector(n); dy = new DatanVector(n); rand = DatanRandom.standardNormal(n); for (int i = 0; i < n; i++) { t.setElement(i, t0 + (double) i * deltat); y.setElement(i, x1 * Math.pow(t.getElement(i), x2) + sigma * rand[i]); dy.setElement(i, sigma); } // find 1st approximation of unknowns by method of log-log plot tlog = new double[n]; ylog = new double[n]; dellog = new double[n]; int npos = 0; for (int i = 0; i < n; i++) { if (t.getElement(i) > 0. && y.getElement(i) > 0.) { tlog[npos] = Math.log(t.getElement(i)); ylog[npos] = Math.log(y.getElement(i)); dellog[npos] = 1.; npos++; } } DatanVector vtlog = new DatanVector(npos); DatanVector vylog = new DatanVector(npos); DatanVector vdellog = new DatanVector(npos); for (int j = 0; j < npos; j++) { vtlog.setElement(j, tlog[j]); vylog.setElement(j, ylog[j]); vdellog.setElement(j, dellog[j]); } LsqPol lp = new LsqPol(vtlog, vylog, vdellog, 2); x = lp.getResult(); x.setElement(0, Math.exp(x.getElement(0))); df.writeLine(" x = " + x.toString()); // perform fit int[] list = {1, 1}; powerlaw = new Powerlaw(); LsqNon ln = new LsqNon(t, y, dy, x, list, powerlaw); x = ln.getResult(); x1 = x.getElement(0); x2 = x.getElement(1); cov = ln.getCovarianceMatrix(); delx1 = Math.sqrt(cov.getElement(0, 0)); delx2 = Math.sqrt(cov.getElement(1, 1)); rho = cov.getElement(1, 0) / (delx1 * delx2); m = ln.getChiSquare(); p = 1. - StatFunct.cumulativeChiSquared(m, n - 1); // curve of fitted exponential xpl = new double[1001]; ypl = new double[1001]; dpl = (double) (n - 1) * deltat / 1000.; for (int i = 0; i < 1001; i++) { xpl[i] = t0 + (double) i * dpl; ypl[i] = x1 * Math.pow(xpl[i], x2); } // prepare data points for plotting datx = new double[n]; daty = new double[n]; datsx = new double[n]; datsy = new double[n]; datrho = new double[n]; for (int i = 0; i < n; i++) { datx[i] = t.getElement(i); daty[i] = y.getElement(i); datsx[i] = 0.; datsy[i] = dy.getElement(i); datrho[i] = 0.; } // display data and fitted curve caption = "x_1#=" + String.format(Locale.US, "%5.2f", x1) + ", x_2#=" + String.format(Locale.US, "%5.2f", x2) + ", &D@x_1#=" + String.format(Locale.US, "%5.2f", delx1) + ", &D@x_2#=" + String.format(Locale.US, "%5.2f", delx2) + ", &r@=" + String.format(Locale.US, "%5.2f", rho) + ", M=" + String.format(Locale.US, "%5.2f", m) + ", P=" + String.format(Locale.US, "%6.4f", p); new GraphicsWithDataPointsAndPolyline( getClass().getName(), "", xpl, ypl, 1, .3, datx, daty, datsx, datsy, datrho, "t", "y", caption); }