package org.freehep.math.minuit.example.sim; import java.util.List; 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.MnPlot; import org.freehep.math.minuit.MnScan; import org.freehep.math.minuit.MnStrategy; import org.freehep.math.minuit.MnUserParameters; import org.freehep.math.minuit.Point; /** * * @version $Id: ReneUnitTest.java 8584 2006-08-10 23:06:37Z duns $ */ public class ReneUnitTest extends TestCase { public ReneUnitTest(String testName) { super(testName); } public static junit.framework.Test suite() { junit.framework.TestSuite suite = new junit.framework.TestSuite(ReneUnitTest.class); return suite; } public void testRene() { double[] tmp = {38.,36.,46.,52.,54.,52.,61.,52.,64.,77., 60.,56.,78.,71.,81.,83.,89.,96.,118.,96., 109.,111.,107.,107.,135.,156.,196.,137., 160.,153.,185.,222.,251.,270.,329.,422., 543.,832.,1390.,2835.,3462.,2030.,1130., 657.,469.,411.,375.,295.,281.,281.,289., 273.,297.,256.,274.,287.,280.,274.,286., 279.,293.,314.,285.,322.,307.,313.,324., 351.,314.,314.,301.,361.,332.,342.,338., 396.,356.,344.,395.,416.,406.,411.,422., 393.,393.,409.,455.,427.,448.,459.,403., 441.,510.,501.,502.,482.,487.,506.,506., 526.,517.,534.,509.,482.,591.,569.,518., 609.,569.,598.,627.,617.,610.,662.,666., 652.,671.,647.,650.,701.}; double[] measurements = tmp.clone(); ReneTest.ReneFcn theFCN = new ReneTest.ReneFcn(measurements); MnUserParameters upar = new MnUserParameters(); upar.add("p0", 100., 10.); upar.add("p1", 100., 10.); upar.add("p2", 100., 10.); upar.add("p3", 100., 10.); upar.add("p4", 1., 0.3); upar.add("p5", 1., 0.3); MnMigrad migrad = new MnMigrad(theFCN, upar); FunctionMinimum min = migrad.minimize(); if(!min.isValid()) { //try with higher strategy MnMigrad migrad2 = new MnMigrad(theFCN, min.userState(), new MnStrategy(2)); min = migrad2.minimize(); } assertTrue(min.isValid()); assertEquals(306,min.nfcn()); assertEquals(134.2,min.fval(),1e-1); assertEquals(2.258e-06,min.edm(),1e-9); assertEquals(32.036, min.userParameters().value(0),1e-4); assertEquals(98.1083, min.userParameters().value(1),1e-4); assertEquals(39.1555, min.userParameters().value(2),1e-4); assertEquals(362.439, min.userParameters().value(3),1e-3); assertEquals(0.0670762, min.userParameters().value(4),1e-7); assertEquals(1.00624, min.userParameters().value(5),1e-5); assertEquals(2.346, min.userParameters().error(0),1e-3); assertEquals(6.002, min.userParameters().error(1),1e-3); assertEquals(2.33, min.userParameters().error(2),1e-3); assertEquals(3.882, min.userParameters().error(3),1e-3); assertEquals(0.001061, min.userParameters().error(4),1e-6); assertEquals(0.0004247, min.userParameters().error(5),1e-7); { double[] params = {1,1,1,1,1,1}; double[] error = {1,1,1,1,1,1}; MnScan scan = new MnScan(theFCN, params, error); for(int i = 0; i < upar.variableParameters(); i++) { List<Point> xy = scan.scan(i); } assertEquals(3.,scan.parameters().value(0),1e-6); assertEquals(3.,scan.parameters().value(1),1e-6); assertEquals(3.,scan.parameters().value(2),1e-6); assertEquals(3.,scan.parameters().value(3),1e-6); assertEquals(0.1,scan.parameters().value(4),1e-6); assertEquals(1,scan.parameters().value(5),1e-6); } { double[] params = {1,1,1,1,1,1}; double[] error = {1,1,1,1,1,1}; MnScan scan = new MnScan(theFCN, params, error); FunctionMinimum min2 = scan.minimize(); assertEquals(3.,min2.userParameters().value(0),1e-6); assertEquals(3.,min2.userParameters().value(1),1e-6); assertEquals(3.,min2.userParameters().value(2),1e-6); assertEquals(3.,min2.userParameters().value(3),1e-6); assertEquals(0.1,min2.userParameters().value(4),1e-6); assertEquals(1,min2.userParameters().value(5),1e-6); } } }