В общем, есть код - страшный и непонятный. Чисто теоретически он должен реализовать метод минимальной невязки. Метод очень хорошо описан здесь, именно по этим алгоритмам и пошаговой инструкции я и делала:
www.physchem.chimfak.rsu.ru/Source/NumMethods/S...Единственное чего там нет - правила останова. В программе оно должно быть следующим: итерационный процесс прекращается, когда значение нормы вектора невязки, деленного на кол-во уравнений системы, становится меньше заданного эпсилон.
Код был написан с трудом... Даже убиты в нем все ошибки. И он даже работает. И итерационный процесс даже сходится. Но сходится откровенно говоря лево. Ибо итерации переваливают за сотню - другую, а значения неизвестных на них получаются еретичные: со знаками #. Тут два варианта. Либо обе системы, на которых я проверяю прогу, для метода невязки расходятся, либо в проге какая-то серьезная ошибка. Которую найти я так и не смогла. Зная, какой я программист, подразумеваю все-таки второе. Выкладываю код проги, по возможности с пояснениями. Сам метод невязки простенький, в нем легко разобраться. Помогите, пожалуйста, найти ошибку - очень надо, и чем скорее, тем лучше.
Код целиком почему-то не влезает в пост О_о Вот выложила
paste.org.ru/?6svwm8, спасибо
slackovod за совет.
читать дальше#include
#include
#include
#include
#include
using namespace std;
int main()
{ double skalyar(double *a,double *b,int n);
double* vect (double **a,double *b,int n);
double discrepancysquare (double *a, int n);
void iterationdiscrepancy(double **a,double *b,double *x, int n, double eps);
double *multipl(double *a, double p, int n);
int n, temp;
double eps;
cout << "Enter number of equations in system ";
cin >> n; //ввод кол-ва уравнений системы
cout << endl;
cout << "Enter exactness ";
cin >> eps; // ввод точности вычислений
cout << endl;
double **mainMatrix; // массив коэффициентов левой части
double *rightMatrix; //массив коэффициентов правой части
double *res;
mainMatrix = new double *[n];
rightMatrix = new double [n];
res = new double [n];
for(int k = 0; k < n; k++)
{
mainMatrix[k] = new double [n];
}
for(int k = 0; k < n; k++)
{
cout << "Enter " << n + 1 << " coefficients " << k + 1 << "-th equation ";
for(int l = 0; l < n; l++)
{
cin >> mainMatrix[k][l];
}
cin >> rightMatrix[k];
}
for (int r = 0; r < n; r++)
{
res[r] = 0;
}
cout << "If you want to use method of Jacobi press 1, If you want to use method of Seidel press 2 " << endl;
cin >> temp;
if (temp == 1)
iterationdiscrepancy(mainMatrix,rightMatrix,res, n, eps); //использование метода невязки
getch();
}
double skalyar(double *a,double *b,int n) //функция скалярного произведения векторов
{
double s;
for (int i = 0; i eps);
return;
}
double* vect (double **a,double *b,int n){
double *v;
v = new double [n];
for (int j = 0; j eps);
return;
}
Все. Очень сильно нужна ваша помощь
SOS
Заффтра сдавать...