Tujuannya sederhana: Keluarkan solusi nyata yang bukan nol x
untuk 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 berasumsim
bahwa setidaknya ada satu solusi. Anda mungkin juga berasumsim!=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
a
dipecahkansin(x)=-ax
. Tolong jangan katakan "Anda harus benar-benar menghitungnya", karena persyaratan seperti itu terlalu samar untuk bekerja.x=0
solusi sepele. Anda harus menentukan solusi mana yang Anda inginkan.m=0
punya solusi (x=kπ
untuk integerk
). Nilai-nilaim
yang tidak memiliki solusi nyata non-sepele adalah nilai-nilai yang terlalu jauh dari itu0
.Jawaban:
ised :
3228 byteMenggunakan iterasi Newton mulai dari π:
Argumen dilewatkan
$1
, yang dapat diambil dari file, seperti ini:Versi yang sedikit kurang stabil, tetapi lebih pendek:
Kadang-kadang ia melemparkan peringatan batas iterasi tetapi akurasi tampaknya baik-baik saja mempertimbangkan kondisinya.
Versi Unicode (bytecount yang sama):
Mulai dari 4 memotong byte lain dan tampaknya konvergen ke nilai yang sama
sumber
Haskell, 34 byte
Menghitung
x
dari 0 hingga 0,001 hinggasin(x)< -m*x
.Contoh Ouput
sumber
m=-0.1
?2.853
, yang terlihat benar.Mathematica, 28 byte
Mencari akar numerik dari tebakan awal
x=1
. Kasus uji:sumber
C, 99 byte
ungolfed:
sumber
MATL , 17 byte
Ini menggunakan pencarian linear pada sumbu nyata positif, jadi lambat. Semua test case berakhir dalam 1 menit dalam kompiler online.
Cobalah online!
Penjelasan
sumber
C ++ 11,
9291 byte-1 byte untuk digunakan
#import
sumber
Python 2,
8178 byteIterasi fixpoint
Sebagai lambda rekursif
Sebagai pengulangan (81 byte):
sumber
Mathematica, 52 byte
Fungsi anonim. Mengambil angka sebagai input, dan mengembalikan daftar angka sebagai output. Hanya menggunakan
NSolve
untuk menyelesaikan persamaan perkiraan.sumber
Sin@x==-x#
denganSinc@x==-#
Anda dapat menghapusnya dengan~DeleteCases~0.
Aksioma, 364 byte
ungolf
hasil
sumber
Haskell, 50 byte
Saya baru belajar tentang metode newton di kelas calc saya, jadi begini
haskell
menggunakan metode newton.f m=foldl(\x _->x-(sin x+m*x)/(cos x+m))0[1..10]
sumber