2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Помогите разобраться с алгоритмом
Сообщение02.02.2012, 00:20 


19/08/10
75
Здравствуйте. Вот я нашёл алгоритм для вычисления обратной матрицы. Но разобраться с ним не могу. В общем я сейчас расставлю в коде комментарии. Я просто не понимаю где заканчивается один цикл и начинается второй и т.д. С условиями также. Просто надо это перевести в 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 


09/05/10
122
Ростов-на-Дону
prowoke в сообщении #533908 писал(а):
// Цикл номер 5 начинается и тут же заканчивается на этой строчке.

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

 Профиль  
                  
 
 Re: Помогите разобраться с алгоритмом
Сообщение02.02.2012, 08:15 


19/08/10
75
Как 2 лишних? Я просто копировал отсюда код:

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

 Профиль  
                  
 
 Re: Помогите разобраться с алгоритмом
Сообщение02.02.2012, 10:11 
Заслуженный участник


26/07/09
1559
Алматы
2prowoke
Цитата:
В общем я сейчас расставлю в коде комментарии

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

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

 Профиль  
                  
 
 Re: Помогите разобраться с алгоритмом
Сообщение02.02.2012, 11:28 
Заслуженный участник


28/04/09
1933
код: [ скачать ] [ спрятать ]
Используется синтаксис 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 


19/08/10
75
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 


09/05/10
122
Ростов-на-Дону
prowoke в сообщении #534293 писал(а):
Это уже проблема самого VBA или алгоритма?

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

 Профиль  
                  
 
 Re: Помогите разобраться с алгоритмом
Сообщение02.02.2012, 22:58 
Заслуженный участник


27/04/09
28128
На какой матрице деление на 0 получилось? У неё определитель равен нулю?

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

 Профиль  
                  
 
 Re: Помогите разобраться с алгоритмом
Сообщение02.02.2012, 23:20 


19/08/10
75
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 
Заслуженный участник


26/07/09
1559
Алматы
2prowoke
Все нормально, ошибка найдена. При переводе с паскаля на бейсик вы зачем-то (кстати, зачем? :) ) переименовали переменную-счетчик k на z. Но одну из этих k переименовать забыли.

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

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

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

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

 Профиль  
                  
 
 Re: Помогите разобраться с алгоритмом
Сообщение03.02.2012, 23:05 


19/08/10
75
Да мне для курсовой надо. С алгоритмами когда нибудь разберусь. Но сейчас нету времени этому учиться. Всем спасибо. Вроде всё почти получилось.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group