Мне нужно получить значения 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 получается длина дуги между точками?
Точная формула длины с вашими обозначениями 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")
Да, это уже есть в коде dx
и dy
выше - просто не sum
, то есть ds = sqrt(dx^2+dy^2)
Упс, конечно
Ваше объяснение действительно помогло. Однако мне также нужна длина дуги от каждой точки xy до предыдущей точки. Уточнил в моем вопросе выше. Таким образом, каждое значение в i, исключая начало координат, получает значение длины дуги. Это возможно? И не стесняйтесь обновлять OP и свой ответ более подходящим обозначением. Было бы лучше для ясности, если бы мое представление соответствовало условностям.