2016-07-22 29 views
18

Ich habe ein Problem in der Berechnung mit matlab. Ich weiß, dass "pi" eine Floating-Nummer ist und nicht genau ist. Also, in Matlab sin(pi) ist nicht genau Null. Meine Frage ist, wenn „pi“ ist dann nicht exakt, warum sin(pi/2) genau gleich 1.warum in Matlab ist Sünde (Pi) nicht genau, sondern Sünde (Pi/2) ist genau?

sin(pi) -> nicht exakt beacause von pi ist. aber sin(pi/2) ist genau gleich 1

Ich bin Wunder und verwirrt!

+0

Es ist nicht genau 1, aber der Fehler ist eigentlich zu klein, um dargestellt zu werden. –

+0

Aber Matlab zeigt genau 1. –

+2

versuchen Sie 'sin (sym ('pi'))' und sehen Sie http://www2.math.umd.edu/~jmr/241/introsession.html – Malick

Antwort

6

Ich weiß nicht, die genaue Art und Weise, dass Matlab sin(x) berechnet - aber Sie können dies untersuchen, indem sie mit Hilfe der Potenzreihe zu berechnen, dh

sin x = x - (x^3)/3! + (x^5)/5! - (x^7)/7! + (x^9)/9! ... 

Drehen dieses in eine Matlab-Code wir vertreten durch:

clc 
x = pi;  % or x = pi/2 
res = x; 
factor = -1; 
for ii=3:2:19 
    res = res + factor*power(x,ii)/factorial(ii); 
    factor = factor*-1; 
    fprintf ('iteration %2i sin(x)=%1.16f\n', (ii-1)/2, res); 
end 
res 

Ausführen dieses Code für beide x=pi und x=pi/2 können Sie sehen, dass die x=pi/2 auf das richtige Ergebnis konvergiert (im eps-Fehler) recht schnell (9 Iterationen) - während die x=pi Fall konvergiert nicht im selben Zeitrahmen.

Es ist nützlich zu beachten, dass bei 9 Iterationen die letzte Fakultät, die in Fakultät (19) berechnet wird. Der nächste Faktor, der in dieser Sequenz berechnet wird, ist 21. Dies ist der letzte Faktor, der aufgrund der doppelten Genauigkeit mit 100% Genauigkeit dargestellt werden kann (siehe help factorial).

Also ich denke, was passiert ist, dass für Pi/2 die mathematische Lösung auf 1 bis innerhalb der doppelten Präzision schneller, dass der Pi Fall konvergiert. Tatsächlich kann der Pi-Fall aufgrund von Einschränkungen in der Mathematik und der Genauigkeit, die in einem Ergebnis mit doppelter Genauigkeit gespeichert werden können, nicht vollständig konvergieren.

Nach alledem, dass die sin(pi) innerhalb eps ist, sollten Sie diese Tatsache für Ihre Zwecke verwenden.

Ich habe die Ergebnisse, die ich unten bekommen kopiert (R2015b):

Results for PI/2 
iteration 1 sin(x)=0.9248322292886504 
iteration 2 sin(x)=1.0045248555348174 
iteration 3 sin(x)=0.9998431013994987 
iteration 4 sin(x)=1.0000035425842861 
iteration 5 sin(x)=0.9999999437410510 
iteration 6 sin(x)=1.0000000006627803 
iteration 7 sin(x)=0.9999999999939768 
iteration 8 sin(x)=1.0000000000000437 
iteration 9 sin(x)=1.0000000000000000 
Final Result: 1.0000000000000000 


Results for PI 
iteration 1 sin(x)=-2.0261201264601763 
iteration 2 sin(x)=0.5240439134171688 
iteration 3 sin(x)=-0.0752206159036231 
iteration 4 sin(x)=0.0069252707075051 
iteration 5 sin(x)=-0.0004451602382092 
iteration 6 sin(x)=0.0000211425675584 
iteration 7 sin(x)=-0.0000007727858894 
iteration 8 sin(x)=0.0000000224195107 
iteration 9 sin(x)=-0.0000000005289183 
Final Result: -0.0000000005289183 
+1

Die Standardausgabe von Invocations mit 'pi' und' pi/2' wäre nett. Ist dokumentiert, welcher Algorithmus für sin intern in MATLAB verwendet wird? –

+1

Fertig. Ich weiß nicht, welchen Algorithmus Matlab intern verwendet. Es ist möglich, dass es eine Kombination von verschiedenen Algorithmen verwendet, abhängig von dem angeforderten Wert und der Plattform etc ... (siehe [diese Antwort für eine ähnliche Frage in C++] (http://stackoverflow.com/questions/2284860/how-does -c-compute-sin-and-other-math-Funktionen) – matlabgui

2

Der Grund dafür ist, dass sin(pi)=0.0, also egal, jeder kleine Fehler, wie klein ist riesig im Vergleich zu 0 und somit sichtbar ist.

anders, für sin(pi/2)=1: wenn der Algorithmus einen Fehler kleiner als eps (um 2.220446e-16) erzeugt, würden Sie nicht diesen Fehler, weil 1+eps=1.

Der Fehler ist teilweise das Ergebnis der ungenauen Eingabe (pi Wert ist nicht exakt) und teilweise das Ergebnis der Abrundung während der Berechnung. Man muss tief in den Code schauen, um es richtig zu machen.

Ein weiterer wichtiger Faktor ist die Funktion selbst.Unter Berücksichtigung der Fehlerausbreitung durch an der Taylorreihe der Suche nach pi und pi/2 können wir sehen:

sin(pi+dx)=sin(pi)+cos(pi)dx+o(dx^2)=-dx+o(dx^2) 
sin(pi/2+dx)=sin(pi/2)+cos(pi/2)dx+o(dx^2)=1+o(dx^2) 

Es ist klar: wenn dx über eps ist, als der Fehler aufgrund der ungenauen Eingabe wird über eps*eps und damit sein nicht sichtbar im Vergleich zu 1.