public double getValue(DatanVector x) { double result; double a = sqrt2pi * x.getElement(1); if (a < small) f = big; else f = Math.log(a); result = (double) y.length * f; for (int i = 0; i < y.length; i++) { f = Math.pow((y[i] - x.getElement(0)), 2.) / (2. * x.getElement(1) * x.getElement(1)); result += f; } return result; }
protected void plotScatterDiagram() { // plot sample as one dimensional scatter plot and Gaussian double xmax = 5.; double xmin = -5.; DatanGraphics.openWorkstation(getClass().getName(), "E3Min_1.ps"); DatanGraphics.setFormat(0., 0.); DatanGraphics.setWindowInComputingCoordinates(xmin, xmax, 0., .5); DatanGraphics.setViewportInWorldCoordinates(-.15, .9, .16, .86); DatanGraphics.setWindowInWorldCoordinates(-.414, 1., 0., 1.); DatanGraphics.setBigClippingWindow(); DatanGraphics.chooseColor(2); DatanGraphics.drawFrame(); DatanGraphics.drawScaleX("y"); DatanGraphics.drawScaleY("f(y)"); DatanGraphics.drawBoundary(); double xpl[] = new double[2]; double ypl[] = new double[2]; // plot scatter diagram DatanGraphics.chooseColor(1); for (int i = 0; i < y.length; i++) { xpl[0] = y[i]; xpl[1] = y[i]; ypl[0] = 0.; ypl[0] = .1; DatanGraphics.drawPolyline(xpl, ypl); } // draw Gaussian corresponding to solution int npl = 100; xpl = new double[npl]; ypl = new double[npl]; double fact = 1. / (Math.sqrt(2. * Math.PI) * x.getElement(1)); double dpl = (xmax - xmin) / (double) (npl - 1); for (int i = 0; i < npl; i++) { xpl[i] = xmin + (double) i * dpl; ypl[i] = fact * Math.exp(-.5 * Math.pow((xpl[i] - x.getElement(0)) / x.getElement(1), 2.)); } DatanGraphics.chooseColor(5); DatanGraphics.drawPolyline(xpl, ypl); // draw caption String sn = "N = " + nny; numForm.setMaximumFractionDigits(3); numForm.setMinimumFractionDigits(3); String sx1 = ", x_1# = " + numForm.format(x.getElement(0)); String sx2 = ", x_2# = " + numForm.format(x.getElement(1)); String sdx1 = ", &D@x_1# = " + numForm.format(Math.sqrt(cx.getElement(0, 0))); String sdx2 = ", &D@x_2# = " + numForm.format(Math.sqrt(cx.getElement(1, 1))); caption = sn + sx1 + sx2 + sdx1 + sdx2; DatanGraphics.setBigClippingWindow(); DatanGraphics.chooseColor(2); DatanGraphics.drawCaption(1., caption); DatanGraphics.closeWorkstation(); }
private class MinLogLikeGauss extends DatanUserFunction { double[] y; double sqrt2pi = Math.sqrt(2. * Math.PI); double big = 1.E10, small = 1.E-10; double f; MinLogLikeGauss(double[] y) { this.y = y; } public double getValue(DatanVector x) { double result; double a = sqrt2pi * x.getElement(1); if (a < small) f = big; else f = Math.log(a); result = (double) y.length * f; for (int i = 0; i < y.length; i++) { f = Math.pow((y[i] - x.getElement(0)), 2.) / (2. * x.getElement(1) * x.getElement(1)); result += f; } return result; } }
protected void plotParameterPlane() { double x1 = x.getElement(0); double x2 = x.getElement(1); double dx1 = Math.sqrt(cx.getElement(0, 0)); double dx2 = Math.sqrt(cx.getElement(1, 1)); double rho = (cx.getElement(1, 0)) / (dx1 * dx2); // prepare size of plot double xmin = x1 - 2. * dx1; double xmax = x1 + 2. * dx1; double ymin = x2 - 2. * dx2; double ymax = x2 + 2. * dx2; DatanGraphics.openWorkstation(getClass().getName(), "E3Min_2.ps"); DatanGraphics.setFormat(0., 0.); DatanGraphics.setWindowInComputingCoordinates(xmin, xmax, ymin, ymax); DatanGraphics.setViewportInWorldCoordinates(.2, .9, .16, .86); DatanGraphics.setWindowInWorldCoordinates(-.414, 1., 0., 1.); DatanGraphics.setBigClippingWindow(); DatanGraphics.chooseColor(2); DatanGraphics.drawFrame(); DatanGraphics.drawScaleX("x_1"); DatanGraphics.drawScaleY("x_2"); DatanGraphics.drawBoundary(); DatanGraphics.chooseColor(5); // draw data point with errors (and correlation) DatanGraphics.drawDatapoint(1, 1., x1, x2, dx1, dx2, rho); DatanGraphics.chooseColor(2); DatanGraphics.drawCaption(1., caption); // draw confidence contour double fcont = mllg.getValue(x) + .5; int nx = 100; int ny = 100; double dx = (xmax - xmin) / (int) nx; double dy = (ymax - ymin) / (int) ny; MinLogLikeGaussCont mllgc = new MinLogLikeGaussCont(); // System.out.println(" x = " + x.toString() + ", mllgc.getValue(x) = " + // mllgc.getValue(x.getElement(0), x.getElement(1))); DatanGraphics.setBigClippingWindow(); DatanGraphics.chooseColor(1); DatanGraphics.drawContour(xmin, ymin, dx, dy, nx, ny, fcont, mllgc); // draw asymmetric errors as horiyontal and vertical bars DatanGraphics.chooseColor(3); double[] xpl = new double[2]; double[] ypl = new double[2]; for (int i = 0; i < 2; i++) { if (i == 0) xpl[0] = x1 - dxasy[0][0]; else xpl[0] = x1 + dxasy[0][1]; xpl[1] = xpl[0]; ypl[0] = ymin; ypl[1] = ymax; DatanGraphics.drawPolyline(xpl, ypl); } for (int i = 0; i < 2; i++) { if (i == 0) ypl[0] = x2 - dxasy[1][0]; else ypl[0] = x2 + dxasy[1][1]; ypl[1] = ypl[0]; xpl[0] = xmin; xpl[1] = xmax; DatanGraphics.drawPolyline(xpl, ypl); } DatanGraphics.closeWorkstation(); }
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); }
public double getValue(DatanVector x, double t) { return x.getElement(0) * Math.pow(t, x.getElement(1)); }