พล็อตเกลียว Cornu


33

Cornu เกลียวสามารถคำนวณได้โดยใช้วิธีการหลักการของปริพันธ์เส้นทางของการขยายพันธุ์แสง เราจะประมาณค่าอินทิกรัลนี้โดยใช้การแยกย่อยดังต่อไปนี้

พิจารณากระจกเหมือนในภาพนี้Sแหล่งกำเนิดแสงและPจุดที่เรารวบรวมแสงอยู่ที่ไหน เราสันนิษฐานว่าแสงกระเด้งในรังสีเรย์จากSจุดหนึ่งไปยังอีกจุดหนึ่งในกระจกแล้วให้ชี้Pไปที่ เราแบ่งกระจกเข้าไปในNกลุ่มในตัวอย่างนี้ 13 ป้ายAไปMเพื่อให้ความยาวของเส้นทางของแสงR=SN+NPซึ่งSNเป็นระยะทางจากSการแบ่งกลุ่มกระจกและคล้ายกันสำหรับN P( โปรดทราบว่าในภาพระยะห่างของจุดSและPกับกระจกได้ถูกทำให้สั้นลงมากสำหรับจุดประสงค์ในการมองเห็นบล็อกQค่อนข้างไม่เกี่ยวข้องและวางไว้อย่างหมดจดเพื่อให้แน่ใจว่าการสะท้อนผ่านกระจกและหลีกเลี่ยงแสงโดยตรงจากSถึงP. )

กระจกสะท้อนแสง

จำนวนคลื่นที่กำหนดเฟสเซอร์ของรังสีของแสงสามารถคำนวณได้ซึ่งเป็นหน่วยจินตภาพ พล็อตทั้งหมดนี้มุ่งหน้าไปทางหางจากส่วนกระจกซ้ายไปทางขวานำไปสู่เกลียว Cornu สำหรับ 13 องค์ประกอบและค่าที่อธิบายไว้ด้านล่างนี้จะให้:kexp(i k R)i

ป้อนคำอธิบายรูปภาพที่นี่

สำหรับขนาดใหญ่Nนั่นคือส่วนกระจกจำนวนมากเกลียวจะเข้าหาเกลียว Cornu ที่ "จริง" ดูภาพนี้โดยใช้ค่าต่างๆสำหรับN:

ป้อนคำอธิบายรูปภาพที่นี่

ท้าทาย

สำหรับการNอนุญาตที่กำหนดให้x(n)เป็นศูนย์กลางx -coordinate ของเซ็กเมนต์กระจกn -th ( n = 0,1,2,...,N):

x(n) := n/N-0.5

อนุญาตSN(n)เป็นระยะทางของS = (-1/2, 1000)ส่วนกระจก n-th:

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 -th เป็น

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 พิกเซลใด ๆ หรือการใช้กราฟิกแบบเวกเตอร์ สีของเส้นขนาดสเกลแกน ฯลฯ นั้นไม่สำคัญตราบใดที่รูปร่างนั้นมองเห็นได้

เนื่องจากนี่คือ code-golf รหัสที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ

โปรดทราบว่านี่ไม่ใช่เกลียว Cornu จริง แต่เป็นการประมาณให้ อินทิกรัลพา ธ เริ่มต้นได้รับการประมาณโดยใช้การประมาณเฟรสและกระจกนั้นไม่ได้มีความยาวไม่สิ้นสุดและไม่มีจำนวนเซ็กเมนต์ที่ไม่สิ้นสุดรวมทั้งที่กล่าวถึงมันไม่ได้ถูกทำให้เป็นมาตรฐานโดยแอมพลิจูดของรังสีแต่ละตัว


5
ฉันมีค่าnตั้งแต่1แต่ด้วยข้อตกลงกับ Luis และข้อบกพร่องที่เป็นผู้ตอบเพียงคนเดียวในเวลาที่มีการเปลี่ยนแปลงฉันแก้ไขให้ถูกต้อง0ซึ่งทำให้กระจกสมมาตรและสอดคล้องกับความท้าทายที่เหลือ ขอโทษ.
Adriaan

คำตอบ:


20

MATL , 29 26 25 ไบต์

ขอบคุณ @Adriaan สำหรับการปิด 3 ไบต์!

Q:qG/q1e3YytP+1e6j*ZeYsXG

นี่คือตัวอย่างของการป้อนข้อมูล... เพราะวันนี้เป็นวันเกิดครั้งแรกของ MATL! (และปี 2559 เป็นปีอธิกสุรทินขอบคุณ @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

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)

ขอบคุณ @LuisMendo สำหรับ -3 ไบต์และ @Adriaan สำหรับ -2 ไบต์!

ฟังก์ชันgคือฟังก์ชันระยะทางที่เราใช้ในSNและNPและ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 ของการประมวลผล:

เกลียว Cornu

มันทำงานอย่างไร

การป้อน1และ1E6กำหนดค่าโดยนัยให้aและbตามลำดับ ถัดไปคำสั่งสร้างกล่องใส่และเชื่อมโยงกับInputBox[a]a

Sequenceคำสั่งinner ทำซ้ำมากกว่าค่าจำนวนเต็มkตั้งแต่จาก0ถึงaรวม สำหรับค่าของแต่ละระยะที่จำเป็นต้องมีการคำนวณโดยใช้การแสดงออกk ((k/a)^2+b)^.5+((k/a-1)^2+b)^.5)นี่คือการคูณด้วยi*bซึ่งiเป็นหน่วยจินตภาพและeถูกยกให้เป็นผลลัพธ์ นี่ทำให้รายการของจำนวนเชิงซ้อน

หลังจากนี้สิ่งที่อยู่ภายนอกจะSequenceทำการรวมยอดบวกด้วยการวนซ้ำค่าจำนวนเต็มของlจาก1ถึงaรวม สำหรับแต่ละค่าขององค์ประกอบlแรกlของรายการจะถูกรวมเข้าด้วยกันโดยใช้Sumคำสั่งอีกครั้งเพื่อให้ได้รายการของตัวเลขที่ซับซ้อน

GeoGebra ถือว่าจำนวนเชิงซ้อนเป็นจุดa + bi (a, b)ดังนั้นตัวเลขที่ซับซ้อนสามารถพล็อตโดยใช้Polylineคำสั่งซึ่งรวมจุดทั้งหมดในรายการหมายเลขที่ซับซ้อนที่มีส่วนของเส้นตรง


5

R, 102 82 80 ไบต์

แก้ไข: ยกเลิกฟังก์ชั่นสำหรับการคำนวณระยะทาง

แก้ไข 2: สังเกตเห็นคำตอบที่เกือบเหมือนกันโดย @Plannapus (ทำได้ดีมาก)

แก้ไข 3: บันทึก 2 ไบต์ด้วย @Plannapus เช่นกัน

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 = 1,000:

N = 1e3


ว้าวคำตอบ 2 R ภายใน 2 นาที มันแปลกฉันลองแบบเดียวกันและไม่สามารถใช้งานได้ แต่มันก็ใช้ได้ดีสำหรับฉัน: S ยังไงก็ทำได้ดี!
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.