예제 #1
0
def function_fitness_test():
    func_errors = [(polynomial_sample, 1e-10), (sin_cos_sample, 2e-5)]
    
    mls = MLS()
    mls.set_diff_order(1)
    interval = sample_interval()
    v = np.linspace(*interval, num=4)
    centers = [(x, y) for x in v for y in v]
    
    coords = sample_coords()
    rad = (interval[1] - interval[0]) / 50.0 * 4
    pt_vals = np.ndarray((len(coords), 3))
    radss = [(rad,)]
    rads = np.ndarray((len(coords),), dtype=np.double)
    rads.fill(rad)
    rads += np.linspace(0.1, 0.2, len(rads))
    radss.append(rads)
    
    for rads in radss:
        for func, err in func_errors:
            acts = []
            i = 0
            for coord in coords:
                val = func(coord)
                pt_vals[i] = val
                i += 1
            
            
            for center in centers:
                coords_in_rad = []
                indes = []
                i = 0
                for coord in coords:
                    d = np.array(coord) - center
                    d = np.dot(d, d) ** 0.5
                    if d <= rad:
                        coords_in_rad.append(coord)
                        indes.append(i)
                    i += 1
                if len(rads) > 1:
                    act_rads = rads[indes]
                else:
                    act_rads = rads
                res = mls.values(center, coords_in_rad , act_rads)
                
                act_val = np.dot(res[:, 0], pt_vals[indes, 0])
                act_val_x = np.dot(res[:, 1], pt_vals[indes, 0])
                act_val_y = np.dot(res[:, 2], pt_vals[indes, 0])
                acts = np.array((act_val, act_val_x, act_val_y), dtype=np.double)
                exps = np.array(func(center), dtype=np.double)
                max_err = np.max(np.abs(acts - exps))
                ok_(max_err < err, str(func) + "acts:" + str(acts) + " exps:" + str(exps) + " center:" + str(center) + "max_err:" + str(max_err) + " err_lim:" + str(err))
예제 #2
0
def partition_of_unity_test():
    mls = MLS()
    mls.set_diff_order(1)
    interval = sample_interval()
    v = np.linspace(*interval, num=5)
    centers = [(x, y) for x in v for y in v]
    coords = sample_coords()
    
    radss = [((interval[1] - interval[0]) / 50.0 * 4,)]
    rads = np.ndarray((len(coords),), dtype=np.double)
    rads.fill(radss[0][0])
    rads += np.linspace(0.1, 0.2, len(rads))
    radss.append(rads)
    
    for rads in radss:
        acts = []
        for center in centers:
            coords_in_rad = []
            act_rads = []
            i = 0
            for coord in coords:
                d = np.array(coord) - center
                d = np.dot(d, d) ** 0.5
                if len(rads) > 1:
                    rad = rads[i]
                else:
                    rad = rads[0]
                if d <= rad:
                    coords_in_rad.append(coord)
                    if len(rads) > 1:
                        act_rads.append(rad)
                i += 1
            if len(rads) == 1:
                act_rads = rads
            res = mls.values(center, coords_in_rad , act_rads)
            acts.append(np.sum(res, axis=0))
        acts = np.array(acts, dtype=np.double)
        acts = abs(np.max(acts, axis=0))
        ok_(acts[0] - 1 < 1e-9)
        ok_(acts[1] < 1e-9)
        ok_(acts[1] < 1e-9)