本文整理汇总了Python中pymor.algorithms.gram_schmidt.gram_schmidt函数的典型用法代码示例。如果您正苦于以下问题:Python gram_schmidt函数的具体用法?Python gram_schmidt怎么用?Python gram_schmidt使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了gram_schmidt函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: _projection_matrix
def _projection_matrix(self, r, sigma, b, c, projection):
fom = self.fom
if self.version == 'V':
V = fom.A.source.empty(reserve=r)
else:
W = fom.A.source.empty(reserve=r)
for i in range(r):
if sigma[i].imag == 0:
sEmA = sigma[i].real * self.fom.E - self.fom.A
if self.version == 'V':
Bb = fom.B.apply(b.real[i])
V.append(sEmA.apply_inverse(Bb))
else:
CTc = fom.C.apply_adjoint(c.real[i])
W.append(sEmA.apply_inverse_adjoint(CTc))
elif sigma[i].imag > 0:
sEmA = sigma[i] * self.fom.E - self.fom.A
if self.version == 'V':
Bb = fom.B.apply(b[i])
v = sEmA.apply_inverse(Bb)
V.append(v.real)
V.append(v.imag)
else:
CTc = fom.C.apply_adjoint(c[i].conj())
w = sEmA.apply_inverse_adjoint(CTc)
W.append(w.real)
W.append(w.imag)
if self.version == 'V':
self.V = gram_schmidt(V, atol=0, rtol=0, product=None if projection == 'orth' else fom.E)
else:
self.V = gram_schmidt(W, atol=0, rtol=0, product=None if projection == 'orth' else fom.E)
self._pg_reductor = LTIPGReductor(fom, self.V, self.V, projection == 'Eorth')
示例2: extend_basis
def extend_basis(U, basis, product=None, method='gram_schmidt', pod_modes=1, pod_orthonormalize=True, copy_U=True):
assert method in ('trivial', 'gram_schmidt', 'pod')
basis_length = len(basis)
if method == 'trivial':
remove = set()
for i in range(len(U)):
if np.any(almost_equal(U[i], basis)):
remove.add(i)
basis.append(U[[i for i in range(len(U)) if i not in remove]],
remove_from_other=(not copy_U))
elif method == 'gram_schmidt':
basis.append(U, remove_from_other=(not copy_U))
gram_schmidt(basis, offset=basis_length, product=product, copy=False, check=False)
elif method == 'pod':
U_proj_err = U - basis.lincomb(U.inner(basis, product))
basis.append(pod(U_proj_err, modes=pod_modes, product=product, orthonormalize=False)[0])
if pod_orthonormalize:
gram_schmidt(basis, offset=basis_length, product=product, copy=False, check=False)
if len(basis) <= basis_length:
raise ExtensionError
示例3: test_gram_schmidt
def test_gram_schmidt():
for i in (1, 32):
b = NumpyVectorArray(np.identity(i, dtype=np.float))
a = gram_schmidt(b)
assert np.all(almost_equal(b, a))
c = NumpyVectorArray([[1.0, 0], [0., 0]])
a = gram_schmidt(c)
assert (a.data == np.array([[1.0, 0]])).all()
示例4: reduce
def reduce(self, r, projection='bfsr'):
"""Reduce using SOBTfv.
Parameters
----------
r
Order of the reduced model.
projection
Projection method used:
- `'sr'`: square root method
- `'bfsr'`: balancing-free square root method (default,
since it avoids scaling by singular values and
orthogonalizes the projection matrices, which might
make it more accurate than the square root method)
- `'biorth'`: like the balancing-free square root
method, except it biorthogonalizes the projection
matrices
Returns
-------
rd
Reduced system.
"""
assert 0 < r < self.d.n
assert projection in ('sr', 'bfsr', 'biorth')
# compute all necessary Gramian factors
pcf = self.d.gramian('pcf')
pof = self.d.gramian('pof')
if r > min(len(pcf), len(pof)):
raise ValueError('r needs to be smaller than the sizes of Gramian factors.')
# find necessary SVDs
_, sp, Vp = spla.svd(pof.inner(pcf))
# compute projection matrices and find the reduced model
self.V = pcf.lincomb(Vp[:r])
if projection == 'sr':
alpha = 1 / np.sqrt(sp[:r])
self.V.scal(alpha)
self.bases_are_biorthonormal = False
elif projection == 'bfsr':
self.V = gram_schmidt(self.V, atol=0, rtol=0)
self.bases_are_biorthonormal = False
elif projection == 'biorth':
self.V = gram_schmidt(self.V, product=self.d.M, atol=0, rtol=0)
self.bases_are_biorthonormal = True
self.W = self.V
self.pg_reductor = GenericPGReductor(self.d, self.W, self.V, projection == 'biorth', product=self.d.M)
rd = self.pg_reductor.reduce()
return rd
示例5: reduce
def reduce(self, r=None, tol=None, projection='bfsr'):
"""Generic Balanced Truncation.
Parameters
----------
r
Order of the reduced model if `tol` is `None`, maximum order if `tol` is specified.
tol
Tolerance for the error bound if `r` is `None`.
projection
Projection method used:
- `'sr'`: square root method
- `'bfsr'`: balancing-free square root method (default, since it avoids scaling by
singular values and orthogonalizes the projection matrices, which might make it more
accurate than the square root method)
- `'biorth'`: like the balancing-free square root method, except it biorthogonalizes the
projection matrices (using :func:`~pymor.algorithms.gram_schmidt.gram_schmidt_biorth`)
Returns
-------
rom
Reduced-order model.
"""
assert r is not None or tol is not None
assert r is None or 0 < r < self.fom.order
assert projection in ('sr', 'bfsr', 'biorth')
cf, of = self._gramians()
sv, sU, sV = self._sv_U_V()
# find reduced order if tol is specified
if tol is not None:
error_bounds = self.error_bounds()
r_tol = np.argmax(error_bounds <= tol) + 1
r = r_tol if r is None else min(r, r_tol)
if r > min(len(cf), len(of)):
raise ValueError('r needs to be smaller than the sizes of Gramian factors.')
# compute projection matrices
self.V = cf.lincomb(sV[:r])
self.W = of.lincomb(sU[:r])
if projection == 'sr':
alpha = 1 / np.sqrt(sv[:r])
self.V.scal(alpha)
self.W.scal(alpha)
elif projection == 'bfsr':
self.V = gram_schmidt(self.V, atol=0, rtol=0)
self.W = gram_schmidt(self.W, atol=0, rtol=0)
elif projection == 'biorth':
self.V, self.W = gram_schmidt_biorth(self.V, self.W, product=self.fom.E)
# find reduced-order model
self._pg_reductor = LTIPGReductor(self.fom, self.W, self.V, projection in ('sr', 'biorth'))
rom = self._pg_reductor.reduce()
return rom
示例6: test_gram_schmidt_with_product
def test_gram_schmidt_with_product(operator_with_arrays_and_products):
_, _, U, _, p, _ = operator_with_arrays_and_products
V = U.copy()
onb = gram_schmidt(U, product=p, copy=True)
assert np.all(almost_equal(U, V))
assert np.allclose(p.apply2(onb, onb), np.eye(len(onb)))
assert np.all(almost_equal(U, onb.lincomb(p.apply2(U, onb)), rtol=1e-13))
onb2 = gram_schmidt(U, product=p, copy=False)
assert np.all(almost_equal(onb, onb2))
assert np.all(almost_equal(onb, U))
示例7: test_gram_schmidt
def test_gram_schmidt(vector_array):
U = vector_array
V = U.copy()
onb = gram_schmidt(U, copy=True)
assert np.all(almost_equal(U, V))
assert np.allclose(onb.dot(onb), np.eye(len(onb)))
assert np.all(almost_equal(U, onb.lincomb(U.dot(onb)), rtol=1e-13))
onb2 = gram_schmidt(U, copy=False)
assert np.all(almost_equal(onb, onb2))
assert np.all(almost_equal(onb, U))
示例8: _projection_matrices
def _projection_matrices(self, rom, projection):
fom = self.fom
self.V, self.W = solve_sylv_schur(fom.A, rom.A,
E=fom.E, Er=rom.E,
B=fom.B, Br=rom.B,
C=fom.C, Cr=rom.C)
if projection == 'orth':
self.V = gram_schmidt(self.V, atol=0, rtol=0)
self.W = gram_schmidt(self.W, atol=0, rtol=0)
elif projection == 'biorth':
self.V, self.W = gram_schmidt_biorth(self.V, self.W, product=fom.E)
self._pg_reductor = LTIPGReductor(fom, self.W, self.V, projection == 'biorth')
示例9: test_gram_schmidt_with_R
def test_gram_schmidt_with_R(vector_array):
U = vector_array
V = U.copy()
onb, R = gram_schmidt(U, return_R=True, copy=True)
assert np.all(almost_equal(U, V))
assert np.allclose(onb.dot(onb), np.eye(len(onb)))
assert np.all(almost_equal(U, onb.lincomb(U.dot(onb)), rtol=1e-13))
assert np.all(almost_equal(V, onb.lincomb(R.T)))
onb2, R2 = gram_schmidt(U, return_R=True, copy=False)
assert np.all(almost_equal(onb, onb2))
assert np.all(R == R2)
assert np.all(almost_equal(onb, U))
示例10: projection_shifts_init
def projection_shifts_init(A, E, B, shift_options):
"""Find starting shift parameters for low-rank ADI iteration using
Galerkin projection on spaces spanned by LR-ADI iterates.
See [PK16]_, pp. 92-95.
Parameters
----------
A
The |Operator| A from the corresponding Lyapunov equation.
E
The |Operator| E from the corresponding Lyapunov equation.
B
The |VectorArray| B from the corresponding Lyapunov equation.
shift_options
The shift options to use (see :func:`lyap_solver_options`).
Returns
-------
shifts
A |NumPy array| containing a set of stable shift parameters.
"""
for i in range(shift_options['init_maxiter']):
Q = gram_schmidt(B, atol=0, rtol=0)
shifts = spla.eigvals(A.apply2(Q, Q), E.apply2(Q, Q))
shifts = shifts[np.real(shifts) < 0]
if shifts.size == 0:
# use random subspace instead of span{B} (with same dimensions)
if shift_options['init_seed'] is not None:
np.random.seed(shift_options['init_seed'])
np.random.seed(np.random.random() + i)
B = B.space.make_array(np.random.rand(len(B), B.space.dim))
else:
return shifts
raise RuntimeError('Could not generate initial shifts for low-rank ADI iteration.')
示例11: test_project_array
def test_project_array():
np.random.seed(123)
U = NumpyVectorSpace.from_numpy(np.random.random((2, 10)))
basis = NumpyVectorSpace.from_numpy(np.random.random((3, 10)))
U_p = project_array(U, basis, orthonormal=False)
onb = gram_schmidt(basis)
U_p2 = project_array(U, onb, orthonormal=True)
assert np.all(relative_error(U_p, U_p2) < 1e-10)
示例12: gram_schmidt_basis_extension
def gram_schmidt_basis_extension(basis, U, product=None, copy_basis=True, copy_U=True):
"""Extend basis using Gram-Schmidt orthonormalization.
Parameters
----------
basis
|VectorArray| containing the basis to extend.
U
|VectorArray| containing the new basis vectors.
product
The scalar product w.r.t. which to orthonormalize; if `None`, the Euclidean
product is used.
copy_basis
If `copy_basis` is `False`, the old basis is extended in-place.
copy_U
If `copy_U` is `False`, the new basis vectors are removed from `U`.
Returns
-------
new_basis
The extended basis.
extension_data
Dict containing the following fields:
:hierarchic: `True` if `new_basis` contains `basis` as its first vectors.
Raises
------
ExtensionError
Gram-Schmidt orthonormalization fails. This is the case when no
vector in `U` is linearly independent from the basis.
"""
if basis is None:
basis = U.empty(reserve=len(U))
basis_length = len(basis)
new_basis = basis.copy() if copy_basis else basis
new_basis.append(U, remove_from_other=(not copy_U))
gram_schmidt(new_basis, offset=basis_length, product=product, copy=False)
if len(new_basis) <= basis_length:
raise ExtensionError
return new_basis, {'hierarchic': True}
示例13: test_project_array_with_product
def test_project_array_with_product():
np.random.seed(123)
U = NumpyVectorSpace.from_numpy(np.random.random((1, 10)))
basis = NumpyVectorSpace.from_numpy(np.random.random((3, 10)))
product = np.random.random((10, 10))
product = NumpyMatrixOperator(product.T.dot(product))
U_p = project_array(U, basis, product=product, orthonormal=False)
onb = gram_schmidt(basis, product=product)
U_p2 = project_array(U, onb, product=product, orthonormal=True)
assert np.all(relative_error(U_p, U_p2, product) < 1e-10)
示例14: projection_shifts
def projection_shifts(A, E, V, prev_shifts):
"""Find further shift parameters for low-rank ADI iteration using
Galerkin projection on spaces spanned by LR-ADI iterates.
See [PK16]_, pp. 92-95.
Parameters
----------
A
The |Operator| A from the corresponding Lyapunov equation.
E
The |Operator| E from the corresponding Lyapunov equation.
V
A |VectorArray| representing the currently computed iterate.
prev_shifts
A |NumPy array| containing the set of all previously used shift
parameters.
Returns
-------
shifts
A |NumPy array| containing a set of stable shift parameters.
"""
if prev_shifts[-1].imag != 0:
Q = gram_schmidt(cat_arrays([V.real, V.imag]), atol=0, rtol=0)
else:
Q = gram_schmidt(V, atol=0, rtol=0)
Ap = A.apply2(Q, Q)
Ep = E.apply2(Q, Q)
shifts = spla.eigvals(Ap, Ep)
shifts.imag[abs(shifts.imag) < np.finfo(float).eps] = 0
shifts = shifts[np.real(shifts) < 0]
if shifts.size == 0:
return prev_shifts
else:
if np.any(shifts.imag != 0):
shifts = shifts[np.abs(shifts).argsort()]
else:
shifts.sort()
return shifts
示例15: rrf
def rrf(A, source_product=None, range_product=None, q=2, l=8, iscomplex=False):
"""Randomized range approximation of `A`.
This is an implementation of Algorithm 4.4 in [HMT11]_.
Given the |Operator| `A`, the return value of this method is the |VectorArray|
`Q` whose vectors form an approximate orthonomal basis for the range of `A`.
Parameters
----------
A
The |Operator| A.
source_product
Inner product |Operator| of the source of A.
range_product
Inner product |Operator| of the range of A.
q
The number of power iterations.
l
The block size of the normalized power iterations.
iscomplex
If `True`, the random vectors are chosen complex.
Returns
-------
Q
|VectorArray| which contains the basis, whose span approximates the range of A.
"""
assert source_product is None or isinstance(source_product, OperatorInterface)
assert range_product is None or isinstance(range_product, OperatorInterface)
assert isinstance(A, OperatorInterface)
R = A.source.random(l, distribution='normal')
if iscomplex:
R += 1j*A.source.random(l, distribution='normal')
Q = A.apply(R)
gram_schmidt(Q, range_product, atol=0, rtol=0, copy=False)
for i in range(q):
Q = A.apply_adjoint(Q)
gram_schmidt(Q, source_product, atol=0, rtol=0, copy=False)
Q = A.apply(Q)
gram_schmidt(Q, range_product, atol=0, rtol=0, copy=False)
return Q