2016-07-22 15 views
18

Tôi gặp sự cố khi tính toán với matlab. Tôi biết rằng "pi" là số thực và không chính xác. Vì vậy, trong MATLAB sin(pi) không chính xác bằng không. Câu hỏi của tôi là nếu "pi" là không chính xác thì tại sao sin(pi/2) là chính xác bằng 1.tại sao trong matlab sin (pi) là không chính xác nhưng tội lỗi (pi/2) là chính xác?

sin(pi) -> không phải là chính xác + Nhà của pi. nhưng sin(pi/2) chính xác bằng 1

Tôi thắc mắc và bối rối!

+0

Không chính xác 1 nhưng lỗi thực sự quá nhỏ để được thể hiện. –

+0

Nhưng MATLAB hiển thị chính xác 1. –

+2

thử 'sin (sym ('pi'))' và xem http://www2.math.umd.edu/~jmr/241/introsession.html – Malick

Trả lời

6

Tôi không biết một cách chính xác rằng Matlab tính toán sin(x) - nhưng bạn có thể điều tra này bằng cách tính toán nó bằng cách sử dụng chuỗi lũy thừa, tức là

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

Biến này vào một số mã Matlab chúng tôi đại diện nó bằng cách:

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 

Chạy mã này cho cả x=pix=pi/2 bạn có thể thấy rằng x=pi/2 hội tụ vào kết quả chính xác (trong vòng lỗi eps) khá nhanh (9 lần lặp) - trong khi x=pi trường hợp không hội tụ trong cùng một khung thời gian.

Điều hữu ích cần lưu ý là tại 9 lần lặp lại giai thừa cuối cùng được tính toán trong giai thừa (19). Giai thừa tiếp theo sẽ được tính toán trong chuỗi này là 21. Đây là giai thừa cuối cùng có thể được biểu diễn với độ chính xác 100% do độ chính xác gấp đôi (xem help factorial). Vì vậy, tôi nghĩ rằng những gì đang xảy ra là đối với pi/2, giải pháp toán học hội tụ trên 1 đến trong chính xác gấp đôi nhanh hơn là trường hợp pi. Trong thực tế, trường hợp pi không thể hội tụ hoàn toàn do những hạn chế trong toán học và độ chính xác có thể được lưu trữ trong một kết quả chính xác gấp đôi.

Có nói rằng tất cả các sin(pi) là trong vòng eps vì vậy bạn nên sử dụng thực tế đó cho các mục đích của bạn.

tôi đã sao chép kết quả tôi nhận được bên dưới (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

Bao gồm đầu ra tiêu chuẩn của lời gọi với 'pi' và' pi/2' sẽ đẹp. Có phải là tài liệu mà thuật toán cho tội lỗi được sử dụng nội bộ trong MATLAB? –

+1

Xong. Tôi không biết thuật toán Matlab sử dụng nội bộ. Có thể nó sử dụng kết hợp các thuật toán khác nhau tùy thuộc vào giá trị được yêu cầu và nền tảng, v.v ... (xem [câu trả lời này cho một câu hỏi tương tự trong C++] (http://stackoverflow.com/questions/2284860/how-does -c-compute-sin-và-other-math-functions) – matlabgui

2

Lý do là, rằng sin(pi)=0.0, vì vậy mọi lỗi nhỏ không có vấn đề nhỏ như thế nào là được rất lớn so với 0 và do đó có thể nhìn thấy.

Khác biệt, đối với sin(pi/2)=1: nếu thuật toán tạo ra lỗi nhỏ hơn eps (khoảng 2.220446e-16), bạn sẽ không thấy lỗi này vì 1+eps=1.

Lỗi này một phần là kết quả của đầu vào không chính xác (pi giá trị không chính xác) và một phần là kết quả của vòng kết thúc trong quá trình tính toán. Người ta phải nhìn sâu vào mã để làm cho nó đúng.

Một yếu tố quan trọng khác chính là chức năng.Xét tuyên truyền lỗi bằng cách nhìn vào loạt của Taylor cho pipi/2 chúng ta có thể thấy:

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) 

Rõ ràng: nếu dx khoảng eps, so với các lỗi do các đầu vào không chính xác sẽ vào khoảng eps*eps và do đó không hiển thị so với 1.