2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Помогите разобраться с алгоритмом
Сообщение02.02.2012, 00:20 
Здравствуйте. Вот я нашёл алгоритм для вычисления обратной матрицы. Но разобраться с ним не могу. В общем я сейчас расставлю в коде комментарии. Я просто не понимаю где заканчивается один цикл и начинается второй и т.д. С условиями также. Просто надо это перевести в VBA а у меня чёто не получается. Совсем иной результат.
Помогите, пожалуйста.

Код:
var k, i, j: integer;
    b: array[0..300, 0..300] of real;
begin
for k:=0 to kol - 1 do // Цикл номер 1
begin
      for i:=0 to kol - 1 do // Цикл номер 2
       for j:=0 to kol - 1 do // Цикл номер 3
       begin
            if (i=k) and (j=k) then // Условие номер 1
               b[i,j] := 1/obr[i,j]; // Конец условия номер 1
               if (i=k) and (j<>k) then
                  b[i,j] := -obr[i,j]/obr[k,k];
               if (i<>k) and (j=k) then
                  b[i,j] := obr[i,k]/obr[k,k];
               if (i<>k) and (j<>k) then
                  b[i,j] := obr[i,j] - obr[k,j] * obr[i,k]/obr[k,k];
       end; // Конец цикла номер 3
      for i:= 0 to kol - 1 do // Цикл номер 4
       for j:= 0 to kol - 1 do obr[i, j]:= b[i, j]; // Цикл номер 5 начинается и тут же заканчивается на этой строчке.
     // Конец цикла номер 4
end;
// Конец цикла номер 2
end;
// Конец цикла номер 1

 
 
 
 Re: Помогите разобраться с алгоритмом
Сообщение02.02.2012, 00:58 
prowoke в сообщении #533908 писал(а):
// Цикл номер 5 начинается и тут же заканчивается на этой строчке.

Да их здесь всего три.Вы добавили лишних два))Это делфи?Вы задаёте массив двумерный,begin-это тело цикла,for k:- это счётчик походу,i и j - элементы массива b[i,j],а end - это конец цикла.Циклы вложенные.Массив задаётся здесь динамически походу...ну и собственно его элементы.Про обратную матрицу ничего сказать немогу.Первый begin - начало первого цикла,последний-начало последнего(по вложенности) цикла.Первый end - конец последнего цикла(по вложенности),последний end - конец главного цикла.Думаю поймёте...)))Ночь уже...

 
 
 
 Re: Помогите разобраться с алгоритмом
Сообщение02.02.2012, 08:15 
Как 2 лишних? Я просто копировал отсюда код:

http://algolib.narod.ru/Math/ObrMatrix.html

 
 
 
 Re: Помогите разобраться с алгоритмом
Сообщение02.02.2012, 10:11 
2prowoke
Цитата:
В общем я сейчас расставлю в коде комментарии

Вместо "Конец цикла номер 2" должно быть "Конец цикла номер 1", а сама пометка о конце цикла #2 должна быть сразу после пометки "Конец цикла номер 3". Соответственно, самую последнюю строчку надо вообще удалить или заменить на что-то вроде "конец процедуры".

После портировки приведите vb-листинг здесь, тогда можно будет поисправлять ошибки... (Хотя лучше всего будет, если вы напишите нужный вам алгоритм сами с нуля и сразу же на целевом языке.)

 
 
 
 Re: Помогите разобраться с алгоритмом
Сообщение02.02.2012, 11:28 
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
var
        k, i, j : Integer;
        b : array[0..300, 0..300] of Real;
begin
        for k := 0 to kol - 1 do
        begin
                for i := 0 to kol - 1 do
                begin
                        for j := 0 to kol - 1 do
                        begin
                                if (i = k) and (j = k) then
                                begin
                                        b[i, j] := 1 / obr[i, j];
                                end;
                                if (i = k) and (j <> k) then
                                begin
                                        b[i, j] := - obr[i, j] / obr[k, k];
                                end;
                                if (i <> k) and (j = k) then
                                begin
                                        b[i, j] := obr[i, k] / obr[k, k];
                                end;
                                if (i <> k) and (j <> k) then
                                begin
                                        b[i, j] := obr[i, j] - obr[k, j] * obr[i, k] / obr[k, k];
                                end;
                        end;
                end;
                for i := 0 to kol - 1 do
                begin
                        for j := 0 to kol - 1 do
                        begin
                                obr[i, j] := b[i, j];
                        end;
                end;
        end;
end;
Так гораздо лучше, не правда ли?
Главное $\text{---}$ уметь вовремя отключать мозг и не тратить попусту интеллектуальную энергию :-).

 
 
 
 Re: Помогите разобраться с алгоритмом
Сообщение02.02.2012, 19:47 
Circiter в сообщении #534003 писал(а):
2prowoke
Цитата:
В общем я сейчас расставлю в коде комментарии

Вместо "Конец цикла номер 2" должно быть "Конец цикла номер 1", а сама пометка о конце цикла #2 должна быть сразу после пометки "Конец цикла номер 3". Соответственно, самую последнюю строчку надо вообще удалить или заменить на что-то вроде "конец процедуры".

После портировки приведите vb-листинг здесь, тогда можно будет поисправлять ошибки... (Хотя лучше всего будет, если вы напишите нужный вам алгоритм сами с нуля и сразу же на целевом языке.)


Вот алгоритм на VBA:
Код:
  For z = 0 To kol - 1
                For i = 0 To kol - 1
                        For j = 0 To kol - 1
                                If (i = z) And (j = z) Then
                                        b(i, j) = 1 / XtX(i, j)
                                End If
                                If (i = z) And (j <> z) Then
                                        b(i, j) = -XtX(i, j) / XtX(z, z)
                                End If
                                If (i <> z) And (j = z) Then
                                        b(i, j) = XtX(i, z) / XtX(z, z)
                                End If
                                If (i <> z) And (j <> z) Then
                                        b(i, j) = XtX(i, j) - XtX(z, j) * XtX(i, k) / XtX(z, z)
                                End If
                        Next
                Next
                For i = 0 To kol - 1
                        For j = 0 To kol - 1
                                XtX(i, j) = b(i, j)
                        Next
                Next
        Next


Чтобы написать самому с нуля у меня нету ни ума, ни образования, времени и практики. Максимум умножение матриц и транспонирование:). Тут он ошибку кидает в VBA. Говорит, что в первом условии идёт деление на 0. Вот тут:
Код:
  If (i = z) And (j = z) Then
                                        b(i, j) = 1 / XtX(i, j)
  End If


Это уже проблема самого VBA или алгоритма? Как решать то это? Писать условия, типо если идёт деление на 0, то считай это число как 0 или как? Сам алгоритм то, что мне надо. Я на сайте пробовал вводить нужным мне матрицы, считает он всё верно.

 
 
 
 Re: Помогите разобраться с алгоритмом
Сообщение02.02.2012, 21:54 
prowoke в сообщении #534293 писал(а):
Это уже проблема самого VBA или алгоритма?

Это Ваша проблема!Это Вам решать!...надо.Изначально элементы массива не определены(не инициализированы),-равны "0".

 
 
 
 Re: Помогите разобраться с алгоритмом
Сообщение02.02.2012, 22:58 
На какой матрице деление на 0 получилось? У неё определитель равен нулю?

Если так, значит, обратной матрицы для такой не существует.

 
 
 
 Re: Помогите разобраться с алгоритмом
Сообщение02.02.2012, 23:20 
Tod Leben в сообщении #534334 писал(а):
prowoke в сообщении #534293 писал(а):
Это уже проблема самого VBA или алгоритма?

Это Ваша проблема!Это Вам решать!...надо.Изначально элементы массива не определены(не инициализированы),-равны "0".


Какую то ерунду написали. Как массив с матрицой, которую я обращаю может быть равен нулю? А так да, проблемы это мои и только мои, но я прощу помочь немного. Решать за меня я не прошу.

-- Пт фев 03, 2012 00:22:50 --

arseniiv в сообщении #534351 писал(а):
На какой матрице деление на 0 получилось? У неё определитель равен нулю?

Если так, значит, обратной матрицы для такой не существует.


Там элементы матрицы такие: 0.002, 0.003, 0.1. Видимо VBA как 0 считает это. Хотя вроде тип данных Single ставил. Завтра ещё подразобраться попробую.

 
 
 
 Re: Помогите разобраться с алгоритмом
Сообщение03.02.2012, 09:32 
2prowoke
Все нормально, ошибка найдена. При переводе с паскаля на бейсик вы зачем-то (кстати, зачем? :) ) переименовали переменную-счетчик k на z. Но одну из этих k переименовать забыли.

Не знаю точно, но возможно у вас доступна директива option explicit, просто добавьте её в начале вашего кода и компилятор будет требовать явного объявления всех объектов, что позволит избежать многих ошибок.

Цитата:
Какую то ерунду написали. Как массив с матрицой, которую я обращаю может быть равен нулю?

Имелось ввиду, что вы могли попросту забыть заполнить обращаемую матрицу данными. :) Но теперь понятно, что ошибка было в другом.

Совет разобраться в исходном алгоритме обращения (по книжкам) и реализовать его самостоятельно остается в силе. Однако спешу присовокупить к нему совет раз и навсегда отказаться от бейсика. :)

 
 
 
 Re: Помогите разобраться с алгоритмом
Сообщение03.02.2012, 23:05 
Да мне для курсовой надо. С алгоритмами когда нибудь разберусь. Но сейчас нету времени этому учиться. Всем спасибо. Вроде всё почти получилось.

 
 
 [ Сообщений: 11 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group