Số lượng gần đúng của Dottie


13

Số Dottie là điểm cố định của hàm cosine hoặc giải pháp cho phương trình cos (x) = x . 1

Nhiệm vụ của bạn sẽ là tạo mã xấp xỉ hằng số này. Mã của bạn phải đại diện cho một hàm lấy một số nguyên làm đầu vào và xuất ra một số thực. Giới hạn chức năng của bạn khi đầu vào tăng lên phải là số Dottie.

Bạn có thể xuất ra dưới dạng phân số, số thập phân hoặc biểu diễn đại số của một số. Đầu ra của bạn phải có khả năng chính xác tùy ý, phao và đôi không đủ cho thử thách này. Nếu ngôn ngữ của bạn không có khả năng số chính xác tùy ý, thì bạn phải thực hiện chúng hoặc chọn ngôn ngữ mới.

Đây là một câu hỏi vì vậy câu trả lời sẽ được tính bằng byte, với ít byte hơn sẽ tốt hơn.

Lời khuyên

Một cách tính hằng số là lấy bất kỳ số nào và liên tục áp dụng cosin cho nó. Khi số lượng ứng dụng có xu hướng vô cùng, kết quả có xu hướng về điểm cố định của cosin.

Đây là một xấp xỉ khá chính xác của số.

0.739085133215161

1: Ở đây chúng ta sẽ lấy cosin theo radian


Vì vậy, nếu chúng ta đang sử dụng Python, chúng ta phải thực hiện kiểu nhập hoặc nhập riêng Decimal?
Ông Xcoder

Làm thế nào chính xác phải đệ trình của chúng tôi là?
Ông Xcoder

Hướng dẫn đến Jelly để đánh cắp ÆẠȷ¡nhận ra nó không hợp lệ. Đã thử Brachylog; oh không Brachylog thậm chí không làm nổi.
Erik the Outgolfer

@ Mr.Xcoder Họ chỉ phải chính xác không có triệu chứng.
Đăng Rock Garf Hunter

1
Tôi muốn thấy điều này trong Haskell, APL, và một số hương vị Lisp.
Đánh dấu C

Câu trả lời:


6

MATL , 34 30 19 byte

Giảm 11 byte nhờ vào sự gia tăng !

48i:"'cos('wh41hGY$

Các số thập phân cuối cùng trong đầu ra có thể được tắt. Tuy nhiên, số lượng các số liệu chính xác bắt đầu từ bên trái tăng theo đầu vào và kết quả hội tụ đến hằng số thực tế.

Hãy thử trực tuyến!

Giải trình

Đối với đầu vào n và bắt đầu từ x = 1, điều này áp dụng hàm

              x ↦ cos ( x )

với n -digit biến chính xác số học n lần.

48         % Push 48, which is ASCII for '1': initial value for x as a string
i:"        % Do n times, where n is the input
  'cos('   %   Push this string
  w        %   Swap. Moves current string x onto the top of the stack
  h        %   Concatenate
  41       %   Push 41, which is ASCII for ')'
  h        %   Concatenate. This gives the string 'cos(x)', where x is the
           %   current number
  GY$      %   Evaluate with variable-prevision arithmetic using n digits
           %   The result is a string, which represents the new x
           % End (implicit). Display (implicit). The stack contains the last x

Tại sao không chỉ áp dụng nó n lần với độ chính xác n chữ số? Điều này có vẻ quá phức tạp.
Sanchise

Điều này thật phi thường. Tôi muốn xem nó trong APL.
Đánh dấu C



3

GNU bc -l, 30

Điểm bao gồm +1 cho -lcờ đến bc.

for(a=1;a/A-b/A;b=c(a))a=b
a

Dòng mới cuối cùng là quan trọng và cần thiết.

Hãy thử trực tuyến .

-l làm 2 việc:

  • cho phép thư viện "toán học", bao gồm cả c()cos (x)
  • đặt độ chính xác (tỷ lệ) thành 20 vị trí thập phân ( bccó tính toán chính xác tùy ý)

Tôi không thực sự rõ ràng về yêu cầu chính xác. Như vậy, chương trình này tính đến 20 chữ số thập phân. Nếu cần một độ chính xác khác, thì scale=n;cần phải chèn vào lúc bắt đầu chương trình, trong đó nsố lượng vị trí thập phân. Tôi không biết liệu tôi có nên thêm điểm này vào điểm số của mình hay không.

Cũng lưu ý rằng đối với một số số vị trí thập phân (ví dụ 21, nhưng không phải 20), phép tính dao động ở hai bên của giải pháp trong chữ số cuối cùng. Do đó, khi so sánh các lần lặp hiện tại và trước đây, tôi chia cả hai bên cho 10 ( A) để xóa chữ số cuối cùng.


3

Toán học, 22 byte

Nest[Cos@#&,0,9#]~N~#&

đầu vào

[100]

đầu ra

0,739085132321160


2

R (+ Rmpfr), 55 byte

function(n,b=Rmpfr::mpfr(1,n)){for(i in 1:n)b=cos(b);b}

Dennis hiện đã thêm Rmpfr vào TIO để điều này sẽ hoạt động; thêm một số trường hợp thử nghiệm.

Giải trình:

Mất mã tôi đã viết từ thách thức này để đánh giá cos nlần khởi điểm 1, nhưng trước tiên tôi xác định chính xác tôi muốn các giá trị để được bằng cách tạo ra một đối tượng bcủa lớp mpfrvới giá trị 1và độ chính xác n, n>=2vì vậy chúng tôi có được chính xác hơn khi chúng ta đi cùng.

Hãy thử trực tuyến!


3
Thử lại. :) Trong tương lai, nếu thiếu bất cứ điều gì từ TIO, đừng ngần ngại gửi tin nhắn trong talk.tryitonline.net .
Dennis

@Dennis Cảm ơn bạn! Tôi sẽ ghi nhớ điều đó trong tương lai!
Giuseppe



1

K: 6 byte

  _cos/1
0.7390851

f/áp dụng fcho đến khi nó đạt đến một điểm cố định.


0

Python - 89 byte

Sử dụng mô-đun thập phân.

from decimal import*
import math
lambda n:reduce(lambda a,b:Decimal(math.cos(a)),[1]*n,1)

84 byte bằng cách kết hợp nhập khẩu.
Arnold Palmer

0

Perl 5, 41 byte

use bignum;sub f{$_[0]?cos(f($_[0]-1)):0}

Bignum là cần thiết cho độ chính xác tùy ý. Xác định hàm f áp dụng đệ quy cosine đến 0 N lần.

TIO dường như không có bignum nên không có liên kết :(


0

Toán học 44 byte

FindRoot[Cos@x-x,{x,0},WorkingPrecision->#]&

FindRoot sử dụng phương pháp của Newton theo mặc định.


0

Python 2, 86 byte

import math as m,decimal as d
def f(x,n):return f(d.Decimal(m.cos(x)),n-1)if n else x

Phiên bản mới sử dụng mẹo được cung cấp.

Python 2, 105 byte

import math as m,decimal as d
def f(x,n):return d.Decimal(f(x+(m.cos(x)-x)/(m.sin(x)+1),n-1))if n else x

Sử dụng phương pháp và hàm đệ quy của Newton để tính giá trị. xlà giá trị ban đầu và nlà giới hạn đệ quy.


Kiểu float dựng sẵn của Python không có độ chính xác vô hạn, do đó chức năng của bạn không thực sự không có triệu chứng.
Đăng Rock Garf Hunter

Cảm ơn, tốt để biết. Tôi đoán là đã sửa, không còn ngắn nữa tho :)
SydB

Mẹo được cung cấp trong câu hỏi có lẽ sẽ ngắn hơn phương pháp của Newton.
Đăng Rock Garf Hunter

Cảm ơn một lần nữa, có vẻ như tôi đã quá say mê với toán học ưa thích.
SydB

0

Tiên đề, 174 byte

f(n:PI):Complex Float==(n>10^4=>%i;m:=digits(n+10);e:=10^(-n-7);a:=0;repeat(b:=a+(cos(a)-a)/(sin(a)+1.);if a~=0 and a-b<e then break;a:=b);a:=floor(b*10^n)/10.^n;digits(m);a)

vô ý và bình luận

-- Input: n:PI numero di cifre
-- Output la soluzione x a cos(x)=x con n cifre significative dopo la virgola
-- Usa il metodo di Newton a_0:=a  a_(n+1)=a_n-f(a_n)/f'(a_n)
fo(n:PI):Complex Float==
  n>10^4=>%i
  m:=digits(n+10)
  e:=10^(-n-7)
  a:=0     -- Punto iniziale
  repeat
     b:=a+(cos(a)-a)/(sin(a)+1.)
     if a~=0 and a-b<e then break
     a:=b
  a:=floor(b*10^n)/10.^n
  digits(m)
  a

các kết quả:

(3) -> for i in 1..10 repeat output[i,f(i)]
   [1.0,0.7]
   [2.0,0.73]
   [3.0,0.739]
   [4.0,0.739]
   [5.0,0.73908]
   [6.0,0.739085]
   [7.0,0.7390851]
   [8.0,0.73908513]
   [9.0,0.739085133]
   [10.0,0.7390851332]
                                                               Type: Void
           Time: 0.12 (IN) + 0.10 (EV) + 0.12 (OT) + 0.02 (GC) = 0.35 sec
(4) -> f 300
   (4)
  0.7390851332 1516064165 5312087673 8734040134 1175890075 7464965680 635773284
  6 5488354759 4599376106 9317665318 4980124664 3987163027 7149036913 084203157
  8 0440574620 7786885249 0389153928 9438845095 2348013356 3127677223 158095635
  3 7765724512 0437341993 6433512538 4097800343 4064670047 9402143478 080271801
  8 8377113613 8204206631
                                                      Type: Complex Float
                                   Time: 0.03 (IN) + 0.07 (OT) = 0.10 sec

Tôi sẽ sử dụng phương thức Newton vì nó sẽ nhanh hơn 'phương thức cos (x) lặp lại'

 800   92x
1000  153x
2000  379x

ở đây trong cột thứ nhất có số chữ số và trong cột thứ hai có bao nhiêu phương thức Newton nhanh hơn sử dụng phương thức cos (x) lặp lại ở đây. Buổi sáng tốt lành

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.