Свежие обсуждения
Микроконтроллеры

Оптимизация математических выражений для МК

1 2 5

Для уменьшения объема ПО я использую таблицы с последующей аппроксимацией, для которой тоже использую таблицы. В ячейки таблицы заносятся точные значения функции F(X1, X2 ...) для дискретных значений аргументов Xi. Далее - обычная аппроксимация. Вычисление сводится к поиску приблизительных (табличных) значений F() и ее апроксимация до значения с заданной точностью. Процессор используеет только. вычитание и сложение. Для уменьшения число таблиц можно использовать умножение и деление. И, конечно, максимально использую подпрограммы.
Естественно, функция д.б. достаточно монотонной в области аппроксимации, т.е |dF/dXi| < max и исключены "особые точки". Вблизи "особых точек" я использую обратные значения аргументов.

 

Vlad_Petr: Если при мысле об assm возникает токсикоз , то упрощать задачу или взять кристалл с большими ресурсами..
Я на одном форуме высказал такую мысль, но меня затоптали. Утверждают, что если влезло в кристалл на асме, то и на С влезет, но это не так : пресловутый "Hello, World !" займет уже килобайты. А в асме я применял нестандартную арифметику и собственную библиотеку функций, в результате на относительно слабом проце задача крутится не слабая.

To Сергей К : Думаю, что вряд ли такую программу найдете, процесс слабоалгоритмизируемый. И вообще, imho, это тупиковый путь, если предстоит развитие проекта, а ресурсы жмут уже в самом начале. Кристалл помощнее, однозначно.

To dmitriy2 : Тут палка с двумя кончиками : уменьшится объем кода, но за счет таблиц суммарный объем может увеличиться. Быстродействие - увеличится, факт, а насчет памяти - тут еще бабка на троих сообразила.

 

Bul_d_Ozer: Я на одном форуме высказал такую мысль, но меня затоптали. Утверждают, что если влезло в кристалл на асме, то и на С влезет, Не удивительно, форумов нынче много...любую глупость можно прочитать..

 

Ну если вопрос теоретический, то насколько я помню курс математики, любую функцию можно разложить в ряд с заданной точностью. Все калькуляторы (и наверняка и компиляторы) именно так вычисляют значения фукций. То есть любую как-угодно сложную функцию можно свести к арифметическим операциям- сложение, умножение и т.д. Звучит это примерно так "Численные методы решения каких-то там уравнений", -поищите в учебниках, наверняка найдёте.

 

найти, то я найду, но вот нет желания самому раскладывать огромную в ряд. Хочется ПК заставить этим заниматься.

 

Сергей К: Хочется ПК заставить этим заниматься.
Тогда смотрите, например, математический пакет Maple. Там есть такая возможность и много других.

 

Сергей К: Вот пример формул
- Н и толку их в ряд раскладывать. Вряд ли будут меньше занимать. Стоит попробовать следующее:
1. Использовать 32-битные числа с плавающей точкой (float) вместо 64-битных (double), если их будет достаточно. В частности, константы задавать в формате 3740.78f, 227.02f и т.д.
2. Попробовать написать свои, предельно простые версии exp, log и т.д.

 

Я вот в раздумиях, а можно ли раскладывать в ряд функцию двух аргументов? Я встречал разложение только с одним аргументом.

caddr: Использовать 32-битные числа с плавающей точкой (float)
использую их.

caddr: В частности, константы задавать в формате 3740.78f, 227.02f и т.д
а в чем особеность такой записи?

 

Сергей К:
а в чем особеность такой записи?

Это явное указание типа константы (float). По дефолту - double.

 

Сергей К: можно ли раскладывать в ряд функцию двух аргументов?
- Можно. Но в данном случае вряд ли нужно.