def test_integral_3D(): from math import sin, cos, exp, log, pi, e from ostap.math.integral import genzmalik3, integral3 funcs = [ (lambda x, y, z: x * x + y * abs(y), -1, 2, -1, 2, -1, 2, 48), (lambda x, y, z: x * x + y * abs(y) + z * z * cos(z), -1, 2, -1, 2, -1, 2, 51.53827020952059001502), (lambda x, y, z: x * exp(x) + sin(y) * abs(y) + z * z * exp(z), -1, 2, -1, 2, -1, 2, 202.53557154832049036486), ] for entry in funcs: v1 = genzmalik3(*entry[:7], err=True) v2 = integral3(*entry[:7], err=True) vv = entry[-1] print vv, '%.20f' % v2.value() logger.info('%20s: I %-20s %-20s %-20s ' % (entry[0], v1, v2, vv)) logger.info('%20s: Delta %-20s %-20s' % (entry[0], v1 - vv, v2 - vv)) logger.info('%20s: Delta/I %-20s %-20s' % (entry[0], (v1 - vv) / vv, (v2 - vv) / vv)) logger.info('%20s: Delta/E %-20s %-20s' % (entry[0], (v1 - vv) / v1.error(), (v2 - vv) / v2.error()))
def test_models(): xmin = 0 xmax = 2 ymin = xmin ymax = xmax zmin = xmin zmax = xmax funcs = [ Ostap.Math.Bernstein3D(2, 2, 2, xmin, xmax, ymin, ymax, zmin, zmax), Ostap.Math.Bernstein3DSym(2, xmin, xmax), Ostap.Math.Bernstein3DMix(2, 2, xmin, xmax, zmin, zmax), Ostap.Math.Positive3D(2, 2, 2, xmin, xmax, ymin, ymax, zmin, zmax), Ostap.Math.Positive3DSym(2, xmin, xmax), Ostap.Math.Positive3DMix(2, 2, xmin, xmax, zmin, zmax), ] cnt1 = SE() cnt2 = SE() cnt3 = SE() cnt4 = SE() cnt5 = SE() cnt6 = SE() cnt7 = SE() for f in funcs: ## print f.xmin() , f.xmax() , f.ymin() , f.ymax(), type(f) for i in range(f.npars()): f.setPar(i, random.uniform(1, 5)) for i in range(0, 100): if 0 == i: x1, x2, y1, y2, z1, z2 = xmin, xmax, ymin, ymax, zmin, zmax else: x1 = random.uniform(xmin, xmax / 2) x2 = random.uniform(x1, xmax) y1 = random.uniform(ymin, ymax / 2) y2 = random.uniform(y1, ymax) z1 = random.uniform(zmin, zmax / 2) z2 = random.uniform(z1, zmax) for f in funcs: i1 = f.integral(x1, x2, y1, y2, z1, z2) i2 = integral3(f, x1, x2, y1, y2, z1, z2) r1 = (i1 - i2) / (abs(i1) + abs(i2)) assert abs( r1 ) < 1.e-5, 'I3:ERROR: difference is too large: %s (%.2f,%.2f,%.2f,%.2f,%.2f,%.2f) %s' % ( r1, x1, x2, y1, y2, z1, z2, type(f)) cnt1 += r1 xm = 0.5 * (x1 + x2) ym = 0.5 * (y1 + y2) zm = 0.5 * (z1 + z2) i1 = f.integrateX(ym, zm, x1, x2) IX = Integrate3D_X(f, x1, x2) i2 = IX(ym, zm) r2 = (i1 - i2) / (abs(i1) + abs(i2)) assert abs( r2 ) < 1.e-5, 'IX:ERROR: difference is too large: %s (%.2f,%.2f,%.2f,%.2f) %s' % ( r2, x1, x2, ym, zm, type(f)) cnt2 += r2 i1 = f.integrateY(xm, zm, y1, y2) IY = Integrate3D_Y(f, y1, y2) i2 = IY(xm, zm) r3 = (i1 - i2) / (abs(i1) + abs(i2)) assert abs( r3 ) < 1.e-5, 'IY:ERROR: difference is too large: %s (%.2f,%.2f,%.2f,%.2f) %s' % ( r2, xm, y1, y2, zm, type(f)) cnt3 += r3 i1 = f.integrateZ(xm, ym, z1, z2) IZ = Integrate3D_Z(f, z1, z2) i2 = IZ(xm, ym) r4 = (i1 - i2) / (abs(i1) + abs(i2)) assert abs( r4 ) < 1.e-5, 'IY:ERROR: difference is too large: %s (%.2f,%.2f,%.2f,%.2f) %s' % ( r2, xm, ym, z1, z2, type(f)) cnt4 += r4 i1 = f.integrateXY(zm, x1, x2, y1, y2) I5 = Integrate3D_XY(f, x1, x2, y1, y2) i2 = I5(zm) r5 = (i1 - i2) / (abs(i1) + abs(i2)) assert abs( r5 ) < 1.e-5, 'I5:ERROR: difference is too large: %s (%.2f,%.2f,%.2f,%.2f,%.2f) %s' % ( r2, x1, x2, y1, y2, zm, type(f)) cnt5 += r5 i1 = f.integrateXZ(ym, x1, x2, z1, z2) I6 = Integrate3D_XZ(f, x1, x2, z1, z2) i2 = I6(ym) r6 = (i1 - i2) / (abs(i1) + abs(i2)) assert abs( r6 ) < 1.e-5, 'I6:ERROR: difference is too large: %s (%.2f,%.2f,%.2f,%.2f,%.2f) %s' % ( r2, x1, x2, ym, z1, z2, type(f)) cnt6 += r6 i1 = f.integrateYZ(xm, y1, y2, z1, z2) I7 = Integrate3D_YZ(f, y1, y2, z1, z2) i2 = I7(xm) r7 = (i1 - i2) / (abs(i1) + abs(i2)) assert abs( r7 ) < 1.e-5, 'I7:ERROR: difference is too large: %s (%.2f,%.2f,%.2f,%.2f,%.2f) %s' % ( r2, xm, y1, y2, z1, z2, type(f)) cnt7 += r7 print 'COUNTER(I3):', cnt1 print 'COUNTER(IX):', cnt2 print 'COUNTER(IY):', cnt3 print 'COUNTER(IZ):', cnt4 print 'COUNTER(I5):', cnt5 print 'COUNTER(I6):', cnt6 print 'COUNTER(I7):', cnt7