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

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

1 5

Столкнулся с трудной задачей. Нужно большую формулу записать в маленький МК (на Си).

Если записать ее "как есть" в текст программы, то после компиляции она займет больше половины памяти МК.
Есть ли программы, которые позволяют упростить формулу (снизив точность) или разложить в ряд? Время расчетов не критично (пускай даже 0,5...1,0 сек считает).

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

Находил в интернете разложение в ряд элементарных функций (синус, косинус).

Делать таблицу? Она получается двухмерная (две переменные на входе).

 

Построить в Экселе график функции и аппроксимировать полиномом?

 

Для функции двух переменных?

 

А что за формула?

 

Да там очень спецефическая, с корнями и логарифмами.

 

Это один из побудительных мотивов переходить на ассемблер
Если при мысле об assm возникает токсикоз , то упрощать задачу или взять кристалл с большими ресурсами..
К сожалению, других вариантов нет

 

Обычно, компилятор генерирует наиболее оптимальный код и оптимизировать там уже нечего.
Если логарифмы, то надеюсь упростили. Типа, ln(x*y) = ln(x) + ln(y) и т.д.?
Могу лишь предложить попробовать другой компилятор. Еще можно попробовать разбить выражение на несколько (если оно иначально в одну строку). Бывает, оптимизаторы тупят.

 

Сергей К : Для функции двух переменных?

Для каждой строчки таблицы. Какая-никакая, а экономия

 

программа есть - учебник математики
наверное интересно обсуждать "неведому зверушку", но на конкретный вопрос и ответы были бы конкретнее.
какая формула, какой контроллер, что на входе и выходе(точность...), лимит памяти...???
покажите листинг формулы - чего там компилятор намудрил

 

Мой вопрос больше теоретический (общий), нежели привязка к конкретной формуле. Сегодня формула одна, завтра другая. Просто я думал, может кто использует некие приемы для упрощения выражений (с применением специализированных программ).
Если же никто такого не делал, то и вопрос можно пока прикрыть.

Dron_Gus: Обычно, компилятор генерирует наиболее оптимальный код и оптимизировать там уже нечего
оптимальный с точки зрения код/быстродействие, но я хочу влияние фактора "быстродействие" снизить, получив меньший код.

Конечно, можно взять и МК помощнее, но вопрос сейчас в другом. Например, зачем мне результат через 0,01 сек, если меня удовлетворяет и 1,0 сек.

Кстати, пробовал эту программу компилировать для кристалла PIC16F877A и PIC18F452. Разницы в количестве байт сгенерированого кода практически нет (но ведь PIC18F452 умеет еще и аппаратно множить числа).

Вот пример формул:
Wb=(0.1/P)*exp(18-(3740.78/(227.02+T))+0.2883*P-0.00086*P*(273.15+T));
Kl=exp2(3.59*(273.15+T-7694.3/(29.112-log(P)))/(273.15+T));
но это не самые длинные.