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 = bfürx, wobeiCeine 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
LinAlgErrorausgelö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_circulantzurü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
circulantzirkulä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
solveundcirculantausscipy.linalgstammen.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 einenLinAlgErroraus. Für die Kleinste-Quadrate-Lösung verwenden Sie die Optionsingular='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 vonsolve_circulantdas Standard-Argumentcaxis=-1verwenden. Die Koeffizienten der b-Vektoren befinden sich in der letzten Dimension des Arrays b, daher verwenden wirbaxis=-1. Wenn wir das Standard-Argument outaxis verwenden, hat das Ergebnis die Form (5, 2, 3), daher verwenden wiroutaxis=-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])