vpa variable long increase aumentar matlab function precision pi

variable - ¿Por qué en matlab el pecado(pi) no es exacto pero el pecado(pi/2) es exacto?



variable pi en matlab (2)

La razón es que el sin(pi)=0.0 , por lo que cada pequeño error, sin importar cuán pequeño sea, es enorme comparado con 0 y, por lo tanto, es visible.

De manera diferente, para sin(pi/2)=1 : si el algoritmo produce un error más pequeño que eps (alrededor de 2.220446e-16 ), no verá este error porque 1+eps=1 .

El error es en parte el resultado de la entrada imprecisa (el valor pi no es exacto) y en parte el resultado del redondeo durante el cálculo. Uno tiene que mirar profundamente en el código para hacerlo bien.

Otro factor importante es la propia función. Teniendo en cuenta la propagación del error al mirar las series de Taylor para pi y pi/2 podemos ver:

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)

Está claro: si dx es sobre eps , el error debido a la entrada imprecisa será sobre eps*eps y, por lo tanto, no será visible en comparación con 1 .

Tengo un problema en el cálculo con matlab . Sé que " pi " es un número flotante y no es exacto. Por lo tanto, en matlab sin(pi) no es exactamente cero. Mi pregunta es si " pi " no es exacto, entonces ¿por qué el sin(pi/2) es exactamente igual a 1?

sin(pi) -> no es exacto debido a que pi . pero el sin(pi/2) es exactamente igual a 1

¡Estoy maravillado y confundido!


No sé la forma exacta en que Matlab calcula sin(x) , pero puede investigarlo calculando usando la serie de potencias, es decir

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

Convirtiéndolo en algún código de Matlab lo representamos por:

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

Al ejecutar este código para x=pi y x=pi/2 , puede ver que x=pi/2 converge en el resultado correcto (dentro del error eps) con bastante rapidez (9 iteraciones), mientras que el caso x=pi no lo hace. convergen en el mismo marco de tiempo.

Es útil señalar que en 9 iteraciones, el último factorial que se calcula en factorial (19). El siguiente factorial que se calcularía en esta secuencia es 21. Este es el último factorial que se puede representar con el 100% de precisión debido a la doble precisión (ver help factorial ).

Así que creo que lo que está sucediendo es que para pi / 2 la solución matemática converge en 1 con una precisión doble más rápida que en el caso pi. De hecho, el caso pi no puede converger completamente debido a las limitaciones en las matemáticas y la precisión que se puede almacenar en un resultado de doble precisión.

Habiendo dicho todo lo que el sin(pi) está dentro de eps , debes usar ese hecho para tus propósitos.

He copiado los resultados que obtengo a continuación (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