• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Метод Гаусса

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

SpaceSH

Компилятор 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

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

Xakep

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!