Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2010, 17:34   #1
Беллая
Пользователь
 
Аватар для Беллая
 
Регистрация: 30.07.2010
Сообщений: 44
По умолчанию Нужно найти ошибки в решении СЛАУ методом Гаусса

Здравствуйте, форумчане. В алгоритме метода разобралась. Спасибо всем, кто отвечал по этой теме на форуме.
Текст программы написала. На мой взгляд всё верно. Но вот решения СЛАУ неверно. (Есть Экселевское решение, с ним сравниваю.) Может вы увидите, где ошибки. Может вызов процедуры неправильный.
Вот текст программы
Код:

// Это из раздела описания глобальных переменных
var
...
a: array [1..6,1..6] of Real; // Матрица Грама 
b: array [1..6,1..1] of Real; // Матрица-столбец свободных членов 
// Описание процедуры Решение системы линейных алгебраических уравнений методом Гаусса
procedure Gaussian_method;
var
//k - треугольная (верхняя правая) матрица "рабочих" коэффициентов заполнена в правом верхнем углу 5х5
//a2 - матрица новых коэффициентов заполнена 5х5
//b2 - вектор-столбец новых коэффициентов из 5 чисел
//a3 - матрица новых коэффициентов заполнена 4х4
//b3 - вектор-столбец новых коэффициентов из 4 чисел
//a4 - матрица новых коэффициентов заполнена 3х3
//b4 - вектор-столбец новых коэффициентов из 3 чисел
//a5 - матрица новых коэффициентов заполнена 2х2
//b5 - вектор-столбец новых коэффициентов из 2 чисел
//a6 - матрица новых коэффициентов заполнена 1х1
//b6 - вектор-столбец новых коэффициентов из 1 числа
//r - вектор-столбец решений из 6 чисел
i: integer;
k, a2, a3, a4, a5, a6  : array[1..6,1..6] of Real;
r, b2, b3, b4, b5, b6: array [1..6] of Real;
begin
// Прямой ход
// Вычислим коэффициэнты для избавления от х1 в уравнениях, начиная со 2-го до 6-го
  k[1, 2] := a[2, 1] / a[1, 1];
  k[1, 3] := a[3, 1] / a[1, 1];
  k[1, 4] := a[4, 1] / a[1, 1];
  k[1, 5] := a[5, 1] / a[1, 1];
  k[1, 6] := a[6, 1] / a[1, 1];
// Перепишем коэффицициенты 2-ого уравнения системы, вычитая из 2-го 1-ое, умноженное на коэффициенты k,
// вычисленные в предыдущем шаге
  a2[2, 2] := a[2, 2] - k[1, 2] * a[1, 2];
  a2[2, 3] := a[2, 3] - k[1, 2] * a[1, 3];
  a2[2, 4] := a[2, 4] - k[1, 2] * a[1, 4];
  a2[2, 5] := a[2, 5] - k[1, 2] * a[1, 5];
  a2[2, 6] := a[2, 6] - k[1, 2] * a[1, 6];
// Перепишем коэффицициенты 3-ьего уравнения системы
  a2[3, 2] := a[3, 2] - k[1, 3] * a[1, 2];
  a2[3, 3] := a[3, 3] - k[1, 3] * a[1, 3];
  a2[3, 4] := a[3, 4] - k[1, 3] * a[1, 4];
  a2[3, 5] := a[3, 5] - k[1, 3] * a[1, 5];
  a2[3, 6] := a[3, 6] - k[1, 3] * a[1, 6];
// Перепишем коэффицициенты 4-ого уравнения системы
  a2[4, 2] := a[4, 2] - k[1, 4] * a[1, 2];
  a2[4, 3] := a[4, 3] - k[1, 4] * a[1, 3];
  a2[4, 4] := a[4, 4] - k[1, 4] * a[1, 4];
  a2[4, 5] := a[4, 5] - k[1, 4] * a[1, 5];
  a2[4, 6] := a[4, 6] - k[1, 4] * a[1, 6];
// Перепишем коэффицициенты 5-ого уравнения системы
  a2[5, 2] := a[5, 2] - k[1, 5] * a[1, 2];
  a2[5, 3] := a[5, 3] - k[1, 5] * a[1, 3];
  a2[5, 4] := a[5, 4] - k[1, 5] * a[1, 4];
  a2[5, 5] := a[5, 5] - k[1, 5] * a[1, 5];
  a2[5, 6] := a[5, 6] - k[1, 5] * a[1, 6];
// Перепишем коэффицициенты 6-ого уравнения системы
  a2[6, 2] := a[6, 2] - k[1, 6] * a[1, 2];
  a2[6, 3] := a[6, 3] - k[1, 6] * a[1, 3];
  a2[6, 4] := a[6, 4] - k[1, 6] * a[1, 4];
  a2[6, 5] := a[6, 5] - k[1, 6] * a[1, 5];
  a2[6, 6] := a[6, 6] - k[1, 6] * a[1, 6];
// Вычисление правой части для уравнений со второго и ниже
  b2[2] := b[2,1] - k[1, 2] * b[1,1];
  b2[3] := b[3,1] - k[1, 3] * b[1,1];
  b2[4] := b[4,1] - k[1, 4] * b[1,1];
  b2[5] := b[5,1] - k[1, 5] * b[1,1];
  b2[6] := b[6,1] - k[1, 6] * b[1,1];

...
// Вычислим коэффициенты для избавления от х5 в уравнении 6
  k[5, 6] := a5[6, 5] / a5[5, 5];  
// Перепишем коэффицициенты 6-ого уравнения системы
  a6[6, 6] := a5[6, 6] - k[5, 6] * a5[5, 6];
// Вычислим коэффициенты правой части для 6 уравнения
  b6[6] := b5[6] - k[5, 6] * b5[5];
// Обратный ход - вычислим неизвестные
  r[6] :=  b6[6] / a6[6, 6];
  r[5] := (b5[5] - a5[5, 6] * r[6]) / a5[5, 5];
  r[4] := (b4[4] - a4[4, 6] * r[6] - a4[4, 5] * r[5]) / a4[4, 4];
  r[3] := (b3[3] - a3[3, 6] * r[6] - a3[3, 5] * r[5] - a3[3, 4] * r[4]) / a3[3, 3];
  r[2] := (b2[2] - a2[2, 6] * r[6] - a2[2, 5] * r[5] - a2[2, 4] * r[4] - a2[2, 3] * r[3]) / a2[2, 2];
  r[1] := (b[1,1]  -  a[1, 6] * r[6] -  a[1, 5] * r[5] -  a[1, 4] * r[4] -  a[1, 3] * r[3] - a[1, 2] * r[2]) / a[1, 1];
Readln;
for i:=1 to 6 do
Write(' r[',i,']=', r[i] );
Writeln;
ReadLn;
end;
// Раздел операторов программы Optimizacia2
BEGIN
.....
Gaussian_method;
Readln;
END.
Say we can do it together
Беллая вне форума Ответить с цитированием
Старый 16.09.2010, 17:46   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

1) А циклы использовать запрещено? Вы могли элементарно ошибиться где-нибудь в индексе..
2) Попробуйте взять матрицу, которую легко просчитать руками, выводить ее после каждого шага и сравнивать результаты - думаю, Вы легко определите место, где происходит ошибка. Если матрица правильная, значит, ошибка в обратном ходе
Black Fregat вне форума Ответить с цитированием
Старый 16.09.2010, 19:52   #3
Беллая
Пользователь
 
Аватар для Беллая
 
Регистрация: 30.07.2010
Сообщений: 44
По умолчанию

Black Fregat, я циклы не использую потому, что навыка нет. Это моя первая программа после 10 летнего перерыва в программировании с института. Про таблицу для проверки видела на форуме. Спасибо, просчитаю.

А процедуру, я правильно вызываю?
Say we can do it together

Последний раз редактировалось Беллая; 16.09.2010 в 21:34.
Беллая вне форума Ответить с цитированием
Старый 17.09.2010, 01:46   #4
Беллая
Пользователь
 
Аватар для Беллая
 
Регистрация: 30.07.2010
Сообщений: 44
По умолчанию

Стала выводить значения после каждого расчета, оказалось что у меня передаются как-то не по-правильному в процедуру значения коэффициентов вычисленных в предыдущей процедуре.

Задача теперь (поправьте, если не верно выбран алгоритм действий)
1) определить какие параметры использует каждая процедура в программе
2) какие параметры возвращает

Здесь, наверное , нужно проследить какие значения принимают параметры? А как это сделать, я ни разу этого не делала?

3) научиться работать с параметрами процедур

P.S. Программу пишу в Делфи пока консольную. В институре Турбо Паскаль был, Делфи только начинаю по ходу работы осваивать.
Say we can do it together

Последний раз редактировалось Беллая; 17.09.2010 в 08:05.
Беллая вне форума Ответить с цитированием
Старый 17.09.2010, 14:25   #5
Беллая
Пользователь
 
Аватар для Беллая
 
Регистрация: 30.07.2010
Сообщений: 44
По умолчанию

Ура!
Решение получилось верным, ошибку нашла в предыдущей процедуре.
Я пользовалась проверкой нужной строчки с параметрами при выполнении программы.

P.S. Спасибо форуму, за возможность не падать духом! За добрый совет, который так необходим новичкам!
Say we can do it together

Последний раз редактировалось Беллая; 17.09.2010 в 15:40.
Беллая вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal. Решение СЛАУ методом Гаусса-Жордана 2easy4me Помощь студентам 5 23.03.2011 18:56
Решения СЛАУ методом Гаусса и Зейделя [ICQ] Помощь студентам 0 04.05.2010 20:51
строки, найти ошибки нужно=) Dareami Общие вопросы C/C++ 7 20.04.2010 00:49
Решение СЛАУ методом Гаусса с выбором главного элемента МаXsim Помощь студентам 4 21.10.2008 19:04