захотелось такое, зауправлять двигателем стирлинга. 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;
}
#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, стек мерил тоже её же стредсвами для стека задачи. по мойму не плохо, можно еще библу отоптимизировать - без приборов по коду видно что писали не проф.программеры а математики - никагого понятия об таких вещах как стек, озу, архитектура и тд, но оно им и неадабыло

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

вот, решил поделится празничным настроением.