Ответ:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено ВН 08 октября 2003 г. 12:53
В ответ на: Поделитесь плиз сишным вариантом решения системы лин уравнений. отправлено 0men 08 октября 2003 г. 11:31

Ну вот,например. Гаусс-Жордан.
A*x=b.
A - матрица к-тов, размером size*size, x и b вектор-столбцы размером size, x искомый.
В программе матрица к-тов amtrx в виде одномерного массива, первые size эл-тов которого -первая строка, следующие - вторая и т.д.
xvec и bvec - x и b.
Возвращает 1, если все OK. 0 - в противном случае (чего-то шибко малое). long double для общности. Конечно на малых размерах может и double и float подойдут, но, в общем, лучше long double, хотя бы для внутренних операций.
Да, чуть не забыл, это я взял работающую программу, но кое-что ненужного выкинул только что. Вроде просмотрел - лишнего не выкидывал,
но мало ли что.



int gaussjordan(long double far *amtrx,long double far *bvec,long double far *xvec,int size)
{
int j,k,l,m,n,ite,ie=1;
long double w,q,d;
long double eps=0.00000000000001;
int label[7];
for(n=0;n<size;n++) label[n]=0;
for(n=0;n<size;n++)
{
w=0.;
for(m=0;m<size;m++)
{
q=fabs(amtrx[(size+1)*m]);
if(q>w&&label[m]==0) {w=q;ite=m;d=amtrx[(size+1)*m];}
}
if(w<eps) {ie=0;break;}
m=size*ite;
label[ite]=1;
for(l=0;l<size;l++)
{
if(l!=ite)
{
k=size*l;
q=amtrx[k+ite];
for(j=0;j<size;j++) amtrx[k+j]=(amtrx[k+j]*d-amtrx[m+j]*q)/d;
bvec[l]=(bvec[l]*d-bvec[ite]*q)/d;
}
}
}
for(n=0;n<size;n++)
{
if((fabs(amtrx[(size+1)*n]))<eps) {ie=0;break;}
xvec[n]=bvec[n]/amtrx[(size+1)*n];
}
return ie;
}





Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru