Perkiraan arcsinc

9

Tujuannya sederhana: Keluarkan solusi nyata yang bukan nol xuntuk persamaan sin(x) = -mx, diberikan input m, dalam jumlah byte paling sedikit.

Spesifikasi:

  • Jawaban Anda harus benar hingga 3 angka penting.
  • Anda dapat menampilkan solusi nyata selain solusi sepele x=0. Anda dapat berasumsi mbahwa setidaknya ada satu solusi. Anda mungkin juga berasumsi m!=0.

Solusi python yang jelas suboptimal menggunakan gradient descent :

from math import *
from random import *
a=x=0.001
m = 5.
def dE(x):return 2*(sin(x)+m*x+1)*(cos(x)+m)
for i in xrange(1000): x-=dE(x)*a
print x

Uji kasus

-0.25 -> ±2.4746
-0.1  -> ±2.8523 or ±7.0682 or ±8.4232
 0.2  -> ±4.1046 or ±4.9063 
theideasmith
sumber
1
Pendekatan terbaik di sini adalah mencetak nilai tetap, meskipun Anda harus menentukan berapa banyak tempat desimal yang diperlukan. Saya sarankan memasukkan parameter input, ingin adipecahkan sin(x)=-ax. Tolong jangan katakan "Anda harus benar-benar menghitungnya", karena persyaratan seperti itu terlalu samar untuk bekerja.
xnor
Juga, x=0solusi sepele. Anda harus menentukan solusi mana yang Anda inginkan.
xnor
Anda memerlukan beberapa batasan pada m untuk menjamin solusi yang bukan nol.
xnor
m=0punya solusi ( x=kπuntuk integer k). Nilai-nilai myang tidak memiliki solusi nyata non-sepele adalah nilai-nilai yang terlalu jauh dari itu 0.
Peter Taylor
1
Apakah Anda hanya mencari solusi bernilai nyata atau apakah solusi bernilai kompleks diizinkan juga?
mil

Jawaban:

1

ised : 32 28 byte

Menggunakan iterasi Newton mulai dari π:

{:x-{sinx+$1*x}/{cosx+$1}:}:::pi

Argumen dilewatkan $1, yang dapat diambil dari file, seperti ini:

ised --l inputfile.txt 'code'

Versi yang sedikit kurang stabil, tetapi lebih pendek:

{:{x-tanx}/{1+$1/cosx}:}:::pi

Kadang-kadang ia melemparkan peringatan batas iterasi tetapi akurasi tampaknya baik-baik saja mempertimbangkan kondisinya.

Versi Unicode (bytecount yang sama):

{λ{x-tanx}/{1+$1/cosx}}∙π

Mulai dari 4 memotong byte lain dan tampaknya konvergen ke nilai yang sama

{λ{x-tanx}/{1+$1/cosx}}∙4
orion
sumber
8

Haskell, 34 byte

f m=until(\x->sin x< -m*x)(+1e-3)0

Menghitung xdari 0 hingga 0,001 hingga sin(x)< -m*x.

Contoh Ouput

f -0.2 ->   2.595999999999825
f -0.1 ->   2.852999999999797
f  0.0 ->   3.141999999999765
f  0.1 ->   3.4999999999997256
f  0.2 ->   4.1049999999997056
Tidak
sumber
Bagaimana dengan m=-0.1?
Peter Taylor
@PeterTaylor Catatan yakin jika itu diperlukan, tetapi memberi 2.853, yang terlihat benar.
xnor
Tentu saja, keduanya fungsi yang aneh jadi jika ada solusi ada solusi positif. Doh.
Peter Taylor
Mengapa Anda menjawab tantangan yang Anda tahu tidak jelas?
Mego
2

Mathematica, 28 byte

x/.FindRoot[Sinc@x+#,{x,1}]&

Mencari akar numerik dari tebakan awal x=1. Kasus uji:

% /@ {-0.25, -0.1, 0.2}
(* {2.47458, 2.85234, 4.10462} *)

sumber
1

C, 99 byte

#include<math.h>
float f(float m){float x=1,y;do{x=(y=sin(x)+m*x)+x;}while(fabs(y)>1e-4);return x;}

ungolfed:

#include<math.h>
float f(float m){
 float x=1,y;
 do{x=(y=sin(x)+m*x)+x;}while(fabs(y)>1e-4);
 return x;
}
Karl Napf
sumber
1

MATL , 17 byte

`@2e3/tY,wG_*>}4M

Ini menggunakan pencarian linear pada sumbu nyata positif, jadi lambat. Semua test case berakhir dalam 1 menit dalam kompiler online.

Cobalah online!

Penjelasan

`         % Do...while
  @       %   Push iteration index, starting at 1
  2e3/    %   Divide by 2000
  t       %   Duplicate
  Y,      %   Sine
  w       %   Swap
  G_*     %   Multiply by minus the input
  >       %   Does the sine exceed that? If so, next iteration
}         % Finally (execute after last iteration, before exiting loop)
   4M     %   Push input of sine function again
          % Implicit end
          % Implicit display
Luis Mendo
sumber
1

C ++ 11, 92 91 byte

-1 byte untuk digunakan #import

#import<cmath>
using F=float;F f(F m,F x=1){F y=sin(x)+m*x;return fabs(y)>1e-4?f(m,x+y):x;}
Karl Napf
sumber
0

Python 2, 81 78 byte

Iterasi fixpoint

Sebagai lambda rekursif

from math import*
f=lambda m,x=1:abs(sin(x)+m*x)>1e-4and f(m,sin(x)+m*x+x)or x

Sebagai pengulangan (81 byte):

from math import*
m=input()
x=1
while abs(sin(x)+m*x)>1e-4:x=sin(x)+m*x+x
print x
Karl Napf
sumber
0

Mathematica, 52 byte

NSolve[Sin@x==-x#,x,Reals][[;;,1,2]]~DeleteCases~0.&

Fungsi anonim. Mengambil angka sebagai input, dan mengembalikan daftar angka sebagai output. Hanya menggunakan NSolveuntuk menyelesaikan persamaan perkiraan.

LegionMammal978
sumber
Jika Anda menggantinya Sin@x==-x#dengan Sinc@x==-#Anda dapat menghapusnya dengan~DeleteCases~0.
0

Aksioma, 364 byte

bisezione(f,a,b)==(fa:=f(a);fb:=f(b);a>b or fa*fb>0=>"fail";e:=1/(10**(digits()-3));x1:=a;v:=x2:=b;i:=1;y:=f(v);if(abs(y)>e)then repeat(t:=(x2-x1)/2.0;v:=x1+t;y:=f(v);i:=i+1;if i>999 or t<=e or abs(y)<e then break;if fb*y<0 then(x1:=v;fa:=y)else if fa*y<0 then(x2:=v;fb:=y)else break);i>999 or abs(y)>e=>"fail";v)
macro g(m) == bisezione(x+->(sin(x)+m*x), 0.1, 4.3)

ungolf

bisezione(f,a,b)==
    fa:=f(a);fb:=f(b)
    a>b or fa*fb>0=>"fail"
    e:=1/(10**(digits()-3))
    x1:=a;v:=x2:=b;i:=1;y:=f(v)
    if(abs(y)>e) then
      repeat
        t:=(x2-x1)/2.0;v:=x1+t;y:=f(v);i:=i+1
        if i>999 or t<=e or abs(y)<e then break
        if      fb*y<0 then(x1:=v;fa:=y)
        else if fa*y<0 then(x2:=v;fb:=y)
        else break
    i>999 or abs(y)>e=>"fail"
    v

macro g(m) == bisezione(x+->(sin(x)+m*x), 0.1, 4.3)

hasil

(3) -> g(0.2)
   AXIOM will attempt to step through and interpret the code.
   (3)  4.1046198505 579058527
                                                              Type: Float
(4) -> g(-0.1)
   (4)  2.8523418944 500916556
                                                              Type: Float
(5) -> g(-0.25)
   (5)  2.4745767873 698290098
                                                              Type: Float
RosLuP
sumber
0

Haskell, 50 byte

Saya baru belajar tentang metode newton di kelas calc saya, jadi begini haskellmenggunakan metode newton.

f m=foldl(\x _->x-(sin x+m*x)/(cos x+m))0[1..10]

theideasmith
sumber