scipy.linalg.

solve_circulant#

scipy.linalg.solve_circulant(c, b, singular='raise', tol=None, caxis=-1, baxis=0, outaxis=0)[Quelle]#

Löst die Gleichung C @ x = b für x, wobei C eine zirkulante Matrix ist, die durch c definiert wird.

C ist die zirkulante Matrix, die dem Vektor c zugeordnet ist.

Das System wird durch Division im Fourier-Raum gelöst. Die Berechnung lautet:

x = ifft(fft(b) / fft(c))

wobei fft und ifft die schnelle Fourier-Transformation und ihre Inverse sind. Für einen großen Vektor c ist dies *wesentlich* schneller als die Lösung des Systems mit der vollständigen zirkulanten Matrix.

Parameter:
carray_like

Die Koeffizienten der zirkulanten Matrix.

barray_like

Rechte Seite der Matrix in a x = b.

singularstr, optional

Dieses Argument steuert die Handhabung einer nahezu singulären zirkulanten Matrix. Wenn singular "raise" ist und die zirkulante Matrix nahezu singulär ist, wird ein LinAlgError ausgelöst. Wenn singular "lstsq" ist, wird die Kleinste-Quadrate-Lösung zurückgegeben. Standard ist "raise".

tolfloat, optional

Wenn ein Eigenwert der zirkulanten Matrix einen absoluten Wert hat, der kleiner oder gleich tol ist, gilt die Matrix als nahezu singulär. Wenn nicht angegeben, wird tol gesetzt auf

tol = abs_eigs.max() * abs_eigs.size * np.finfo(np.float64).eps

wobei abs_eigs das Array der absoluten Werte der Eigenwerte der zirkulanten Matrix ist.

caxisint

Wenn c eine Dimension größer als 1 hat, wird es als Sammlung von zirkulanten Vektoren betrachtet. In diesem Fall ist caxis die Achse von c, die die Vektoren der zirkulanten Koeffizienten enthält.

baxisint

Wenn b eine Dimension größer als 1 hat, wird es als Sammlung von Vektoren betrachtet. In diesem Fall ist baxis die Achse von b, die die Vektoren der rechten Seite enthält.

outaxisint

Wenn c oder b mehrdimensional sind, hat der von solve_circulant zurückgegebene Wert eine mehrdimensionale Form. In diesem Fall ist outaxis die Achse des Ergebnisses, die die Lösungsvektoren enthält.

Rückgabe:
xndarray

Lösung des Systems C x = b.

Löst aus:
LinAlgError

Wenn die zirkulante Matrix, die c zugeordnet ist, nahezu singulär ist.

Siehe auch

circulant

zirkuläre Matrix

Hinweise

Für einen 1-D-Vektor c der Länge m und ein Array b der Form (m, ...),

solve_circulant(c, b)

gibt dasselbe Ergebnis zurück wie

solve(circulant(c), b)

wobei solve und circulant aus scipy.linalg stammen.

Hinzugefügt in Version 0.16.0.

Beispiele

>>> import numpy as np
>>> from scipy.linalg import solve_circulant, solve, circulant, lstsq
>>> c = np.array([2, 2, 4])
>>> b = np.array([1, 2, 3])
>>> solve_circulant(c, b)
array([ 0.75, -0.25,  0.25])

Vergleichen Sie dieses Ergebnis mit der Lösung des Systems mit scipy.linalg.solve

>>> solve(circulant(c), b)
array([ 0.75, -0.25,  0.25])

Ein singuläres Beispiel

>>> c = np.array([1, 1, 0, 0])
>>> b = np.array([1, 2, 3, 4])

Der Aufruf von solve_circulant(c, b) löst einen LinAlgError aus. Für die Kleinste-Quadrate-Lösung verwenden Sie die Option singular='lstsq'

>>> solve_circulant(c, b, singular='lstsq')
array([ 0.25,  1.25,  2.25,  1.25])

Vergleich mit scipy.linalg.lstsq

>>> x, resid, rnk, s = lstsq(circulant(c), b)
>>> x
array([ 0.25,  1.25,  2.25,  1.25])

Ein Broadcasting-Beispiel

Angenommen, wir haben die Vektoren zweier zirkulanter Matrizen, gespeichert in einem Array der Form (2, 5), und drei b-Vektoren, gespeichert in einem Array der Form (3, 5). Zum Beispiel:

>>> c = np.array([[1.5, 2, 3, 0, 0], [1, 1, 4, 3, 2]])
>>> b = np.arange(15).reshape(-1, 5)

Wir möchten alle Kombinationen von zirkulanten Matrizen und b-Vektoren lösen, wobei das Ergebnis in einem Array der Form (2, 3, 5) gespeichert wird. Wenn wir die Achsen von c und b ignorieren, die die Vektoren der Koeffizienten enthalten, haben die Sammlungen die Formen (2,) bzw. (3,), die für Broadcasting nicht kompatibel sind. Um ein Broadcast-Ergebnis mit der Form (2, 3) zu erhalten, fügen wir eine triviale Dimension zu c hinzu: c[:, np.newaxis, :] hat die Form (2, 1, 5). Die letzte Dimension enthält die Koeffizienten der zirkulanten Matrizen, daher können wir bei der Verwendung von solve_circulant das Standard-Argument caxis=-1 verwenden. Die Koeffizienten der b-Vektoren befinden sich in der letzten Dimension des Arrays b, daher verwenden wir baxis=-1. Wenn wir das Standard-Argument outaxis verwenden, hat das Ergebnis die Form (5, 2, 3), daher verwenden wir outaxis=-1, um die Lösungsvektoren in der letzten Dimension zu platzieren.

>>> x = solve_circulant(c[:, np.newaxis, :], b, baxis=-1, outaxis=-1)
>>> x.shape
(2, 3, 5)
>>> np.set_printoptions(precision=3)  # For compact output of numbers.
>>> x
array([[[-0.118,  0.22 ,  1.277, -0.142,  0.302],
        [ 0.651,  0.989,  2.046,  0.627,  1.072],
        [ 1.42 ,  1.758,  2.816,  1.396,  1.841]],
       [[ 0.401,  0.304,  0.694, -0.867,  0.377],
        [ 0.856,  0.758,  1.149, -0.412,  0.831],
        [ 1.31 ,  1.213,  1.603,  0.042,  1.286]]])

Prüfung durch Lösung eines Paares von c- und b-Vektoren (vgl. x[1, 1, :])

>>> solve_circulant(c[1], b[1, :])
array([ 0.856,  0.758,  1.149, -0.412,  0.831])