Длина дуги между точками на спирали Архимеда с использованием MATLAB или R

Мне нужно получить значения xy и вычислить длину дуги между каждым значением xy, поэтому значение длины для каждого значения в i сгенерировано приведенным ниже кодом (за исключением источника). Точки следуют по архимедовой спирали. У меня нет MATLAB, и я использую R, но самое близкое, что я могу интерпретировать, это пример MATLAB , найденный здесь с кредитом на Джоса. Ниже приведена модифицированная версия скрипта MATLAB для генерации данных xy :

r = 938; %outer radius
a = 0;    %inner radius
b = 7; %increment per rev
n = (r - a)./(b); %number  of revolutions
th = 2*n*pi;      %angle  
i = linspace(0,n,n*1000); 
x = (a+b*i).* cos(2*pi*i);
y = (a+b*i).* sin(2*pi*i);

и эквивалент R:

r <- 938 # outer radius                                     
a <- 0 # inner radius    
b <- 7 # increment per revolution
n <- (r - a)/b # number  of revolutions 
th <- 2*n*pi # angle
i <- seq(0, n, length.out = n*1000) # number of points per revolution
x <- (a+b*i) * cos(2*pi*i) 
y <- (a+b*i) * sin(2*pi*i)

Мое предположение состоит в том, что самый простой способ получить длину дуги между каждой точкой - это ввести i, x и y в таблицу MATLAB (фрейм данных в R). Самое близкое, что я нашел для расчета длины дуги, это формула для расчета общей длины. Я не могу интерпретировать математическую запись, поэтому не знаю, как ее реализовать или как изменить, чтобы вычислить длину дуги между каждой точкой. Используя пример первой спирали в приведенной выше ссылке для расчета общей длины, я попробовал:

sqrt((5 + 0.1289155 * 47.12389)^2 + (0.1289155)^2) * 47.12389

Ссылка выше говорит, что результат должен быть 378,8, но моя попытка возвращает 521,9324. Итак, как в MATLAB или R получается длина дуги между точками?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Точная формула длины с вашими обозначениями a (начальный радиус), r (конечный радиус) и b (приращение за оборот) сводится к

(обратите внимание, что для сохранения нотации OP существует два разных значения одного и того же символа r, что может быть неодобрительно для некоторых)

Эта формула может быть реализована таким образом

r <- 938 # outer radius                                     
a <- 0 # inner radius    
b <- 7 # increment per revolution
    
A <- 2 * pi / b
fa <- sqrt(1 + A^2 * a^2)
fr <- sqrt(1 + A^2 * r^2)
int_r <- (A*r*fr - log(-(A*r)+fr))/(2*A)
int_a <- (A*a*fa - log(-(A*a)+fa))/(2*A)
spiralLen <- int_r - int_a #exact formula

394877,5

вы также можете использовать численное (приближенное) интегрирование в статистике R интегрировать для оценки интеграла

integrate(function(r){sqrt(4*pi^2*r^2/b^2+1)}, a, r)

394877,3 с абсолютной ошибкой < 5,8

Другой метод, который дает довольно грубое приближение, но является очень хорошей проверкой, потому что он не использует никаких теоретических соображений, а просто берет сгенерированные вами данные и суммирует длину сегментов всех последовательных точек в данных:

dx <- x[2:length(x)] - x[1:length(x)-1]
dy <- y[2:length(x)] - y[1:length(x)-1]
len_approx = sum(sqrt(dx^2 + dy^2))

394876,8

Что касается построения графика, в R, поскольку у вас уже есть набор точек, кажется, что самое простое применение функции plot выполняет свою работу.

plot(x, y, type = "l")

Ваше объяснение действительно помогло. Однако мне также нужна длина дуги от каждой точки xy до предыдущей точки. Уточнил в моем вопросе выше. Таким образом, каждое значение в i, исключая начало координат, получает значение длины дуги. Это возможно? И не стесняйтесь обновлять OP и свой ответ более подходящим обозначением. Было бы лучше для ясности, если бы мое представление соответствовало условностям.

Leroy Tyrone 12.02.2023 08:21

Да, это уже есть в коде dx и dy выше - просто не sum, то есть ds = sqrt(dx^2+dy^2)

kikon 12.02.2023 08:24

Упс, конечно

Leroy Tyrone 12.02.2023 08:34

Другие вопросы по теме