Cornu 나선 플로팅


33

Cornu 나선은 빛의 전파 경로 적분을위한 파인만의 방법을 사용하여 계산할 수 있습니다. 우리는 다음과 같은 이산화를 사용하여이 적분을 근사합니다.

이 이미지에서와 같이 거울을 고려하십시오. S광원은 P어디에 있고 우리가 빛을 수집하는 지점입니다. 우리는 빛 S이 거울의 각 점에서 직선으로 튀어 나온다고 가정합니다 P. 우리는 미러로 분할 N표지 본 예 13에서, 세그먼트 AM광의 광로 길이가되도록, R=SN+NP여기서 SN부터의 거리 S미러 세그먼트 N와 유사 P. ( 이미지에서 점 SP거울까지 의 거리는 시각적 목적으로 많이 단축되었습니다. 블록 Q은 관련이 없으며 거울을 통한 반사를 보장하기 위해 순전히 배치되며 거울을 통해 직접 빛을 피 S합니다.P. )

거울을 반영

소정 파수 들어 페이저 광의 광선과 같이 계산 될 수있다 , 여기서 허수 단위이다. 이 모든 페이저를 왼쪽 거울 세그먼트에서 오른쪽으로 머리부터 꼬리까지 플로팅하면 Cornu 나선으로 이어집니다. 13 개의 요소와 아래에 설명 된 값의 경우 다음이 제공됩니다.kexp(i k R)i

여기에 이미지 설명을 입력하십시오

N, 즉 많은 거울 세그먼트의 경우, 나선형은 "진정한"Cornu 나선형에 접근합니다. 다양한 값을 사용하여이 이미지를보십시오 N.

여기에 이미지 설명을 입력하십시오

도전

주어진 들어 N보자 x(n)(X) 의 중심 -coordinate N 번째 미러 세그먼트 ( n = 0,1,2,...,N) :

x(n) := n/N-0.5

n 번째 미러 세그먼트까지 SN(n)의 거리를 보자 S = (-1/2, 1000).

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

그리고 비슷하게

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

따라서 n 번째 광선으로 이동 한 총 거리는

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

그런 다음 n 번째 미러 세그먼트를 통과하는 광선의 위상 (복소수)을 다음과 같이 정의합니다.

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

이제 누적 합계를 적분에 대한 근사로 간주합니다.

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

목표는 이제 점을 통해 (C(0), C(1), ..., C(n))부분 선형 곡선을 플로팅합니다 . 여기서 가상 부분은 C(n)실제 부분에 대해 플롯되어야합니다.

입력 요소의 수 있어야한다 N(100)의 최소 및 적어도 1 백만 엘리먼트의 최대 (기타 물론 가능하다)를 갖는다.

출력은 적어도 400 × 400 화소, 또는 벡터 그래픽을 사용하는 임의의 형식으로 플롯 또는 이미지이어야한다. 모양이 표시되는 한 선의 색, 축 배율 등은 중요하지 않습니다.

이것이 코드 골프이기 때문에 바이트 단위의 가장 짧은 코드가 승리합니다.

이것은 실제 Cornu 나선이 아니라 근사치입니다. 초기 경로 적분은 프레 넬 근사법을 사용하여 근사화되었으며, 거울의 길이는 무한하지 않으며 무한한 수의 세그먼트를 포함하지 않으며, 개별 광선의 진폭에 의해 정규화되지 않습니다.


5
나는 n~에서 범위 의 값을 1가졌지 만 변경 당시 유일한 응답자 인 Luis와 flawr와 동의하여에서 그것을 수정 0하여 거울을 대칭으로 만들고 나머지 도전과 일치합니다. 사과.
Adriaan

답변:


20

MATL , 29 26 25 바이트

3 바이트 할인 된 @Adriaan에게 감사드립니다!

Q:qG/q1e3YytP+1e6j*ZeYsXG

오늘은 MATL의 첫 번째 생일이기 때문에 입력 예제가 있습니다! (2016 년은 윤년이며, 정정을위한 @MadPhysicist 덕분에).365 366

또는 MATL 온라인 에서 사용해보십시오 ! (실험 컴파일러; 작동하지 않으면 페이지를 새로 고치십시오).

여기에 이미지 설명을 입력하십시오

설명

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
가장 가까운 수건을 잡고 그것을 던져 ...
Magic Octopus Urn

10
생일 축하해 MATL!
Suever

1
2016 년은 윤년이 아닙니까?
Mad Physicist

14

MATLAB, 88 84 81 79 바이트

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

-3 바이트는 @LuisMendo, -2 바이트는 @Adriaan에게 감사드립니다!

함수 gSNand NP에서 사용하는 거리 함수 이며 h나머지 계산과 플로팅을 수행합니다. f원하는 실제 함수와 필요한 벡터를 생성합니다.

이것은에 대한 출력입니다 N=1111

N = 1111에 대한 출력


12

지오 지브라 , 107 바이트

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

각 줄은 입력 막대에 별도로 입력됩니다. 입력은 입력 상자에서 가져옵니다.

실행의 gif는 다음과 같습니다.

Cornu 나선

작동 원리

입력 11E6암시하기에 값을 지정 a하고 b각각. 다음으로, InputBox[a]명령은 입력 상자를 작성하고와 연결합니다 a.

내부 Sequence명령은 값의 정수 이상으로 반복 k에서 0a포함. 의 각 값에 k대해 필요한 거리는 표현식을 사용하여 계산됩니다 ((k/a)^2+b)^.5+((k/a-1)^2+b)^.5). 그런 다음 i*b여기 i에 허수 단위 인 을 곱하고 e결과를 얻습니다. 이렇게하면 복소수 목록이 생성됩니다.

그 후, 외부 Sequence수행의 정수 값 이상 반복하여 cumlative 합산 l에서 1a포함. 의 각 값에 대해 명령을 사용하여 목록 l의 첫 번째 l요소를 합산하여 Sum복소수 목록을 다시 생성합니다.

GeoGebra는 복소수를 a + bi점으로 취급합니다 (a, b). 따라서 복소수는 Polyline명령을 사용하여 플로팅 할 수 있습니다.이 명령은 복소수 목록의 모든 점을 직선 세그먼트로 결합합니다.


5

R, 102 82 80 바이트

편집 : 거리 계산 기능을 폐기했습니다.

Edit2 : @Plannapus의 답변이 거의 동일합니다 (오 잘)

Edit3 : @Plannapus 덕분에 2 바이트를 절약했습니다.

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

들어 N=1000우리 얻을 :

여기에 이미지 설명을 입력하십시오


실제로 당신은 x더 이상 괄호가 필요하지 않기 때문에 80 바이트까지 줄일 수 있습니다 .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 바이트

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

여분의 3 바이트에 대해 @JarkoDubbeldam에게 감사드립니다.

N = 1000의 경우 :

N = 1e3


와, 2 R이 2 분 안에 대답합니다. 이상하게도, 나는 똑같이 시도했지만 작동하지 못했지만 이것은 나에게 잘 작동합니다. : S 어쨌든, 잘했습니다!
JAD

또한 scan을 사용 plot(cumsum(exp(1e6i*(sqrt(1e6+(0:(N<-scan())/N)^2)+sqrt(1e6+(0:N/N-1)^2)))),t="l")하면 몇 바이트를 절약 할 수 있습니다.
JAD

1

매스 매 티카 89 바이트 (87 문자)

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

용법:

%@100

수확량

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.