Perkirakan angka Dottie


13

Angka Dottie adalah titik tetap dari fungsi cosinus, atau solusi untuk persamaan cos (x) = x . 1

Tugas Anda adalah membuat kode yang mendekati konstan ini. Kode Anda harus mewakili fungsi yang mengambil integer sebagai input dan menghasilkan bilangan real. Batas fungsi Anda saat input bertambah adalah angka Dottie.

Anda dapat menampilkan sebagai pecahan, desimal, atau representasi aljabar dari suatu angka. Output Anda harus mampu menjadi tepat sewenang-wenang, mengapung dan ganda tidak cukup untuk tantangan ini. Jika bahasa Anda tidak mampu menghasilkan angka presisi yang berubah-ubah, maka Anda harus mengimplementasikannya atau memilih bahasa baru.

Ini adalah pertanyaan sehingga jawaban akan dinilai dalam byte, dengan lebih sedikit byte yang lebih baik.

Kiat

Salah satu cara menghitung konstanta adalah dengan mengambil angka berapa pun dan berulang kali menerapkan kosinus ke sana. Karena jumlah aplikasi cenderung ke arah tak terbatas, hasilnya cenderung ke arah titik tetap kosinus.

Berikut adalah perkiraan angka yang cukup akurat.

0.739085133215161

1: Di sini kita akan mengambil cosinus dalam radian


Jadi, jika kita menggunakan Python, kita harus mengimplementasikan tipe kita sendiri atau mengimpor Decimal?
Tn. Xcoder

Seberapa akurat kiriman kita harus?
Tn. Xcoder

Pergi ke tutorial Jelly untuk mencuri ÆẠȷ¡menyadari itu tidak valid. Mencoba Brachylog; oh tidak, Brachylog bahkan tidak mengapung.
Erik the Outgolfer

@ Mr.Xcoder Mereka hanya harus akurat secara asimptotik.
Post Rock Garf Hunter

1
Saya ingin melihat ini di Haskell, APL, dan beberapa rasa Lisp.
Mark C

Jawaban:


6

MATL , 34 30 19 byte

Diskon 11 byte berkat Sanchises !

48i:"'cos('wh41hGY$

Angka desimal terakhir dalam output mungkin tidak aktif. Namun, jumlah angka yang benar mulai dari kiri meningkat dengan input, dan hasilnya menyatu dengan konstanta yang sebenarnya.

Cobalah online!

Penjelasan

Untuk input n , dan mulai dari x = 1, ini berlaku fungsi

              x ↦ cos ( x )

dengan n -digit variabel-presisi aritmatika n kali.

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

Mengapa tidak menerapkannya n kali saja pada presisi n digit? Ini tampaknya terlalu rumit.
Sanchises

Ini luar biasa. Saya ingin melihatnya di APL.
Mark C



3

GNU bc-l, 30

Skor termasuk +1 untuk -lbendera bc.

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

Baris terakhir final penting dan perlu.

Cobalah online .

-l melakukan 2 hal:

  • aktifkan pustaka "matematika", termasuk c()untuk cos (x)
  • set presisi (skala) ke 20 tempat desimal ( bcmemiliki perhitungan presisi arbitrer)

Saya tidak begitu jelas tentang persyaratan presisi. Karena, program ini menghitung hingga 20 tempat desimal. Jika diperlukan ketelitian yang berbeda, maka scale=n;perlu dimasukkan pada awal program, di mana njumlah tempat desimal. Saya tidak tahu apakah saya harus menambahkan ini ke skor saya atau tidak.

Perhatikan juga bahwa untuk beberapa angka tempat desimal (mis. 21, tetapi bukan 20), perhitungan berosilasi di kedua sisi solusi pada digit terakhir. Jadi dalam perbandingan iterasi saat ini dan sebelumnya, saya membagi kedua sisi dengan 10 ( A) untuk menghapus digit terakhir.


3

Mathematica, 22 byte

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

memasukkan

[100]

keluaran

0.73908513321516064165531208767387340401341175890075746496568063577328 \ 46548835475945993761069317665318


2

R (+ Rmpfr), 55 byte

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

Dennis sekarang telah menambahkan Rmpfr ke TIO sehingga ini akan berfungsi; menambahkan beberapa kasus uji.

Penjelasan:

Membawa kode saya tulis dari tantangan ini untuk mengevaluasi cos nkali mulai 1, tapi pertama saya menentukan presisi saya ingin nilai-nilai berada di dengan menciptakan sebuah objek bdari kelas mpfrdengan nilai 1dan presisi n, n>=2sehingga kita mendapatkan lebih presisi seperti yang kita pergi bersama.

Cobalah online!


3
Coba lagi. :) Di masa mendatang, jika ada yang hilang dari TIO, jangan ragu untuk mengirim pesan ke talk.tryitonline.net .
Dennis

@ Dennis Terima kasih! Saya akan mengingatnya di masa depan!
Giuseppe




0

Python - 89 byte

Menggunakan modul desimal.

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

84 byte dengan menggabungkan impor.
Arnold Palmer

0

Perl 5, 41 Bytes

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

Bignum diperlukan untuk presisi yang sewenang-wenang. Menentukan fungsi f yang secara berulang menerapkan cosinus hingga 0 N kali.

TIO sepertinya tidak memiliki bignum jadi tidak ada tautan :(


0

Mathematica 44 Bytes

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

FindRoot menggunakan metode Newton secara default.


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

Versi baru menggunakan tip yang disediakan.

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

Menggunakan metode Newton dan fungsi rekursif untuk menghitung nilai. xadalah nilai awal dan nmerupakan batas rekursi.


Tipe float built-in Python memang memiliki presisi yang tidak terbatas, sehingga fungsi Anda sebenarnya tidak asimptotik.
Posting Rock Garf Hunter

Terima kasih, senang tahu. Memperbaiki Saya kira, tidak terlalu singkat lagi :)
SydB

Tip yang disediakan dalam pertanyaan mungkin akan lebih pendek dari metode Newton.
Posting Rock Garf Hunter

Terima kasih sekali lagi, sepertinya saya terlalu terbawa oleh matematika mewah.
SydB

0

Aksioma, 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)

ungolfed dan berkomentar

-- 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

hasil:

(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

Saya akan menggunakan metode Newton karena akan lebih cepat daripada metode 'cos berulang (x)'

 800   92x
1000  153x
2000  379x

di mana di kolom pertama ada jumlah digit dan di kolom kedua ada berapa banyak metode Newton lebih cepat daripada menggunakan metode cos (x) berulang, di sini. Selamat pagi

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.