Esempio n. 1
0
 def __init__(self, xys, xys_vals, rads, base=Wendland(4)):
     self.xys = xys
     self.base = RadialFunction(base)
     self.rads = rads
     base_vals = deque()
     iq = deque()
     jq = deque()
     if len(rads) > 1:
         uni_rad = None
     else:
         uni_rad = rads[0]
     for i in xrange((len(xys))):
         w_dists = deque()
         if not uni_rad:
             w_rads = deque()
         
         for j in xrange((len(xys))):
             x_i, y_i = xys[i]
             x_j, y_j = xys[j]
             dist = ((x_j - x_i) ** 2 + (y_j - y_i) ** 2) ** 0.5
             if uni_rad:
                 rad = uni_rad
             else:
                 rad = rads[j]
             if dist < rad:
                 w_dists.append((dist,))
                 if not uni_rad:
                     w_rads.append(rad)
                 iq.append(i)
                 jq.append(j)
         if uni_rad:
             w_rads = rads    
         vs = self.base.values(w_dists, w_rads)
         base_vals.extend(vs[:, 0])
             
     main_mat = spm.csr_matrix((base_vals, (iq, jq)), (len(xys), len(xys)))
     self.a = spm_alg.spsolve(main_mat, xys_vals)
     self.set_diff_order(0)
Esempio n. 2
0
class CSRbf(object):
    
    def __init__(self, xys, xys_vals, rads, base=Wendland(4)):
        self.xys = xys
        self.base = RadialFunction(base)
        self.rads = rads
        base_vals = deque()
        iq = deque()
        jq = deque()
        if len(rads) > 1:
            uni_rad = None
        else:
            uni_rad = rads[0]
        for i in xrange((len(xys))):
            w_dists = deque()
            if not uni_rad:
                w_rads = deque()
            
            for j in xrange((len(xys))):
                x_i, y_i = xys[i]
                x_j, y_j = xys[j]
                dist = ((x_j - x_i) ** 2 + (y_j - y_i) ** 2) ** 0.5
                if uni_rad:
                    rad = uni_rad
                else:
                    rad = rads[j]
                if dist < rad:
                    w_dists.append((dist,))
                    if not uni_rad:
                        w_rads.append(rad)
                    iq.append(i)
                    jq.append(j)
            if uni_rad:
                w_rads = rads    
            vs = self.base.values(w_dists, w_rads)
            base_vals.extend(vs[:, 0])
                
        main_mat = spm.csr_matrix((base_vals, (iq, jq)), (len(xys), len(xys)))
        self.a = spm_alg.spsolve(main_mat, xys_vals)
        self.set_diff_order(0)
    
    def set_diff_order(self, order):
        self._diff_order = order
        self.base.set_diff_order(order)
        
    def value(self, xy):
        res_length = output_length_2d(self._diff_order)
        res = np.ndarray((res_length,), dtype=np.double)
        dists, rads, indes = self._search_supporting(xy)
        vs = self.base.values(dists, rads)
        for i in xrange(res_length):
            t = 0
            k = 0
            for j in indes:
                t += vs[k, i] * self.a[j]
                k += 1
            res[i] = t
        return res
    
    def _search_supporting(self, xy):
        if len(self.rads) > 1:
            uni_rad = None
            rads_iter = iter(self.rads)
            res_rads = deque()
        else:
            uni_rad = self.rads[0]
        res_dists = deque()
        indes = deque()
        i = 0
        for coord in self.xys:
            if uni_rad:
                rad = uni_rad
            else:
                rad = next(rads_iter)
            x1, y1 = coord
            x, y = xy
            d = ((x - x1) ** 2 + (y - y1) ** 2) ** 0.5
            if d < rad:
                indes.append(i)
                if self._diff_order == 0:
                    res_dists.append((d,))
                elif self._diff_order == 1:
                    if 0 != d:
                        res_dists.append((d, (x - x1) / d, (y - y1) / d))
                    else:
                        res_dists.append((0, 0, 0))
                if not uni_rad:
                    res_rads.append(rad)
            i += 1
        if uni_rad:
            return (res_dists, self.rads, indes)
        else:
            return (res_dists, res_rads, indes)