Корень спираль может быть вычислена с использованием методы Фейнман для интегралов по путям распространения света. Мы аппроксимируем этот интеграл, используя следующую дискретизацию.
Рассмотрим зеркало, как на этом изображении, где S
находится источник света и P
точка, где мы собираем свет. Мы предполагаем, что свет отражается прямым лучом от S
каждой точки в зеркале, а затем до точки P
. Разделим зеркало в N
сегментах, в данном примере 13, меченого A
с M
, так что длина пути света R=SN+NP
, где SN
это расстояние от S
до зеркального сегмента N
, и аналогичные для P
. ( Обратите внимание , что на изображении расстояния точек S
и P
к зеркалу было сокращено много, для визуальных целей. Блок Q
скорее не имеет значения, и помещает чисто , чтобы обеспечить отражение через зеркало, и избежать прямого света от S
доP
, )
Для заданного волнового числа Фазор луча света может быть вычислена как , где находится мнимая единица. Построение всех этих векторов от головы до хвоста от левого зеркального сегмента вправо приводит к спирали Корну. Для 13 элементов и значений, описанных ниже, это дает:k
exp(i k R)
i
Для больших N
, то есть множества зеркальных сегментов, спираль приближается к «истинной» спирали Корну. Посмотрите это изображение, используя различные значения для N
:
Вызов
Для данного N
пусть x(n)
будет x -координатный центр n-го зеркального сегмента ( n = 0,1,2,...,N
):
x(n) := n/N-0.5
Позвольте SN(n)
быть расстояние S = (-1/2, 1000)
до n-го зеркального сегмента:
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 пикселей или с использованием векторной графики. Цвет линии, масштаб осей и т. Д. Не важны, пока форма видна.
Поскольку это код-гольф, выигрывает самый короткий код в байтах.
Обратите внимание, что это не настоящая спираль Корну, а ее приближение. Начальный интеграл по траектории был аппроксимирован с использованием приближения Френеля, и зеркало не имеет бесконечной длины и не содержит бесконечного числа сегментов, а также упомянуто, что оно не нормируется по амплитудам отдельных лучей.
источник
n
диапазоне от1
, но, согласившись с Луисом и Флауром, которые были единственными ответчиками во время изменений, я исправил его, чтобы сделать так0
, чтобы зеркало было симметричным и соответствовало остальной части задачи. Извиняюсь.Ответы:
MATL ,
292625 байтСпасибо @Adriaan за 3 байта!
Вот пример с вводом ... потому что сегодня первый день рождения MATL! (и 2016 год високосный; спасибо @MadPhysicist за исправление).
365
366
Или попробуйте в MATL онлайн! (экспериментальный компилятор; обновите страницу, если она не работает).
объяснение
источник
MATLAB,
88 8481 79 байтовСпасибо @LuisMendo за -3 байта и @Adriaan за -2 байта!
Эта функция
g
является функцией расстояния, которую мы используем вSN
иNP
, иh
выполняет остальную часть вычисления плюс построение графика.f
фактическая функция, которую мы хотим, и она производит вектор, который нам нужен.Это выход для
N=1111
источник
GeoGebra , 107 байт
Каждая строка вводится отдельно в строку ввода. Ввод берется из поля ввода.
Вот рисунок исполнения:
Как это работает
Ввод
1
и1E6
неявное назначение значенийa
иb
соответственно. ЗатемInputBox[a]
команда создает поле ввода и связывает его сa
.Внутренняя
Sequence
команда перебирает целочисленные значения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
команды, которая объединяет все точки в списке комплексных чисел с отрезками прямых.источник
R,
102 8280 байтРедактировать: отменить функцию для расчета расстояния
Edit2: заметил почти идентичный ответ @Plannapus (о хорошо)
Edit3: 2 байта также сохранены благодаря @Plannapus
Ибо
N=1000
мы получаем:источник
x
:N=scan();x=1:N/N;plot(cumsum(exp((sqrt(x^2+1e6)+sqrt((x-1)^2+1e6))*1e6i)),t="l")
R
868381 байтСпасибо @JarkoDubbeldam за дополнительные 3 байта.
Для N = 1000:
источник
plot(cumsum(exp(1e6i*(sqrt(1e6+(0:(N<-scan())/N)^2)+sqrt(1e6+(0:N/N-1)^2)))),t="l")
сохраняет несколько байтовMathematica 89 байт (87 символов)
Использование:
доходность
источник