Декремент по логарифму

Megawollt
Offline
Зарегистрирован: 06.12.2015

Нужно плавно уменьшать значение переменной по логарифмической кривой.

При линейном уменьшении нужного эффекта не получается. Кто пробовал делать подобное? Поделитесь рецептом?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Рецепт: плавно уменьшать значение переменной по логарифмической кривой

Или я что-то не так понял?

На всякий случай: чтобы не считать логарифм, воспользуйтесь сеточной функцией.

И еще: "плавное уменьшение по логарифмической кривой" есть ни что иное как геометрическая прогрессия. Т.е. Вам нужно просто умножеть на число меньшее 1. Если в целых числах, то можно использовать дробь M/N, где N - степень 2.

Megawollt
Offline
Зарегистрирован: 06.12.2015

Я не особо силен в математике :) Есть какой либо пример?

Клапауций 234
Offline
Зарегистрирован: 24.10.2016
Megawollt
Offline
Зарегистрирован: 06.12.2015

Спасибо Клопоуцей, но это не пример

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Megawollt пишет:

Я не особо силен в математике :) Есть какой либо пример?

Тогда почему решили, что нужна именно логарифмическая кривая?

 

PS. Да и особой "силы" не нужно: геометрическая прогрессия - это школьный курс.

Megawollt
Offline
Зарегистрирован: 06.12.2015

Решил, так светодиод лучше всего регулировать по логарифмической кривой. Школу я закончил 15 лет назад, поэтому курс не особо помню :)

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

Megawollt пишет:

Решил, так светодиод лучше всего регулировать по логарифмической кривой. Школу я закончил 15 лет назад, поэтому курс не особо помню :)

здесь большинство твоих братьев по несчастью - крепись, друг, мы вместе, наснесломить!

Araris
Offline
Зарегистрирован: 09.11.2012

Megawollt пишет:

Я не особо силен в математике :) Есть какой либо пример?

Есть много примеров (сильны ли Вы в английском ?), вот навскидку : https://diarmuid.ie/blog/pwm-exponential-led-fading-on-arduino-or-other-platforms/

Megawollt
Offline
Зарегистрирован: 06.12.2015

Сильны. Спасибо, почитаю

Araris
Offline
Зарегистрирован: 09.11.2012

Тогда вот Вам ещё : http://playground.arduino.cc/Main/Fscale

Megawollt
Offline
Зарегистрирован: 06.12.2015

Спасибо. Вообще среди тех, кто работает со светодиодами и силовыми двигателями тема-то актуальная, но поднимается редко

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вряд ли.

Светодиод выполняет функции лишь индикатора. Требования к реализуемой функции отклика очень мягкие.

По поводу двигателей - они, как правило, имеют достаточно высокий порог, ниже которого вращение просто не начинается. Поэтому реализовывать на оставшемся участке какую-либо функцию отличную от линейной вряд ли целесообразно.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Megawollt пишет:

Спасибо. Вообще среди тех, кто работает со светодиодами и силовыми двигателями тема-то актуальная, но поднимается редко

Может тема и актуальная, но 1) вы эту тему не сможете потянуть, 2) вы даже не поймете решение данной темы 3) и даже если ткнуть на решение, вы не поймете и это.

ПС: Смиритесь . У каждого человека есть потолок в некоторых темах. И этот потолок просто ему не преодолеть, даже если всем форумом вас в ж..у пинать.

Logik
Offline
Зарегистрирован: 05.08.2014

))))

Делайте так:

вместо а=а-1

пишите а=а*0.9.

ПС. Думаю понятно что конкретные цифры выбраны чисто с потолка и для примера. Промоделируйте процесс например в екселе, думаю поймете. Следите за разрядностю, иногда вместо а=а*0.9 полезней а=а-а*0.1-1.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Megawollt пишет:

Школу я закончил 15 лет назад, поэтому курс не особо помню :)

Странно это.

Мои дети учились в школе одновременно с Вами. Следовательно, школу я закончил намного раньше Вас, а школьный курс еще помню. С чего бы это?

Вероятно, Вы на протяжении 15 лет просто ни разу не испытывали потребность вспомнить что-то из школьного курса. А раз так, совершенно прав qwone в 13-м посте.

Кстати, кто ему добавил "-1"? Высказался он, конечно, жестко, но вполне объективно. Так что [я] подправил ему баланс.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

andriano пишет:

Кстати, кто ему добавил "-1"? 

да! кто этот мудак? - выходи!

Megawollt
Offline
Зарегистрирован: 06.12.2015

Из qwone получился бы отличный преподаватель. Вас не надо учить, то что вы знаете, это ваш потолок :) Надеюсь вы не преподаватель.

Andriano, есть одно маленькое исключение. Мотор-Редуктор имеющий нагрузку с большой центробежной силой регулируется именно логарифмической кривой, а при линейной эта самая центробежная сила опережает мотор и дает рывки.

Правда нашел выход проще. Взял класс NoDelay от Клопоуция и сделал нарастающее время паузы

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Megawollt пишет:
Из qwone получился бы отличный преподаватель. Вас не надо учить, то что вы знаете, это ваш потолок :) Надеюсь вы не преподаватель.

Откуда появились логарифмы? Раньше народ тупо считал числа на бумажке или в уме, разумеется у кого он был. Но если складывать и вычитать было достаточно быстро, то умножение и деления , замечу больших чисел, занимало достаточно много времени и могли еще и ошибиться.  Но сейчас уже не люди складывают и умножают, а компьютеры. И делают достаточно быстро .  Так что в обычных ситуациях все нормально и без них. 

 Где используются логарифмы. Так есть числа float .  Мантиса и порядок(2 в степени логарифма двоичного числа).

Megawollt пишет:
Правда нашел выход проще. Взял класс NoDelay от Клопоуция и сделал нарастающее время паузы

Вот вам и результат. Человеку иногда полезно понять свой потолок, что бы быстро найти решение, а не выносить форум своими тараканами.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Megawollt пишет:

Из qwone получился бы отличный преподаватель. Вас не надо учить, то что вы знаете, это ваш потолок :) Надеюсь вы не преподаватель.

Megawollt, Вы опять все перепутали.

Здесь - не учебное заведение. Здесь - форум. А на форуме люди общаются. На равных. А Вы на равных - не можете. Потому, что забыли школьный курс. Сначала вспомните, потом приходите.

Цитата:

Andriano, есть одно маленькое исключение.

Исключений - масса. Я сам пользуюсь такими "исключениями". Как я уже написал, через сеточную функцию. Вполне вероятно, что Вам достаточно через геометрическую прогрессию, как написал Logic. Но если Вы забыли, что такое геометрическая прогрессия, то следовало бы спросить это у Гугла, Википедии, etc. Вы же предпочли заявить, что закончили школу 15 лет назад и ничего не помните. Если не помните и не хотите вспоминать, послушайте совет qwone и найдите себе занятие попроще.

Вопрос не в том, что в Вашем образовании есть существенные пробелы, а в том, что Вы эти пробелы не хотите устранять.

Logik
Offline
Зарегистрирован: 05.08.2014

Megawollt пишет:

Спасибо. Вообще среди тех, кто работает со светодиодами и силовыми двигателями тема-то актуальная, но поднимается редко

угу. вот надыбал, пусть полежит до поры. А то как надо - хрен найдеш.

https://habr.com/ru/post/469327/

 

Пусть N-разрядные двоичные беззнаковые числа, отображают интервал [0, 1]. Для удобства будем считать единицей число 

2N
, а не 



2N−1
, и соответственно двойкой число 



2N+1
. Напишем программу по образу и подобию предыдущей, но работающую с целыми числами:

#include <stdio.h>
#include <math.h>
#define DIG 	18            //разрядность чисел
#define N_BITS  16            //число бит которое считаем
unsigned ONE=1<<(DIG-1);      //единица
unsigned TWO=ONE<<1;          //двойка
unsigned SCALE=1<<(N_BITS+1);   //масштаб логарифмов
unsigned myLog(unsigned w)
{
	unsigned s=0;
	unsigned long long u=w;
	for(int i=0; i<N_BITS+1; i++)
	{
		s<<=1;
		u=(u*u)>>(DIG-1);  //берём только старшие разряды !
		if(u&TWO)   //тут достаточно одного бита для сравнения
		{
			u>>=1;
			s+=1;
		}
		printf("%X\n", (int)u);
	}
	return s;
}
int main()
{
	double w=1.2345678;
	unsigned iw=(unsigned)(ONE*w);
	double dlog=log2(w);
	unsigned ilog=myLog(iw);
	unsigned test=(unsigned)(SCALE*dlog);
	int err=abs((int)(ilog-test));
	printf("val=0x%X, res=0x%X, log=0x%X, err=%d\n",iw,ilog,test,err);
	return 0;
}