|
вот мой простейший вариант методом Гаусса системы Ax=B. Недостаток - если элементы aii близки к 0 то из-за округлений при вычислениях может ухудшиться точность. У меня такого никогда не будет, поэтому был выбран он.
void SolveLinear
(
float * DataSnsSolve, // CO, NO, NO2, SO2
float * ResSnsSolve
)
{
signed char i;
unsigned char j;
float TempClbGas[ NUM_EQU ][ NUM_EQU ];
float TempB[ NUM_EQU ];
float Temp;
for( i=0; i{
for( j=0; jTempClbGas[ i ][ j ] = ClbData.ClbGas[ i ][ j ];
TempB[ i ] = DataSnsSolve[ i ];
}for( i=0; i
for( j=i+1; j {
TempClbGas[ j ][ i ] /= -TempClbGas[ i ][ i ];
for( unsigned char k=i+1; jTempClbGas[ j ][ k ] += TempClbGas[ j ][ i ]*TempClbGas[ i ][ k ];
TempB[ j ] += TempClbGas[ j ][ i ]*TempB[ i ];
}
ResSnsSolve[ NUM_EQU-1 ] = TempB[ NUM_EQU-1 ]/TempClbGas[ NUM_EQU-1 ][ NUM_EQU-1 ];
for( i=NUM_EQU-2; i>=0; i-- )
{
Temp = TempB[ i ];
for( j=i+1; jTemp -= ResSnsSolve[ j ]*TempClbGas[ i ][ j ];
ResSnsSolve[ i ] = Temp/TempClbGas[ i ][ i ];
}
}
E-mail: info@telesys.ru