Cornuスパイラルのプロット


33

コルニュスパイラルは、光伝播の経路積分のためのファインマンの方法を用いて算出することができます。次の離散化を使用して、この積分を近似します。

この画像のように鏡を考えてみましょう。ここSで、光源とP光を集めるポイントがあります。S鏡の各点から点へと直線光線で光が跳ね返ると仮定しますP。我々は、中にミラーを分割するN標識された本実施例13において、セグメントAへのM光の経路長であるように、R=SN+NPここで、SNからの距離であるSミラーセグメントにN、そしてための同様P。(画像中の点の距離ことを注意S及びPミラーには、ブロックが視覚的目的のために、多くの短縮されたQかなり無関係であり、ミラーを介して反射を確実にするために純粋に配置され、そしてからの直接光を避けるためSP

反射鏡

所与の波数ためフェーザ光線のように計算することができ、ここで、虚数単位です。これらすべてのフェーザーを左から右に向かって左右にプロットすると、Cornuスパイラルにつながります。13個の要素と、以下で説明する値の場合、次のようになります。kexp(i k R)i

ここに画像の説明を入力してください

大きいN、つまり多くのミラーセグメントの場合、スパイラルは「真の」Cornuスパイラルに近づきます。以下のさまざまな値を使用してこの画像を参照してくださいN

ここに画像の説明を入力してください

チャレンジ

指定Nされたlet に対して、n番目のミラーセグメントx(n)x座標の中心()を指定します。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)実数部に対してプロットされます。

入力要素の数であるべきでN100の最小値と少なくとも100万個の要素(複数許容勿論である)の最大値を有します。

出力は、少なくとも400×400画素、またはベクトルグラフィックスを使用して任意の形式でプロットまたはイメージであるべきです。形状が見える限り、線の色、軸のスケールなどは重要ではありません。

これはコードゴルフであるため、バイト単位の最短コードが優先されます。

これは実際のCornuスパイラルではなく、近似であることに注意してください。初期経路積分はフレネル近似を使用して近似されており、ミラーの長さは無限ではなく、セグメントの数も無限ではありません。また、個々の光線の振幅によって正規化されていません。


5
値はnからの範囲1でしたが、変更時に唯一の回答者であったLuisとflawrに同意して、fromに修正しました0。これにより、ミラーが対称になり、残りの課題に同意します。謝罪。
アドリアーン

回答:


20

MATL29 26 25バイト

@Adriaanに3バイトオフをありがとう!

Q:qG/q1e3YytP+1e6j*ZeYsXG

以下に入力の例を示します...今日はMATLの最初の誕生日だからです!(そして2016年はle年です。@ 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
最も近いタオルをつかみ、それを投げる
マジックタコ

10
ハッピーバースデーMATL!
Suever

1
2016年はle年ではありませんか?
マッド物理学者

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に感謝します!

この関数gは、SNNPで使用する距離関数であり、h残りの計算とプロットを行います。f必要な実際の関数と必要なベクトルを生成します。

これはの出力です N=1111

N = 1111の出力


12

GeoGebra、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は次のとおりです。

コルヌスパイラル

使い方

入力する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、結果に引き上げられます。これにより、複素数のリストが生成されます。

その後、アウターSequencelfromから1to aまでの整数値を反復処理することにより累積加算を実行します。の各値について、リストのl最初のl要素がSumコマンドを使用して合計され、再び複素数のリストが生成されます。

GeoGebraは複素数をa + bi点として扱い(a, b)ます。したがって、複素数Polylineは、複素数リストのすべてのポイントを直線セグメントで結合するコマンドを使用してプロットできます。


5

R、102 82 80バイト

編集:距離を計算するための関数を廃止しました

編集2:@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私たちを得ます:

ここに画像の説明を入力してください


あなたの周りの括弧を必要としないので、実際には80バイトという低い行くことができますxもう: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")

@JarkoDubbeldamに余分な3バイトをありがとう。

N = 1000の場合:

N = 1e3


わあ、2 Rが2分以内に答えます。奇妙なことですが、私は同じことを試みましたが、動作させることができませんでしたが、これは私にとってはうまくいきます:とにかく、良い仕事です!
JAD

また、のようなスキャンを使用してplot(cumsum(exp(1e6i*(sqrt(1e6+(0:(N<-scan())/N)^2)+sqrt(1e6+(0:N/N-1)^2)))),t="l")、いくつかのバイトを節約
JAD

1

Mathematica 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.