package org.freehep.math.minuit.example.sim; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import junit.framework.TestCase; import org.freehep.math.minuit.FCNBase; import org.freehep.math.minuit.FunctionMinimum; import org.freehep.math.minuit.MnMigrad; import org.freehep.math.minuit.MnUserParameters; import org.freehep.math.minuit.MnSimplex; /** * * @version $Id: PaulUnitTest4.java 8584 2006-08-10 23:06:37Z duns $ */ public class PaulUnitTest4 extends TestCase { private double[] m,p,v; public PaulUnitTest4(String testName) { super(testName); } public static junit.framework.Test suite() { junit.framework.TestSuite suite = new junit.framework.TestSuite(PaulUnitTest4.class); return suite; } protected void setUp() throws java.lang.Exception { List<Double> positions = new ArrayList<Double>(); List<Double> measurements = new ArrayList<Double>(); List<Double> var = new ArrayList<Double>(); Scanner in = new Scanner(PaulTest.class.getResourceAsStream("paul4.txt")); // read input data { while(in.hasNextDouble()) { double x = in.nextDouble(); double y = in.nextDouble(); double err = in.nextDouble(); positions.add(x); measurements.add(y); var.add(err*err); } } m = new double[var.size()]; p = new double[var.size()]; v = new double[var.size()]; for (int i=0; i<var.size(); i++) { m[i] = measurements.get(i); p[i] = positions.get(i); v[i] = var.get(i); } } public void testPaul4Chi2() { // create Chi2 FCN function PaulTest4.PowerLawChi2FCN theFCN = new PaulTest4.PowerLawChi2FCN(m, p, v); MnUserParameters upar = new MnUserParameters(); upar.add("p0", -2.3, 0.2); upar.add("p1", 1100., 10.); MnMigrad migrad = new MnMigrad(theFCN, upar); FunctionMinimum min = migrad.minimize(); if(!min.isValid()) { migrad = new MnMigrad(theFCN, upar, 2); min = migrad.minimize(); } assertTrue(min.isValid()); assertEquals(102,min.nfcn()); assertEquals(95.243,min.fval(),1e-3); assertEquals(3.7209e-11,min.edm(),1e-15); assertEquals(-2.10019, min.userParameters().value(0),1e-5); assertEquals(999.225, min.userParameters().value(1),1e-3); assertEquals(0.0001592, min.userParameters().error(0),1e-7); assertEquals(0.8073, min.userParameters().error(1),1e-4); assertEquals(2.53567e-08,min.userCovariance().get(0,0),1e-13); assertEquals(0.000127332,min.userCovariance().get(1,0),1e-9); assertEquals(0.651708,min.userCovariance().get(1,1),1e-6); } public void testPaul4LogLike() { // create LogLikelihood FCN function PaulTest4.PowerLawLogLikeFCN theFCN = new PaulTest4.PowerLawLogLikeFCN(m, p); MnUserParameters upar = new MnUserParameters(); upar.add("p0", -2.1, 0.2); upar.add("p1", 1000., 10.); MnMigrad migrad = new MnMigrad(theFCN, upar); migrad.setErrorDef(0.5); FunctionMinimum min = migrad.minimize(); if(!min.isValid()) { //try with higher strategy migrad = new MnMigrad(theFCN, upar, 2); min = migrad.minimize(); } assertTrue(min.isValid()); assertEquals(63,min.nfcn()); assertEquals(-1.33678e+09,min.fval(),1e4); assertEquals(0.0170964,min.edm(),1e-4); assertEquals(-2.10016, min.userParameters().value(0),1e-5); assertEquals(999.394, min.userParameters().value(1),1e-3); assertEquals(0.0001488, min.userParameters().error(0),1e-7); assertEquals(0.7544, min.userParameters().error(1),1e-4); assertEquals(2.21365e-08,min.userCovariance().get(0,0),1e-13); assertEquals(0.000111025,min.userCovariance().get(1,0),1e-9); assertEquals(0.569138,min.userCovariance().get(1,1),1e-6); } public void testPaul4Simplex() { PaulTest4.PowerLawChi2FCN chi2 = new PaulTest4.PowerLawChi2FCN(m, p, v); PaulTest4.PowerLawLogLikeFCN mlh = new PaulTest4.PowerLawLogLikeFCN(m, p); MnUserParameters upar; double[] par = {-2.3, 1100.}; double[] err = { 1., 1.}; MnSimplex simplex = new MnSimplex(chi2, par, err); FunctionMinimum min = simplex.minimize(); assertTrue(min.isValid()); assertEquals(105,min.nfcn()); assertEquals(95.2506,min.fval(),1e-4); assertEquals(0.0286894,min.edm(),1e-7); assertEquals(-2.10018, min.userParameters().value(0),1e-5); assertEquals(999.286, min.userParameters().value(1),1e-3); assertEquals(0.0001122, min.userParameters().error(0),1e-7); assertEquals(0.7701, min.userParameters().error(1),1e-4); MnSimplex simplex2 = new MnSimplex(mlh, par, err); simplex2.setErrorDef(0.5); min = simplex2.minimize(); assertTrue(min.isValid()); assertEquals(84,min.nfcn()); assertEquals(-1.337e+09,min.fval(),1e6); assertEquals(0.03377,min.edm(),1e-5); assertEquals(-2.10018, min.userParameters().value(0),1e-5); assertEquals(999.279, min.userParameters().value(1),1e-3); assertEquals(0.0001793, min.userParameters().error(0),1e-7); assertEquals(0.7549, min.userParameters().error(1),1e-4); } }