Существует ли алгоритм вычисления площади фигуры Лиссажу?
Предположим, что у меня есть измерения двух сигналов
V = V(t) and U = U(t)
которые являются периодическими по времени с разностью фаз между ними. Когда они построены друг против друга на графике V vs U
они образуют фигуру Лиссажу, и я хочу рассчитать площадь внутри нее.
Есть ли алгоритм для такого расчета?
Я хотел бы решить эту проблему с помощью Python. Но ответ на любом языке или алгоритм для этого будет очень оценен.
Примеры сигналов V и U могут быть сгенерированы с использованием таких выражений, как:
V(t) = V0*sin(2*pi*t) ; U(t) = U0*sin(2*pi*t + delta)
На рисунке 1 показан график V,U
vs t
для V0=10, U0=5, t=np.arange(0.0,2.0,0.01)
и delta = pi/5
.
На рисунке 2 показана соответствующая фигура Лиссажу V
vs U
Это конкретная проблема более общего вопроса: как вычислить интеграл замкнутого пути, полученный с дискретным набором данных (x_i,y_i)
?
- Улучшение алгоритма обнаружения волн
- Как найти сложность встроенной функции в python
- Лучший способ вычислить фундаментальную матрицу поглощающей цепи Маркова?
- Алгоритм сортировки чисел, суммируемых на общий и соблюдающий критерии в python
- Почему мой MergeSort настолько медленный в Python?
Чтобы найти область (закрытой) параметрической кривой в декартовых координатах, вы можете использовать теорему Грина (здесь 4-я формула )
A = 1/2 * Abs(Integral[t=0..t=period] {(V(t) * U'(t) - V'(t) * U(t))dt})
Но помните, что интерпретация – то, что является реальной областью под самопересекающимися кривыми – неоднозначна, как заметил @algrid в комментариях
для внешней области большинства кривых области Lissajous формы я бы попробовал это:
-
найти период сигнала
так что найдите
T
такой:U(t) = U(t+T) V(t) = V(t+T)
-
данные выборки по
t=<0,T>
Я бы использовал полярную систему координат с центром, равным средней
U,V
координатеU,V
на интервалеt=<0,T>
и назовем ееU0,V0
. Преобразуйте и сохраните данные в полярных координатах так:a(t)=atan2( V(t)-V0 , U(t)-U0 ) r(t)=sqrt( (U(t)-U0)^2 + (V(t)-V0)^2 )
и помните только точки с максимальным радиусом для каждой угловой позиции. Это можно сделать либо с помощью массивов (ограничение точности по углу), либо геометрическим путем вычисления пересечения полилинии с перекрывающимися сегментами. и удаление внутренних частей.
-
Вычислить область из выборочных данных
Итак, вычислите область, суммируя треугольники пирога для каждой угловой позиции, охватывающей весь круг.
Это может не работать для экзотических фигур.
Оба решения выше – by @MBo и @Spektre (и @meowgoesthedog в комментариях) – отлично работают. Спасибо вам, ребята.
Но я нашел другой способ рассчитать площадь A
эллиптической кривой Лиссажу: использовать формулу A = Pi*a*b
( a
и b
– соответственно основная и младшая полуоси эллипса).
шаги:
1 – найти период T
сигнала V
(или U
);
2 – В интервале времени 0<t<T
:
2.а – вычислить средние значения V
и U
( V0
и U0
), чтобы определить центр эллипса;
2.b – вычислить расстояние r(t)
от точки ( V0
, U0
), используя:
r(t)=sqrt( (U(t)-U0)^2 + (V(t)-V0)^2 )
3 – Найдите значения a
и b
используя:
a = max(r(t)); b = min(r(t))
4 – вычислить A
: A = Pi*a*b
Кривые Лиссажу всегда будут эллиптическими, если сигналы U, V являются синусоидальными и имеют одинаковую частоту .
Воспользовавшись этой возможностью, я предложу решение для случая, когда сигналы V, U являются треугольными и имеют одинаковую частоту. В этом случае кривая Лиссажу будет параллелограммом, тогда можно вычислить ее площадь A
используя A = 2*|D|*|d|*sin(q)
, где |D|
и |d|
соответственно, длина основной и младшей полудиагоналей параллелограмма, а q
– угол между векторами D
и d
.
Повторите шаги 1 и 2 для эллиптического случая.
На шаге 3 мы будем иметь:
|D| = max(r(t)) = r(t1); |d| = min(r(t)) = r(t2)
4 '- Получить t1
и t2
и использовать их для получения координат ( V(t1)=V1
, U(t1)=U1
) и ( V(t2)=V2
, U(t2)=U2
). Тогда векторы D
и d
можно записать в виде:
D=(V1,U1)-(V0,U0); d=(V2,U2)-(V0,U0)
5 '- рассчитать угол q
между D
и d
;
6 '- Выполните вычисление A
: A = 2*|D|*|d|*sin(q)
- Python Shell, протоколирование команд для простого повторного выполнения
- командной строки найти несколько строк
- рассчитать количество пересечений времени, когда все последовательности заполняют определенные критерии?
- Быстрый алгоритм вычисления дельта двух списков
- как сохранить список, отсортированный по мере чтения элементов
- перенастроить задачу для минимального времени выполнения
- 100 выбрать 10, с дополнительным условием
- Перестановки без повторения вывода в Python
- Как проверить, является ли одна строка подпоследовательностью другой?
- Что такое сложность выполнения (большой O) следующего псевдокода?
- Создание строк со всеми возможными комбинациями