Tìm kiếm một thuật toán arcsin


7

Có ai có một thuật toán đơn giản để tính toán một arcsine chính xác hợp lý không? Theo "đơn giản", ý tôi là một số loại đa thức yêu cầu <= 5 bội cho mỗi mẫu đầu ra. Và theo "chính xác một cách hợp lý", ý tôi là một thuật toán có lỗi không quá 10% khi đối số đầu vào gần bằng hoặc trừ đi. Tôi đã tìm kiếm trên web một lúc nhưng không thấy có gì hữu ích ngay lập tức.


Điều này có thể đưa ra một số ý tưởng stackoverflow.com/questions/5920467/ từ
geometrikal

Nhưng tại sao không chỉ là một bảng tra cứu?
geometrikal

Tôi đang nghĩ về việc thực hiện nơi bộ nhớ khả dụng bị hạn chế một cách đau đớn. Vì vậy, tôi đã không xem xét bất kỳ giải pháp 'bảng tra cứu' nào. Cảm ơn những suy nghĩ của bạn.
Richard Lyons

Bạn có cho phép căn bậc hai? Do hoạt động của chức năng gần với±1(độ dốc vô hạn), một xấp xỉ đa thức không hoạt động tốt ở đó.
Yves Daoust

Điều gì về CORDIC, chỉ mất một vài phép cộng và phép trừ và không nhân.
mattgately

Câu trả lời:


5

Đây chỉ là một phiên bản đa thức :

arcsin(x)= =x+12x33+1324x55+135246x77
function y = arcsin_test3(x)
    y = x.*(1+x.*x.*(1/6+ x.*x.*(3/(2*4*5) + x.*x.*((1*3*5)/(2*4*6*7)))))
endfunction

có vẻ như có năm bội số (giả sử bạn có thể lưu kết quả của x.*x) và ba lần bổ sung.

scilabcốt truyện là:

nhập mô tả hình ảnh ở đây

Top là scilab's asinvs thế này, phía dưới là lỗi giữa hai người.


Câu trả lời gốc

Căn bậc hai ở đây có thể là một rắc rối, nhưng tôi nghĩ tôi sẽ viết nó lên vì nó trông giống như niềm vui. :-)

Trang này gợi ý:

từ trang 81 của Sổ tay về các hàm toán học, của Milton Abramowitz và Irene Stegun:

arcsin(x)= =π/2-1-x(một0+một1*x+một2*x2+một3*x3),
Ở đâu
một0= =1.5707288một1= =-0,2121144một2= =0,0742610một3= =-0,0187293

Tôi đã thực hiện điều này scilabvà nó hoạt động tốt, ngoại trừ xung quanhx= =-1. Chỉ phản ánh0x1 qua -1x0 làm cho một xấp xỉ tốt hơn nhiều.

Các chương trình âm mưu đầu scilabs'asin chức năng so với xấp xỉ trên (màu đỏ nét đứt) chống lại sự thay đổi của tôi trong màu xanh lá cây.

Biểu đồ phía dưới hiển thị lỗi cho thay đổi của tôi (vẽ sơ đồ đó và bản gốc trên cùng một trục có nghĩa là màu xanh lá cây trông như không ở mọi nơi).

nhập mô tả hình ảnh ở đây

// 25770
function y = arcsin_test(x)
    a0 = 1.5707288
    a1 = -0.2121144
    a2 = 0.0742610
    a3 = -0.0187293

    xx = abs(x)

    y = %pi/2 - sqrt(1-x).*(a0 + a1*x + a2.*x.*x + a3.*x.*x.*x)

endfunction

function y = arcsin_test2(x)
    a0 = 1.5707288
    a1 = -0.2121144
    a2 = 0.0742610
    a3 = -0.0187293

    xx = abs(x)

    y = %pi/2 - sqrt(1-xx).*(a0 + a1*xx + a2.*xx.*xx + a3.*xx.*xx.*xx)

    y = y.*sign(x); 
endfunction

x = [-1: .0100001 : 1];

clf
subplot(211)
plot(x,arcsin_test2(x),'g.');
plot(x,arcsin_test(x),'r:');
plot(x,asin(x))
subplot(212)
//plot(x,(arcsin_test(x) - asin(x)),'r:')
plot(x,(arcsin_test2(x) - asin(x)),'g.')

2
"Sổ tay về các hàm toán học" thích cuốn sách đó
geometrikal

1
Ôi bắn. Tôi thấy trang web của hàm 'nghịch đảo' wiki trong quá trình tìm kiếm trên web của tôi nhưng tôi đã không cuộn xuống đủ xa để xem tài liệu 'loạt vô hạn'! Xấu hổ với tôi Peter K., đó là một người khác tôi nợ bạn '. (Vấn đề ban đầu của tôi là cải thiện hiệu suất của bộ phân biệt kỹ thuật số khác biệt trung tâm, mà tôi tin rằng, có thể được thực hiện bằng cách thực hiện thao tác arcsine.)
Richard Lyons

Vâng, nhưng Rick, bạn không thể làm một loạt vô tận. nếu bạn sẽ làm cho nó hữu hạn, thì các hệ số tối ưu sẽ không chính xác là những gì bạn nhận được từ việc cắt xén chuỗi vô hạn. nếu bạn có MATLAB (hiện tại họ có giấy phép "sử dụng tại nhà" tương đối rẻ), tôi có thể gửi cho bạn mã MATLAB để thực hiện trao đổi Remez về chức năng của mong muốn của bạn.
robert bristow-johnson

1
CẬP NHẬT: Tôi đã có thể giải quyết vấn đề ban đầu của mình (tạo ra một bộ phân biệt kỹ thuật số rất đơn giản, đã cải thiện hiệu suất so với bộ phân biệt khác biệt trung tâm) mà không cần sử dụng hàm arcsin (). Tôi có thể đăng một blog tại dsprelated.com mô tả kết quả của tôi. Tôi cảm ơn mọi người ở đây vì sự giúp đỡ của họ!
Richard Lyons

3

tôi đã thực hiện khá tốt hồ quang() ở đây .

tôi nghĩ bạn có thể sử dụng danh tính:

arcsin(x)= =hồ quang(x1-x2)

để có được những gì bạn muốn.


Liên kết của bạn đến các chức năng khác nhau là Robert thú vị. Chỉ để cười khúc khích tôi đã cố gắng thực hiện hàm sqrt (1 + x). Thay vì sử dụng các giới hạn chính xác từ 0 đến 4, tôi đã bắt vít và sử dụng 1 đến 5. Tất nhiên tôi đã tính toán một kết quả không chính xác. Tuy nhiên, khi tôi nhân hai kết quả "không chính xác" của mình với hai kết quả chính xác. Thú vị nhỉ?
Richard Lyons

Rick, tôi khá chắc chắn rằng các chức năng là "chính xác" (hoặc chính xác hợp lý) được nêu như chúng có giới hạn của xnhư đã nêu. chox, nó chỉ tốt cho 1x2, vì vậy nếu bạn ở giữa 24, sau đó bạn sẽ phải có một chút không đổi ( 2) được lưu trữ trong đó và bạn sẽ cần biết sự khác biệt giữa số mũ chẵn 2 và một số mũ lẻ của 2.
robert bristow-johnson

Tôi cũng tin rằng chức năng của bạn là chính xác. Tôi chỉ đơn thuần là nhận xét về một lỗi 'giới hạn tổng kết' ngớ ngẩn mà tôi đã gây ra, và khi mắc lỗi, tôi đã tính toán một kết quả không chính xác. Nhưng tôi nhận thấy kết quả không chính xác của tôi là chính xác một nửa kết quả chính xác. Tôi chỉ nói rằng kết quả không chính xác của tôi có mối quan hệ "thú vị" với kết quả chính xác, chỉ vậy thôi. Xin lỗi vì sự nhầm lẫn Robert.
Richard Lyons

2

Phần trung tâm của đường cong không phải là một vấn đề thực sự vì nó khá tuyến tính và xấp xỉ Taylor với hai hoặc ba thuật ngữ là một điểm khởi đầu tốt (đa thức bình phương nhỏ nhất phù hợp hơn một chút).

Các bên có nhiều vấn đề hơn vì độ dốc vô hạn. Một cách để đối phó là thông qua biến đổi

arcsin(x)= =π2-arcsin(1-x2),

trong đó liên quan đến một căn bậc hai.


Nếu tranh luận của bạn z được biểu diễn bằng dấu phẩy động, một xấp xỉ nhanh của căn bậc hai có được bằng cách giảm một nửa số mũ và áp dụng một phép biến đổi tuyến tính cho lớp phủ.

Để cho z= =m2e, với 1m<2, sau đó z= =m2e/2. Bạn có thể ước chừngm bởi (2-1)(m+2).

  • lấy số mũ e ngoài (xóa nó mang lại đại diện của m);
  • nếu e là chẵn, tính toán (2-1)(m+2);
  • nếu e là số lẻ, tính toán 2(2-1)(m+2);
  • đặt số mũ e/2.

nhập mô tả hình ảnh ở đây


Tôi mong muốn được thử nghiệm với thuật toán căn bậc hai thú vị đó!
Richard Lyons

Với các hệ số này, sai số luôn dương. Bằng một điều chỉnh nhỏ, chúng ta có thể làm cho nó đối xứng và giảm một nửa lỗi tối đa.
Yves Daoust
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.