реклама на сайте
подробности

 
 
> решение систем нелинейных уравнений ..., ... на микроконтроллере :)
klen
сообщение Oct 30 2010, 23:20
Сообщение #1


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Всем привет.
захотелось такое, зауправлять двигателем стирлинга. 3 уравнения Вандервальса для состояния газа в полостях и одно для масс газа в полостях. тоеть всего 4.
есть милион библиотек для pc, взял попробывать портировать cminpack ( http://devernay.free.fr/hacks/cminpack/cminpack.html )
работает, собсно и портировать не пришлось, скомпилил и заработало.

врядли кому понадобится так извращатся как мне, но малоли...
вот либа для кортексов:
klen.org/Files/DevTools/libcminpack.7z

библиотека собрана gcc, другого в хозяйстве не держу. но собрать можно любым компиллером.

накидал тестовый пример как это нада юзать;
Код
#include ".cminpack.h"
#include <math.h>

int equation_sytem( void* ptr , int n , const double* estimations , double* errors, double *fjac, int ldfjac, int iflag )
{
            if ( iflag == 1 ) // вычислените правых частей системы упавнений
            {
                errors[0] = sqrt(estimations[0]) + estimations[1]*estimations[1] - estimations[2] - 3.0;
                errors[1] = (estimations[0] + estimations[1])/estimations[2] - 2.0;
                errors[2] = estimations[0] * estimations[1] * estimations[2] - 24.0;
            }
            if ( iflag == 2 ) // вычисление матрицы Якоби
            {
              //вычисление элементов матрицы Якоби
              fjac[0] = 0.5 * pow ( estimations[0] , -0.5 );   fjac[3] = 2*estimations[1];                   fjac[6] = -1;
                 fjac[1] = 1.0/estimations[2];                    fjac[4] = 1.0/estimations[2];                 fjac[7] = -(estimations[0] + estimations[1])/(estimations[2]*estimations[2]);
                 fjac[2] =  estimations[2] * estimations[1];    fjac[5] =  estimations[0] * estimations[0];  fjac[8] =  estimations[1] * estimations[2];
            }
    return 1;
}

int main()
   {
             double vecX[3] ; // вектор переменных
         double vecE[3] ; // вектор правых частей (ошибок пиближения)
         double matJ[3*3]; // матрца Якоби

         int n = 3; // порядок системы
         int ldfjac = n;
         int lwa = 330; // в доке написано что должно быть 10*(n*(3*n+13))/2;
         double wa[330];
         double    tol = 1e-12;  // точность вычислений
             // начальные условия
         vecX[0] = 1.0; vecX[1] = 1.0; vecX[2] = 1.0;
            // решение системы
         hybrj1( equation_sytem , (void*)NULL , 3 , vecX , vecE , matJ, ldfjac ,tol , wa , lwa );
            
             // корни уравнения в vecX

            return 0;
}


этом примере решается система:
sqrt(x1) + x2*x2 - x3 - 3 = 0
(x1 + x2)/x3 - 2 = 0
x1*x2*x3 - 24 = 0

на моей шарманке (stm32f107vct6) тратится 29 милисекунд и жрется 180 байт стека на вызов hybrj1 , размер массив сами видите сколько, это зависть от количества уравнений. время мерил в тиках FreeRTOS, стек мерил тоже её же стредсвами для стека задачи. по мойму не плохо, можно еще библу отоптимизировать - без приборов по коду видно что писали не проф.программеры а математики - никагого понятия об таких вещах как стек, озу, архитектура и тд, но оно им и неадабыло smile.gif

так мы мучим наши микросхемки на древний русский народный празник хеллуин smile.gif

вот, решил поделится празничным настроением.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- klen   решение систем нелинейных уравнений ...   Oct 30 2010, 23:20
- - Danis   Мне тоже приходилось заниматься мат. вычислениями ...   Oct 31 2010, 09:17
|- - klen   Цитата(Danis @ Oct 31 2010, 12:17) Мне то...   Oct 31 2010, 10:04
|- - Danis   Цитата(klen @ Oct 31 2010, 13:04) на Pic3...   Oct 31 2010, 10:32
- - AlexandrY   Цитата(klen @ Oct 31 2010, 01:20) захотел...   Oct 31 2010, 10:11
|- - klen   Цитата(AlexandrY @ Oct 31 2010, 13:11) А ...   Oct 31 2010, 10:40
|- - Danis   Цитата(klen @ Oct 31 2010, 13:40) горизон...   Oct 31 2010, 10:57
- - Forger   Для сравнения: мы в своем изделии - стабилизация д...   Oct 31 2010, 13:14
|- - AlexandrY   Цитата(Forger @ Oct 31 2010, 15:14) Фильт...   Oct 31 2010, 14:16
|- - Forger   ЦитатаНу так на каком типе ARM-ов реализовали, htt...   Oct 31 2010, 14:33
|- - Danis   Цитата(Forger @ Oct 31 2010, 17:33) В сам...   Oct 31 2010, 15:01
|- - klen   http://aravil.livejournal.com/17728.html С чувств...   Oct 31 2010, 15:18
||- - Forger   Цитата(klen @ Oct 31 2010, 18:18) класиче...   Oct 31 2010, 15:39
||- - klen   Цитата(Forger @ Oct 31 2010, 18:39) Вы по...   Oct 31 2010, 17:16
||- - Forger   Цитата(klen @ Oct 31 2010, 20:16) неправд...   Oct 31 2010, 17:59
||- - klen   я не могу понять как вы получаете 0,1 градус за ча...   Nov 1 2010, 07:59
||- - Serj78   Цитата(klen @ Nov 1 2010, 10:59) >...   Nov 1 2010, 09:19
||- - Forger   Цитата(klen @ Nov 1 2010, 10:59) я не мог...   Nov 1 2010, 09:28
|- - Forger   Цитата(Danis @ Oct 31 2010, 18:01) Интере...   Oct 31 2010, 15:28
|- - Danis   Цитата(Forger @ Oct 31 2010, 18:28) Но эт...   Oct 31 2010, 15:38
- - sinc_func   Делал как-то управление для электро-ассистированны...   Nov 5 2010, 14:07


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th June 2025 - 21:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01398 секунд с 7
ELECTRONIX ©2004-2016