x^n+a_{n-1}x^{n-1}+\cdots+a_1x+a_0 =0
Ich stieß auf eine Situation, die ich lösen wollte. Ich habe das Gefühl, dass dies allgemein als Gleichung n-ter Ordnung bezeichnet wird. (Wird es auch eine einvariable algebraische Gleichung genannt?) Es ist bekannt, dass es für Personen ab Grad 5 keine algebraische Lösung gibt. Es scheint jedoch, dass die fünfte Ordnung unter Verwendung verschiedener Sonderfunktionen ausgedrückt werden kann und die ungefähre Lösung numerisch berechnet werden kann. Es scheint normal zu sein, numerische Berechnungen für die 4. Ordnung und höher zu verwenden. Es scheint, dass Matlab eine Funktion namens Roots hat, die numerische Berechnungen algebraischer Gleichungen durchführt, aber ich konnte keine Bibliothek in Python finden. Deshalb habe ich beschlossen, es umzusetzen.
Die Newton-Methode scheint bei der Suche nach einer Lösung an erster Stelle zu stehen, aber es scheint, dass die DKA-Methode als Algorithmus bekannt ist, der der Newton-Methode zum Finden der Lösung einer Gleichung n-ter Ordnung ähnlich ist. Die Implementierung dieses Algorithmus ist jedoch mühsam. Wenn Sie sich Matlab-Implementierung ansehen, können Sie eine Methode verwenden, die zur Berechnung des Eigenwerts führt. Es scheint zu geben. Diesmal habe ich mich dazu entschlossen. Bei der Berechnung von Eigenwerten nach Definition
\mathrm{det}(sI-A)=0
A=
\left(
\begin{array}{ccccc}
0 & 1 & 0&\ldots&0 \\
\vdots & \ddots & 1&\ddots&\vdots \\
\vdots & \ldots & \ddots&\ddots&0\\
0&\ldots&\ldots&0&1\\
-a_0&-a_1&\ldots&-a_{n-2}&-a_{n-1}
\end{array}
\right)
Die Eigengleichung hierfür lautet
|sI-A| = s^n+a_{n-1}s^{n-1}+a_{n-2}s^{n-2}+\ldots+a_1s+a_0
Wird sein. Wenn daher alle Eigenwerte der obigen Begleitmatrix für die Gleichung n-ter Ordnung mit einem beliebigen Koeffizienten berechnet werden, kann eine Lösung erhalten werden. Die zuerst eingeführte DKA-Methode finden Sie unter hier. Implementierung war ebenfalls ausgefallen.
n-poly.py
import numpy as np
def solve(vec,is_complex=False):
dim =len(vec)
if is_complex:
A = np.zeros((dim,dim),dtype=complex)
else:
A = np.zeros((dim,dim))
A[np.arange(dim-1),1+np.arange(dim-1)] =1
A[-1,:] = -vec
ans,vec = np.linalg.eig(A)
return ans
vec0 =np.array([-120,274,-225,85,-15])
vec1 =np.array([1,0])
vec2 =np.array([-1,5,-10,10,-5])
print(solve(vec0))
print(solve(vec1))
print(solve(vec2))
[ 5. 4. 3. 2. 1.]
[ 0.+1.j 0.-1.j]
[ 1.00079742+0.00057977j 1.00079742-0.00057977j 0.99969502+0.00093688j
0.99969502-0.00093688j 0.99901512+0.j ]
Beachten Sie, dass, wenn der Koeffizient eine imaginäre Zahl enthält, der Koeffizient in eine reelle Zahl umgewandelt wird, ohne is_complex auf True zu setzen. Wenn dtype = complex immer gesetzt ist, scheint es schwierig zu sein, den realen Eigenwert als realen Eigenwert zu berechnen, daher wird er normalerweise durch float berechnet (Unterscheidet sich der Algorithmus je nach dtype?)
Jedes Beispiel
(x-1)(x-2)(x-3)(x-4)(x-5)=x^5-15x^4+85x^3-225x^2+274x-120=0\\
x^2+1=(x-i)(x+i)=0\\
(x-1)^5=0
Wird berechnet. Es ist ersichtlich, dass selbst Gleichungen fünfter Ordnung ohne Lösungsformel mit angemessener Genauigkeit berechnet werden, einschließlich mehrerer Lösungen.
Nachweis der Beziehung zwischen Begleitmatrix und charakteristischer Polyma
Recommended Posts