Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подсчитать число декад логарифмической величины
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Sergey_Aleksandrovi4
Всем привет. Есть некоторый диапазон (частот) от 7 кГц до 2 МГц [7*10^3, 2*10^6]. В логарифмическом масштабе выглядит так
Нажмите для просмотра прикрепленного файла
Никак не придумаю, как аналитически сосчитать число отсчётов логарифмической шкалы, укладывающихся в диапазоне. По-простому число вертикальных линий пересекающих отрезок на графике. В конкретном случае 23. Вроде-бы задача школьная, но что-то никик не получается смекнуть.
ViKo
Цитата(Sergey_Aleksandrovi4 @ Jul 31 2012, 14:31) *
По-простому число вертикальных линий пересекающих отрезок на графике. В конкретном случае 23.

И поделить на десять. Линии идут не через 10, а через 1.

А еще: lg(2000000/7000). Получается несколько иная цифра. Чудо. sm.gif
V_G
Число декад - это разность десятичных логарифмов минимума и максимума. Умножить его на число отсчетов внутри декады. Все.
Sergey_Aleksandrovi4
На самом деле число этих самых линий нужно найти. Просто-напросто не знаю как они обзываются. "Декада" знаю, "октава" - знаю sm.gif
Интервал [7 кГц, 2 МГц]. В логарифмическом масштабе (в кГц): 7, 8, 9, 10, 20, 30, 40, 50, .... 800, 900, 1000, 2000. Итого 23 точки, включая границы диапазона.
Уже десятичные логарифмы так и эдак крутил, аналитически получить не смог. Нужно для написания ПО. Можно конечно в циклах считать порядок величины и пробегать по всему диапазону, но хочется аналитичкси, по-красивее sm.gif
Цитата(V_G @ Jul 31 2012, 15:44) *
Число декад - это разность десятичных логарифмов минимума и максимума. Умножить его на число отсчетов внутри декады. Все.

Это первым делом в голову пришло. 9 * (lg(Fmax) - lg(Fmin)) + 1 = 9 * (lg(Fmax/Fmin) + 1. Для приведённого выше диапазона 7'000..2'000'000 выходит ~23,1. Похоже на правду. Но, например, 8'000..1'000'000 (должна быть 21 точка), по формуле выходит ~19,9. Поэтому эту тему и создал smile3046.gif
ViKo
Цитата(Sergey_Aleksandrovi4 @ Jul 31 2012, 14:55) *
"Декада" знаю, "октава" - знаю sm.gif

Это будет называться типа "десятые доли декады". Ну, так умножьте результат логарифма на 10.
Нет, не будет! Потому и цифры не совпадают.

На рисунке линии идут неравномерно (и в линейном масштабе неравномерно, и в логарифмическом). Если вам нужно именно это, то, наверное, только циклами можно посчитать.
V_G
Цитата(Sergey_Aleksandrovi4 @ Jul 31 2012, 21:55) *
Но, например, 8'000..1'000'000 (должна быть 21 точка), по формуле выходит ~19,9. Поэтому эту тему и создал

Пока не понял сермяжной необходимости точного подсчета линий. Границы (минимум и максимум) должны задаваться круглыми числами (т.е. степенями десятки), иначе график будет плохочитаемым. Или это не для графиков?
Sergey_Aleksandrovi4
Цитата(V_G @ Jul 31 2012, 16:32) *
Пока не понял сермяжной необходимости точного подсчета линий. Границы (минимум и максимум) должны задаваться круглыми числами (т.е. степенями десятки), иначе график будет плохочитаемым. Или это не для графиков?

Нет, не для графиков. Выше писал, что для написания ПО. Будет некий "ползунок" с фиксированным числом степеней свободы (искомое числ точек интервала). Каждое его деление будет соответствовать точке внутри диапазона частот в логарифмическом масштабе. Немного сумбурно описал, жара наверное влияет)
xemul
Цитата(Sergey_Aleksandrovi4 @ Jul 31 2012, 15:55) *
Интервал [7 кГц, 2 МГц]. В логарифмическом масштабе (в кГц): 7, 8, 9, 10, 20, 30, 40, 50, .... 800, 900, 1000, 2000. Итого 23 точки, включая границы диапазона.

На моих пальцах получилось 25 (если 10 точек на декаду).
Цитата
9 * (lg(Fmax) - lg(Fmin)) + 1 = 9 * (lg(Fmax/Fmin) + 1. Для приведённого выше диапазона 7'000..2'000'000 выходит ~23,1.

int(10*log10(2000000/7000))+1 = 25
Цитата
Похоже на правду. Но, например, 8'000..1'000'000 (должна быть 21 точка), по формуле выходит ~19,9.

int(10*log10(1000000/8000))+1 = 21

В общем виде, естесно
int(N*log10(Fmax/Fmin))+1, N - число точек на декаду
ViKo
Цитата(xemul @ Jul 31 2012, 15:56) *
На моих пальцах получилось 25 (если 10 точек на декаду).
...
В общем виде, естесно
int(N*log10(Fmax/Fmin))+1, N - число точек на декаду

Это не те точки. Это точки, если декаду разбить на равномерные 10 отрезков. Т.е. график был бы, как тетрадь в клетку.
xemul
Цитата(ViKo @ Jul 31 2012, 17:12) *
Это не те точки. Это точки, если декаду разбить на равномерные 10 отрезков. Т.е. график был бы, как тетрадь в клетку.

Угу, плохо у меня с устным счётом. Для исходной задачи: int(9*log10(Fmax/Fmin))+1
Или совсем общо:
int(N*logM(Fmax/Fmin))+1, M - основание логарифма, N - число точек на одну степень основания

"Здесь не играть, здесь рыбу заворачивали..."
Sergey_Aleksandrovi4
Цитата(xemul @ Jul 31 2012, 17:33) *
Для исходной задачи: int(9*log10(Fmax/Fmin))+1

Не-не, в сообщении №4 я уже показал, что эта формула даёт неверный результат. Видимо, ViKo был прав, аналитически вычислить не выйдет. Сделал через циклы: неказисто с виду, но работает как часы.
ae_
Цитата(Sergey_Aleksandrovi4 @ Jul 31 2012, 22:39) *
...аналитически вычислить не выйдет.

Представим Fmin и Fmax в виде:
Fmin = A*10^X; Fmax = B*10^Y; где A,B - старшая цифра (1...9), X,Y - количество нулей (целое число).
Тогда число декад = 9*(Y-X)+B-A+1
Пример на Питоне2.7
Код
fmin=input("Enter Fmin: ")
fmax=input("Enter Fmax: ")

if fmax<fmin:
    fmin,fmax=fmax,fmin

x=len(str(fmin))-1
y=len(str(fmax))-1
a=int(fmin/pow(10,x))
b=int(fmax/pow(10,y))
z=9*(y-x)+b-a+1
print z
i-mir
Немного раскрою предыдущий пост.

Друзья - давайте решать такие задачки как в школе, а не как в аспирантуре.
Ну зачем вы вычисляете логарифмы ? Здесь у нас "палочки", значит считаем
именно палочки, а не степени чисел.
Итак, из рисунка видно, что расстояние между 10^1 и 10^2, а также между
другими целыми степенями - есть 9 палочек. А циферки в числах 7 и 2 (как у автора)
- это количество дополнительных палочек в чистом виде.

Если мы наше 1е число (меньшее) представим как А1*10^n1,
а второе число (большее) как А2*10^n2, тогда общее количество палочек между ними
есть: (A2+n2*9)-(А1+n1*9)+1 или: (2+6*9)-(7+3*9)+1 = 23.

Единичка в формуле добавилась т.к. цифры четко стоят на палочках (здесь нужно
более четкое понимание задания, может у ТС будут и другие исходные данные).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.