The Cornu Spiral dapat dihitung dengan menggunakan metode Feynman untuk integral lintasan propagasi cahaya. Kami akan memperkirakan integral ini menggunakan diskresi berikut.
Pertimbangkan cermin seperti pada gambar ini, di mana S
sumber cahaya dan P
titik di mana kita mengumpulkan cahaya. Kami menganggap cahaya memantul dalam sinar lurus dari S
ke setiap titik di cermin dan kemudian ke titik P
. Kami membagi cermin menjadi N
segmen, dalam contoh ini 13, berlabel A
untuk M
, sehingga panjang jalan cahaya R=SN+NP
, di mana SN
adalah jarak dari S
segmen cermin N
, dan sama untuk P
. ( Perhatikan bahwa dalam gambar jarak titik S
dan P
ke cermin telah diperpendek banyak, untuk tujuan visual. Blok Q
agak tidak relevan, dan ditempatkan murni untuk memastikan refleksi melalui cermin, dan menghindari cahaya langsung dari S
keP
. )
Untuk bilangan gelombang tertentu k
, fasor sinar cahaya dapat dihitung sebagai exp(i k R)
, di mana i
adalah unit imajiner. Merencanakan semua fasor ini dari ujung ke ujung dari segmen cermin kiri ke kanan mengarah ke spiral Cornu. Untuk 13 elemen dan nilai yang dijelaskan di bawah ini memberikan:
Untuk besar N
, yaitu banyak segmen cermin, spiral mendekati spiral Cornu "benar". Lihat gambar ini menggunakan berbagai nilai untuk N
:
Tantangan
Untuk yang diberikan N
biarkan x(n)
menjadi pusat x- koordinat segmen cermin ke- n ( n = 0,1,2,...,N
):
x(n) := n/N-0.5
Membiarkan SN(n)
menjadi jarak S = (-1/2, 1000)
ke segmen cermin ke-n:
SN(n) := sqrt((x(n)-(-1/2))^2 + 1000^2)
dan demikian pula
NP(n) := sqrt((x(n)-1/2)^2 + 1000^2)
Jadi total jarak yang ditempuh oleh sinar ke- n adalah
R(n) := SN(n) + NP(n)
Kemudian kita mendefinisikan fasor (bilangan kompleks) dari sinar cahaya melalui segmen cermin ke- n sebagai
P(n) = exp(i * 1e6 * R(n))
Kami sekarang mempertimbangkan jumlah kumulatif (sebagai perkiraan untuk integral)
C(n) = P(0)+P(1)+...+P(n)
Tujuannya sekarang adalah memetakan kurva linier piecewise melalui titik-titik (C(0), C(1), ..., C(n))
, di mana bagian imajiner C(n)
harus diplot terhadap bagian aslinya.
The masukan harus jumlah elemen N
, yang memiliki minimal 100 dan maksimal minimal 1 juta elemen (lebih tentu saja diperbolehkan).
The keluaran harus plot atau gambar dalam format apapun minimal 400 × 400 piksel, atau menggunakan grafis vektor. Warna garis, skala sumbu dll tidak penting, asalkan bentuknya terlihat.
Karena ini adalah kode-golf, kode terpendek dalam byte akan menang.
Harap dicatat bahwa ini bukan spiral Cornu yang sebenarnya, tetapi perkiraan untuk itu. Integral jalur awal telah diperkirakan dengan menggunakan perkiraan Fresnel, dan cermin keduanya tidak memiliki panjang yang tak terbatas dan tidak mengandung jumlah segmen yang tak terbatas, serta disebutkan tidak dinormalisasi oleh amplitudo dari masing-masing sinar.
sumber
n
mulai dari1
, tetapi dalam perjanjian dengan Luis dan flawr, yang merupakan satu-satunya penjawab pada saat perubahan, saya memperbaikinya dari0
, yang menjadikan cermin simetris dan sesuai dengan sisa tantangan. Permintaan maaf.Jawaban:
MATL ,
292625 byteTerima kasih kepada @Adriaan selama 3 byte!
Berikut ini contoh dengan input
365
366
... karena hari ini adalah ulang tahun pertama MATL! (dan 2016 adalah tahun kabisat; terima kasih kepada @MadPhysicist untuk koreksi).Atau coba di MATL online! (kompiler eksperimental; menyegarkan halaman jika tidak berhasil).
Penjelasan
sumber
MATLAB,
88 8481 79 byteTerima kasih @LuisMendo untuk -3 byte, dan @Adriaan untuk -2 byte!
Fungsi
g
adalah fungsi jarak yang kita gunakan dalamSN
danNP
, danh
melakukan sisa perhitungan ditambah plot.f
fungsi sebenarnya yang kita inginkan dan menghasilkan vektor yang kita butuhkan.Ini adalah output untuk
N=1111
sumber
GeoGebra , 107 byte
Setiap baris dimasukkan secara terpisah ke bilah input. Input diambil dari kotak input.
Berikut adalah gif dari eksekusi:
Bagaimana itu bekerja
Memasukkan
1
dan1E6
secara implisit memberikan nilai kepadaa
danb
masing - masing. Selanjutnya,InputBox[a]
perintah membuat kotak input dan mengaitkannya dengana
.Sequence
Perintah dalam iterate atas nilai integer darik
dari0
kea
inklusif. Untuk setiap nilaik
, jarak yang diperlukan dihitung menggunakan ekspresi((k/a)^2+b)^.5+((k/a-1)^2+b)^.5)
. Ini kemudian dikalikan dengani*b
, di manai
unit imajiner, dane
dinaikkan ke hasilnya. Ini menghasilkan daftar bilangan kompleks.Setelah ini, bagian luar
Sequence
melakukan penjumlahan kumlatif dengan beralih lebih dari nilai integer daril
dari1
hinggaa
inklusif. Untuk setiap nilail
,l
elemen pertama dari daftar dijumlahkan menggunakanSum
perintah, sekali lagi menghasilkan daftar bilangan kompleks.GeoGebra memperlakukan bilangan kompleks
a + bi
sebagai intinya(a, b)
. Oleh karena itu, bilangan kompleks dapat diplot menggunakanPolyline
perintah, yang menggabungkan semua titik dalam daftar bilangan kompleks dengan segmen garis lurus.sumber
R,
102 8280 byteSunting: menghapus fungsi untuk menghitung jarak
Sunting2: Melihat jawaban yang hampir identik oleh @Plannapus (oh well)
Sunting3: Disimpan 2 byte berkat @Plannapus juga
Untuk
N=1000
kita dapatkan:sumber
x
lagi tanda kurung :N=scan();x=1:N/N;plot(cumsum(exp((sqrt(x^2+1e6)+sqrt((x-1)^2+1e6))*1e6i)),t="l")
R,
868381 byteTerima kasih @JarkoDubbeldam untuk 3 byte tambahan.
Untuk N = 1000:
sumber
plot(cumsum(exp(1e6i*(sqrt(1e6+(0:(N<-scan())/N)^2)+sqrt(1e6+(0:N/N-1)^2)))),t="l")
menghemat beberapa byteMathematica 89 Bytes (87 karakter)
Pemakaian:
hasil panen
sumber