Ich portiere einen Algorithmus, der in Matlab funktioniert, um zu numpy und beobachtete ein seltsames Verhalten. Der relevante Codesegment istMatlab/Octave/Numpy numerischen Unterschied
P = eye(4)*1e20;
A = [1 -0.015 -0.025 -0.035; 0.015 1 0.035 -0.025; 0.025 -0.035 1 0.015; 0.035 0.025 -0.015 1];
V1 = A*(P*A')
V2 = (A*P)*A'
Dieser Code, wenn ich mit Matlab laufen, bietet die folgenden Matrizen:
V1 = 1.0021e+20 0 -8.0000e+00 0
0 1.0021e+20 0 0
-8.0000e+00 0 1.0021e+20 0
0 0 0 1.0021e+20
V2 = 1.0021e+20 0 -8.0000e+00 0
0 1.0021e+20 0 0
-8.0000e+00 0 1.0021e+20 0
0 0 0 1.0021e+20
Man beachte, daß V1 und V2 gleich sind, wie erwartet.
Wenn derselbe Code in Octave läuft, bietet es:
V1 = 1.0021e+20 4.6172e+01 -1.3800e+02 1.8250e+02
-4.6172e+01 1.0021e+20 -1.8258e+02 -1.3800e+02
1.3801e+02 1.8239e+02 1.0021e+20 -4.6125e+01
-1.8250e+02 1.3800e+02 4.6125e+01 1.0021e+20
V2 = 1.0021e+20 -4.6172e+01 1.3801e+02 -1.8250e+02
4.6172e+01 1.0021e+20 1.8239e+02 1.3800e+02
-1.3800e+02 -1.8258e+02 1.0021e+20 4.6125e+01
1.8250e+02 -1.3800e+02 -4.6125e+01 1.0021e+20
In numpy das Segment
from numpy import array, dot, eye
A = numpy.array([[1, -0.015, -0.025, -0.035],[0.015, 1, 0.035, -0.025],[0.025, -0.035, 1, 0.015],[0.035, 0.025, -0.015, 1]])
P = numpy.eye(4)*1e20
print numpy.dot(A,numpy.dot(P,A.transpose()))
print numpy.dot(numpy.dot(A,P),A.transpose())
die
[[ 1.00207500e+20 4.61718750e+01 -1.37996094e+02 1.82500000e+02]
[ -4.61718750e+01 1.00207500e+20 -1.82582031e+02 -1.38000000e+02]
[ 1.38011719e+02 1.82386719e+02 1.00207500e+20 -4.61250000e+01]
[ -1.82500000e+02 1.38000000e+02 4.61250000e+01 1.00207500e+20]]
[[ 1.00207500e+20 -4.61718750e+01 1.38011719e+02 -1.82500000e+02]
[ 4.61718750e+01 1.00207500e+20 1.82386719e+02 1.38000000e+02]
[ -1.37996094e+02 -1.82582031e+02 1.00207500e+20 4.61250000e+01]
[ 1.82500000e+02 -1.38000000e+02 -4.61250000e+01 1.00207500e+20]]
ausgibt, wird so sowohl Octave und numpy bietet die gleiche Antwort, aber es ist sehr verschieden von Matlab. Der erste Punkt ist, dass V1! = V2, was nicht richtig erscheint. Der andere Punkt ist, dass, obwohl die nicht diagonalen Elemente viele Größenordnungen kleiner sind als die diagonalen Elemente, dies in meinem Algorithmus ein Problem verursacht.
Kennt jemand, wie sich numpy und Octave auf diese Weise verhalten?
Das ist nicht ganz richtig. Es gibt einen float128-Datentyp, aber seine Genauigkeit ist nicht immer gut definiert, denke ich. – seberg
@Sebastian, Ich fand überhaupt keine Referenz auf einen Float128-Typ - nur complex128 (weil das sind zwei Float64 als eine Zahl mit dem Real-und Imaginärteil gesehen). http://docs.scipy.org/doc/numpy/user/basics.types.html – Lucero
Ja ... das ist, weil float128 nur verfügbar ist, abhängig von dem Computer, auf dem es läuft. Aber auf dem üblichen PC ist es. – seberg