def testConstrainedOptimisation(self): k = 4 g = pcb.PlaneWaves(numpy.array([[3.0/5,4.0/5]]), k).values # g = pcb.FourierBessel(numpy.array([-2,-1]), numpy.array([5]),k) npw = 3 nq = 8 ini = pcb.circleDirections(npw) triquad = puq.trianglequadrature(nq) linearopt = puo.LeastSquaresFit(g, triquad) pwpg = puo.PWPenaltyBasisGenerator(k, 1, 2) basis = puo.optimalbasis3(linearopt.optimise, pwpg.finalbasis, ini) (coeffs, l2err) = linearopt.optimise(basis) self.assertAlmostEqual(sum(l2err),0)
def testOptimalBasis3(self): """ Can we find the right direction to approximate a plane wave?""" k = 4 g = pcb.PlaneWaves(numpy.array([[3.0/5,4.0/5]]), k).values # g = pcb.FourierBessel(numpy.array([-2,-1]), numpy.array([5]),k) npw = 3 nq = 8 gen, ini = puo.pwbasisgeneration(k, npw) triquad = puq.trianglequadrature(nq) linearopt = puo.LeastSquaresFit(g, triquad) basis = puo.optimalbasis3(linearopt.optimise, gen, ini) (coeffs, l2err) = linearopt.optimise(basis) self.assertAlmostEqual(sum(l2err),0)
def getNearbyBases(self, indices, x): etonbcdata = {} self.etonbcs = {} for e in self.mesh.partition: xe = x[indices[e]:indices[e+1]] bc = self.etobc[e] fs = self.mesh.etof[e] qp = np.vstack([self.mqs.quadpoints(f) for f in fs]) qw = np.concatenate([self.mqs.quadweights(f) for f in fs]) lsf = puo.LeastSquaresFit(pcb.BasisReduce(pcb.BasisCombine(bc.getBasis()),xe).values, (qp,qw)) nbcs = bc.nearbybases(xe) optimisednbcs = [] nbcdata = [] for i, nbc in enumerate(nbcs): newnbc = puo.optimalbasis3(lsf.optimise, nbc.pwbasis, nbc.params, None, nbc.newparams) if nbc.npw > 0 else nbc optimisednbcs.append(newnbc) (_, l2err) = lsf.optimise(pcb.BasisCombine(newnbc.getBasis())) nbcdata.append((i, newnbc.n, sum(l2err))) etonbcdata[e] = nbcdata self.etonbcs[e] = optimisednbcs return etonbcdata