Cornu sarmalının çizilmesi


33

Cornu spiral ışığın yayılma yolu integraller için Feynman yöntemi kullanılarak hesaplanabilir. Aşağıdaki ayrıklamayı kullanarak bu integrali tahmin edeceğiz.

Bu görüntüdeki gibi bir ayna düşünün S, ışık kaynağı nerede ve ışık Ptopladığımız nokta. Işığın Saynada her noktadan düz bir ışın içinde sıçradığını ve sonra noktaya geldiğini varsayıyoruz P. Aynayı N, bu örnekte etiketli Aolan 13 numaralı bölüme ayırırız .M , ışığın yol uzunluğunun ayna parçasına olan mesafenin R=SN+NPolduğu ve benzer olduğu şekilde bölümlere ayırırız . ( Not görüntü noktalarının mesafe olduğu ve ayna blok. Görme amaçlı, bir çok kısaltılmıştır oldukça önemsizdir ve ayna ile yansıma sağlar ve doğrudan ışık önlemek için tamamen yerleştirilmiş içinSNSNPSPQSP. )

Yansıtan ayna

Belirli bir dalga numarası için k için , bir ışık ışınının fazörü , hayali birimin exp(i k R)olduğu gibi hesaplanabilir i. Tüm bu fazörlerin sol ayna bölümünden sağa doğru baştan sona çizilmesi Cornu sarmalına yönlendirir. 13 element ve aşağıda açıklanan değerler için:

görüntü tanımını buraya girin

Büyük için N , yani birçok ayna parçası için, spiral "gerçek" Cornu spiraline yaklaşır. Aşağıdakiler için çeşitli değerleri kullanarak bu resme bakın N:

görüntü tanımını buraya girin

Meydan okuma

Verilen için xN olalımx(n) ve -coordinate merkezi n -inci ayna segmentinde ( n = 0,1,2,...,N):

x(n) := n/N-0.5

N inci ayna bölümüne SN(n)olan mesafeye bakalım S = (-1/2, 1000):

SN(n) := sqrt((x(n)-(-1/2))^2 + 1000^2) 

ve benzer şekilde

NP(n) := sqrt((x(n)-1/2)^2 + 1000^2) 

Böylece toplam mesafe n. Işık ışını

R(n) := SN(n) + NP(n) 

Sonra n'den geçen ışık ışınının fazorunu (karmaşık bir sayı) tanımlarız. Ayna bölümünden

P(n) = exp(i * 1e6 * R(n)) 

Şimdi kümülatif toplamları değerlendiriyoruz (bir integralin yaklaşımı olarak)

C(n) = P(0)+P(1)+...+P(n)

Hedef şimdi noktalar boyunca parçalı bir doğrusal eğri çizmektir. (C(0), C(1), ..., C(n)) hayali kısmın C(n)gerçek kısmına karşı .

Giriş elemanlarının sayısı olmalıdır N100 bir minimum ve en az 1 milyon elemanlarının bir maksimum (daha ders izin ait) sahip olmasıdır.

Çıkış en az 400 x 400 piksel ya da vektör grafikleri kullanılarak, herhangi bir biçimde bir grafiğidir veya resim olmalıdır. Çizginin rengi, eksen skalası vb., Şekli görünür olduğu sürece önemsizdir.

Bu kod golf olduğundan, bayttaki en kısa kod kazanır.

Lütfen bunun gerçek bir Cornu spirali değil, buna yaklaştığını unutmayın. İlk yol integrali, Fresnel yaklaşımı kullanılarak yaklaştırılmıştır ve ayna, her ikisi de sonsuz uzunlukta değildir ve sonsuz sayıda parça içermez, bunun yanı sıra, tek tek ışınların genlikleri tarafından normalleştirilmemiştir.


5
Ben değerlerini vardı narasında değişen 1, ancak değişimin seferde yalnızca answerers vardı Luis ve flawr, mutabık i? Olmasını düzeltilmiş 0ayna simetrik hale getirir ve meydan okuma geri kalanı ile uyum göstermiştir. Özür.
Adriaan

Yanıtlar:


20

MATL , 29 26 25 bayt

@Adriaan'a 3 bayt için teşekkürler!

Q:qG/q1e3YytP+1e6j*ZeYsXG

İşte girişi olan bir örnek 365 366 ... çünkü bugün MATL'nin ilk doğum günü! (ve 2016 artık bir yıl; düzeltme için @MadPhysicist'e teşekkürler).

Veya çevrimiçi MATL'de deneyin ! (deneysel derleyici; çalışmıyorsa sayfayı yenileyin).

görüntü tanımını buraya girin

açıklama

Q:q    % Input N implicitly. Push range [0 1 ... N] (row vector)
G/     % Divide by N, element-wise
q      % Subtract 1. This gives NP projected onto the x axis for each mirror element
1e3    % Push 1000. This is NP projected onto the y axis
Yy     % Hypotenuse function: computes distance NP
tP     % Duplicate, reverse. By symmetry, this is the distance SN
+      % Add. This is distance SNP for each mirror element (row vector)
1e6j   % Push 1e6*1i
*      % Multiply
Ze     % Exponential
Ys     % Cumulative sum
XG     % Plot in the complex plane

8
En yakın havluyu kapar ve içine fırlatır ...
Magic Octopus Urn

10
Doğum günün kutlu olsun MATL!
Suever

1
2016 artık bir yıl değil mi?
Mad

14

MATLAB, 88 84 81 79 bayt

g=@(x)hypot(1e3,x);h=@(x)plot(cumsum(exp(1e6i*(g(x)+g(1-x)))));f=@(N)h(0:1/N:1)

-3 bayt için @LuisMendo ve -2 bayt için @Adriaan!

Fonksiyon gbiz kullandığımız mesafe fonksiyonudur SNve NPve hhesaplama artı plotlamasının gerisini. fİstediğimiz gerçek fonksiyon ve ihtiyaç duyduğumuz vektörü üretir.

Bunun için çıktı N=1111

N = 1111 için çıkış


12

GeoGebra , 107 bayt

1
1E6
InputBox[a]
Polyline[Sequence[Sum[Sequence[e^(i*b(((k/a)^2+b)^.5+((k/a-1)^2+b)^.5)),k,0,a],l],l,1,a]]

Her satır ayrı ayrı giriş çubuğuna girilir. Giriş, bir giriş kutusundan alınır.

İşte yürütmenin bir gif:

Cornu sarmal

Nasıl çalışır

Girme 1ve 1E6örtük değerler atar ave bsırasıyla. Daha sonra, InputBox[a]komut bir giriş kutusu oluşturur ve onu ilişkilendirir.a .

İç Sequencekomut, karasındaki tamsayı değerlerini tekrar eder.0 ile akapsayıcı . Her değeri kiçin istenen mesafe, ifade kullanılarak hesaplanır ((k/a)^2+b)^.5+((k/a-1)^2+b)^.5). Bu daha sonra , hayali birim i*bnerede ivee ve sonuç için yükseltilir. Bu, karmaşık sayıların bir listesini verir.

Bundan sonra, dış Sequence, küme toplamını, tamsayı değerlerini yineleyerek gerçekleştirir.l gelen 1için adahildir. Her değer için l, llistenin ilk öğeleriSum komut yine karmaşık sayıların bir listesini verir.

GeoGebra karmaşık sayıyı a + binokta olarak kabul eder.(a, b) . Bu nedenle, karmaşık sayılar Polylinelistesindeki tüm noktaları düz çizgi bölümleriyle birleştiren komut kullanılarak karmaşık sayılar çizilebilir .


5

R ', 102 82 80 bayt

Düzenleme: mesafeyi hesaplamak için fonksiyonu hurdaya

Edit2: @Plannapus (ah iyi) tarafından neredeyse aynı bir cevap fark ettim

Edit3: @Plannapus sayesinde 2 bayt kaydedildi

N=scan();x=1:N/N;plot(cumsum(exp((sqrt(x^2+1e6)+sqrt((x-1)^2+1e6))*1e6i)),t="l")

İçin N=1000biz almak:

görüntü tanımını buraya girin


Eğer parantez içine gerekmez çünkü Aslında 80 bayt olarak düşük olarak gidebilir xartık:N=scan();x=1:N/N;plot(cumsum(exp((sqrt(x^2+1e6)+sqrt((x-1)^2+1e6))*1e6i)),t="l")
plannapus

4

R, 86 83 81 bayt

plot(cumsum(exp(1e6i*((1e6+(0:(N<-scan())/N)^2)^.5+(1e6+(0:N/N-1)^2)^.5))),t="l")

Fazladan 3 bayt için @JarkoDubbeldam teşekkürler.

N = 1000 için:

K = 1E3


Vay, 2 R 2 dakika içinde cevap veriyor. Garip, ben de denedim ama işe yaramadı, ama bu benim için iyi çalışıyor: S Her neyse, iyi iş!
JAD

Ayrıca, taramayı böyle yapmak plot(cumsum(exp(1e6i*(sqrt(1e6+(0:(N<-scan())/N)^2)+sqrt(1e6+(0:N/N-1)^2)))),t="l")bir kaç bayt kazandırır
JAD

1

Mathematica 89 Bayt (87 karakter)

Graphics[Line[ReIm/@Tr/@Table[E^(I*10^6*Tr[√(10^6+(-{0,1}+j/#)^2)]),{i,0,#},{j,0,i}]]]&

Kullanımı:

%@100

verim

görüntü tanımını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.