Метод Гаусса

  • Автор темы SpaceSH
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

SpaceSH

Гость
#1
Компилятор Dev-C++
Прога находит верные корни, но проблема в том что выводит их в порядке не для исходной матрицы,а для преобразованной. Помогите исправить,чтобы массив корней в верной последовательности заполнялся :please:
Мой ответ: 1.07, -1.14, 0.71, 1.02, -0.48, 0.55, 1.1
Верный: 1.03, 0.55, -1.14, -0.49, 1.07, 1.1, 0.71


Код:
#include <iostream>
#include <cmath>


using namespace std;

void Gauss(double *a, double *b, double *x,int n) // а - матрица коэффициентов, строки подряд, b - свободные члены, x - решение.
{
int i,j,k,t;
double kof,s;
double temp;
for (i=n-1; i>0; --i) // Цикл по уравнениям - вычитаемым
{
for (t=i, j=i-1; j>=0; --j) //Ищем строку с максимальным в i-том столбце коэффициентом.
{
if (fabs(a[i*n+t])<fabs(a[i*n+j]))
{
t=j;
}
}
if (a[i*n+t]==0.0)
{
return;
}
if (t!=i) // Если она не i-тая
{
for (k=n-1; k>=0; --k) // Меняем её с i-той
{
temp=a[k*n+t];
a[k*n+t]=a[k*n+i];
a[k*n+i]=temp;
}
}
for (j=i-1; j>=0; --j) // Цикл пo уравнениям-уменьшаемым
{
kof=a[i+j*n]/a[i*n+i]; // kof=a[j][i]/a[i][i];
for (a[i+j*n]=0.0, b[j]-=b[i]*kof, k=i-1; k>=0; --k) // Цикл по столбцам
{
a[k+j*n]-=a[k+i*n]*kof; // a[k][j]-=a[k][i]*kof
}
}
}
x=new double [n];
if (x)
{
for (i=0; i<n; ++i)
{
for (s=0.0, j=i-1; j>=0; --j)
{
s+=a[j+i*n]*x[j]; //s+=a[j][i]*x[j]
}
x[i]=(b[i]-s)/a[i*n+i]; // x[i]=(b[i]-s)/a[i][i];
//cout << x[i] << "\n";
}
}
cout << "\n";
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
cout << a[i*n+j] << " ";
}
cout << b[i] << endl;
}	 
for (i=0; i<n; ++i)
cout << "x " << x[i] << endl;
}


main()
{

int n = 7;
double gauss2[] ={1,5,3,7,6,3,9};
double M[]={0, 0, 1,0, 2,0, 0,0, 3, 0, -1, 0, 0,4, 0, 0, 5, 0,1,5,3,7,6,3,9, 4,0, 0,4, 0, 6,0, 2, 6, 0, 0, 5, 0,1, 0, 0, 1,5,3,7,6,3,9,0, 0, 0 };

double *y = new double[n];

/* for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
//cin >> M[i+j*n];
M[i+j*n] = rand()/100;
//cout << "gauss1["<< i << "][" << j << "]=";
//cin >> gauss1[i][j];
}
}
*/
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
cout << M[i*n+j] << " ";
}
cout << gauss2[i] << endl;
}	  
Gauss(M,gauss2,y,n);
cin.get();
}
(Мне подсказали, что надо учитывать порядок перестановок строк и столбцов(???) в матрице "a" и потом как-то востановить верный порядок корней, но как это реализовать??? и работает ли такой способ вообще может есть более эффективный?)
Заранее Спасибо
 
S

SpaceSH

Гость
#3
попробуй поменять местами i и j
Ну можно использовать пиксельный шейдер, но это нужно использовать OGL или DX
Если менять местами i и j то он будет фигню всякую выводить, т.к получится что Метод Гаусса будет работать по столбцам, а не по строкам
И причем тут пиксельный шейдер :please: ? у меня ведь не графика...
 
X

Xakep

Гость
#4
понятно =) просто посмотрел на тему, и подумал что тебе нужно изображение заблюрить )))
 
Статус
Закрыто для дальнейших ответов.