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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2010, 20:00   #1
sllh_111
Форумчанин
 
Регистрация: 10.02.2010
Сообщений: 137
Печаль Паскаль матрицы

Всем привет! Выручайте, очень нужна помощь в доработки программы.
Задание: Обратная матрица(с помощью метода Крамера)

вот прогр. по отдельности все работает, а вот вся целиком она работать отказывается
Код:
Program MATRIX;
uses CRT;
type mas=array[1..15,1..15]of real; mas1=array[1..15] of real;
var m4,m1,m2,m3,m5,m6,A,B,C,c1,a1,a2,b2,b3,b4:mas; d,d1,w,d3: real;
 m7,m8:mas1;
 m,h,i,j,k,k1,n,q:integer;
    z,ch,ch1:char;

procedure input;
begin clrscr;
write('Введите размерность 2 квадратных матриц(A,B): ');
readln(m);
writeln('Введите матрицы: ');
for i:= 1 to m do
for j:= 1 to m do
read(a[j,i]);
writeln; 
for i:= 1 to m do
for j:= 1 to m do
read(b[j,i]);
end  end;

 {Obratnaia matrica---}

  procedure zamena(m3:mas; var b4:mas; i,j,m:integer);
var
k2i,k2j,k2,l2:integer;
begin
k2:=0;
for k2i:= 1 to m do
if k2i=i then continue else
begin
inc(k2);
l2:=0;
for k2j:= 1 to m do
if k2j=j then continue else
begin
inc(l2);
b4[k2,l2]:= m3[k2i,k2j]
end
end
end;




 Procedure obrm(M3,a1,a2:mas; var d2,d3:real);
 {var}
 begin
 for i:= 1 to m do
 for j:= 1 to m do
 opred(M3,d3); d2:=d3;
 writeln(d3:2:1); readkey;
 if d3<>0 then begin
 for i:= 1 to m do
 for j:= 1 to m do
 transp(m3);
 begin
 for i:= 1 to m do
 for j:= 1 to m do
  zamena(m3,b3,i,j,m);
  opred(b3,d3);
  for i:= 1 to m do begin
  for j:= 1 to m do write(b3[i,j]:6:1);
  writeln;
	end;
  write('algeb dopolnenia: ',d3);
	end;


  readkey; end; end;

  procedure choise;
  begin
 repeat

 if ch='/'then
 begin
 clrScr;
 textColor(14);
 Write('Обратная матрица:');
 obrm(A,a1,a2,d,d3); end;

  if ch='9'then
 begin
 input;
 end;
 until ch=' ';
 end;

BEGIN
 input;
 choise;
 textColor(15);
 textBackGround(0);
 clrScr;
end.
красным помечена основная программа, а синим предпологаемое место ошибки.
Ну вобщем вся надежда на Вас! Буду рад любой помощи.
Только с финансами проблема, так что извините.
sllh_111 вне форума Ответить с цитированием
Старый 15.04.2010, 09:40   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,829
По умолчанию

А если я введу m больше 15?
p51x вне форума Ответить с цитированием
Старый 15.04.2010, 10:28   #3
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

метод Крамера вроде работате с определителями? а зачем здесь изголяться и находить обратную?

такая тема уже была, расписана на многих языках, даже выложен исходник этого метода, правда на C#, но ничего не стоит его переделать

http://programmersforum.ru/showthrea...F2%F0%E8%F6%FB
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]

Последний раз редактировалось RUSt88; 15.04.2010 в 10:32.
RUSt88 вне форума Ответить с цитированием
Старый 15.04.2010, 13:15   #4
sllh_111
Форумчанин
 
Регистрация: 10.02.2010
Сообщений: 137
По умолчанию

p51x
работать будет, но будут проблемы с отображением матрицы.

RUSt88
в том то и дело что программа почти закончена,
я по отдельности все фрагменты тестировал, всё работает. А вот целико че-то не идет!((((
sllh_111 вне форума Ответить с цитированием
Старый 15.04.2010, 13:19   #5
sllh_111
Форумчанин
 
Регистрация: 10.02.2010
Сообщений: 137
По умолчанию

да кстати, процедура opred(b3,d3); - есть и работает отлично поэтому выкладывать не стал.

думаю проблема при обращении к obrm(A,a1,a2,d,d3); end; может кто-нибудь что посоветует??? а то я вообще ужу в тупике.
sllh_111 вне форума Ответить с цитированием
Старый 15.04.2010, 15:21   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,829
По умолчанию

"работать будет"
Так я и думал.... А потом это все хакеры и вирусы, а не мы честные разработчики. Вопрос: Куда матрица будет записываться при м=100?
p51x вне форума Ответить с цитированием
Старый 15.04.2010, 20:54   #7
sllh_111
Форумчанин
 
Регистрация: 10.02.2010
Сообщений: 137
По умолчанию

p51x
эээ... это уже риторические вопросы пошли!)))

Ну раз уж до этого дошли то: люди есть хоть какие-нибудь мыслишки? help!

Последний раз редактировалось sllh_111; 16.04.2010 в 20:27.
sllh_111 вне форума Ответить с цитированием
Старый 16.04.2010, 20:35   #8
sllh_111
Форумчанин
 
Регистрация: 10.02.2010
Сообщений: 137
По умолчанию

тема еще актуальна help pliz/!
sllh_111 вне форума Ответить с цитированием
Старый 16.04.2010, 22:14   #9
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

чтобы решить СЛАУ методом Крамера необходимо найти определители матрицы с перестановкой результирующего вектора

находим определитель матрицы (переписать на паскаль ничего не стоит!)
Код:
public double det() // определитель матрицы
    {
        Matrix A = new Matrix(Rx, Ry);
        for (int i = 0; i < A.Rx; i++) { for (int j = 0; j < A.Ry; j++) { A.Matr[i, j] = Matr[i, j]; } }
        double temp = 0;
        int N = A.Rx - 1;
        int h = 1; int v = N;
        double c = 0;
        for (int i = 0; i < A.GetHeight(); i++)
        {
            if (A.Matr[i, i] == 0)
            {
                for (int j = 0; j < A.Ry; j++)
                {
                    c = A.Matr[i + 1, j];
                    A.Matr[i + 1, j] = A.Matr[i, j];
                    A.Matr[i, j] = c;
                }
            }
        }
        if (A.Rx != A.Ry) { return 0; }
        else
        {
            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < v; j++)
                {
                    temp = A.Matr[j + h, i] / A.Matr[i, i];                        
                    for (int k = 0; k < A.Ry; k++) { A.Matr[j + h, k] = A.Matr[j + h, k] - A.Matr[i, k] * temp; } 
                }
                h++;
                v--;
            }
            temp = A.Matr[0, 0];
            for (int i = 1; i < A.Rx; i++) { temp *= A.Matr[i, i]; }
            return temp;
        }
    }
так определитель уже умеем находить, 90% задачи уже выполнено, осталось самое легкое

M1 - матрица, M2 - результирующий вектор
напр

3x + 2y = 5
7x - 4y = 8

M1 матрица будет
3 2
7 -4

M2 вектор будет
5
8

Код:
public Matrix (Matrix M1, Matrix M2) // решение СЛАУ методом Крамера
{
    Matrix A = new Matrix(M2.Rx, M2.Ry);
    Matrix D = new Matrix(M1.Rx, M1.Ry);
    Matrix V = new Matrix(M2.Rx, M2.Ry);
    for (int i = 0; i < M1.Rx; i++) { for (int j = 0; j < M1.Ry; j++) { D.Matr[i, j] = M1.Matr[i, j]; } }
    double temp = M1.det();
    double fg = 0;
    for (int i = 0; i < M1.Ry; i++)
    {
        for (int j = 0; j < M1.Rx; j++)
        {
            V.Matr[j, 0] = D.Matr[j, i];
            D.Matr[j, i] = M2.Matr[j, 0];
        }
        fg = D.det();
        A.Matr[i, 0] = fg / temp;
        for (int j = 0; j < M1.Rx; j++) { D.Matr[j, i] = V.Matr[j, 0]; }
    }
    return A;
}
возвращает результат А как вектор корней СЛАУ
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 17.04.2010, 15:40   #10
sllh_111
Форумчанин
 
Регистрация: 10.02.2010
Сообщений: 137
По умолчанию

RUSt88
ограмное спасибо! выручил!
sllh_111 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль Матрицы Таня.Ку Помощь студентам 2 17.02.2010 17:04
матрицы паскаль Анжелика1988 Помощь студентам 2 03.11.2009 13:21
матрицы паскаль Кирилл17 Помощь студентам 4 28.12.2008 16:33