Рекурсия

Вычисление дискриминанта матрицы методом Гаусса




Уроки Delphi
  1.  Первая программа
  2.  Использование компонентов
  3.  События Delphi
  4.  Типы данных Delphi
  5.  Создание своих типов данных
  6.  Выражения и операторы
  7.  Работа с файлами в Delphi
  8.  Дополнительные формы
  9.  Подпрограммы в Delphi
  10. Исключительные ситуации
  11. Взаимодействие приложения с пользователем
  12. Указатели в Delphi
  13. Обзор компонентов
  14. Работа со строками
  15. Создание интерфейса
  16. Графика в Delphi
  17. Многопоточность в Delphi
  18. Динамическое создание
        компонентов
Поиск по сайту




 Это важно:
   Метод Application.ProcessMessages;

 Это полезно:
   Параметр Sender в обработчиках событий;










Бояться не надо



   Для вычисления дискриминанта матрицы A размером N*N воспользуемся методом Гаусса, то есть приведением матрицы к треугольному виду. Для этого умножением второй строки на коэффициент z=А11/A12 и вычитанием первой строки получаем равное нулю значение первого элемента второй строки, и так далее, пока все элементы лежащие ниже главной диагонали матрицы не станут равны нулю. Дискриминант получившейся матрицы равен частному от произведения диагональных элементов и произведения указанных коэффициентов:

  function Discr: Real;
  var p, j, i: Integer;
   z: Real;
  begin
  Result:=1;//инициализация дискриминанта
  for p:=0 to High(A)-1 do//цикл по строкам, которые отнимаем от изменяемых строк
    if A[p, p]=0 then//если первый элемент в строке равен нулю, то
      begin
        Result:=0;//дискриминант равен нулю, так как это диагональный элемент
        exit;//выходим
      end else//иначе:
  for j:=p+1 to High(A) do//цикл по строкам, которые в данный момент изменяем
    if A[p, j]=0 then//если первый элемент строки равен нулю, то эта строка не нуждается в изменении
      then continue else//и тогда пропускаем эту строку, иначе
      begin
        z:=A[p, p]/A[p, j];//вычисляем коэффициент
        Result:=Result/z;//вычисляем частное
        A[p, j]:=0;//начальный элемент строки будет равен нулю по определению
        for i:=p+1 to High(A) do//цикл по элементам изменяемой строки
          A[i, j]:=z*A[i, j]-A[i, p];//умножаем элемент на коэффициент и вычитаем элемент отнимаемой строки
      end;
  for i:=0 to High(A) do//цикл по диагональным элементам
    Result:=Result*A[i, i];//для получения дискриминанта перемножаем диагональные элементы
  end;

   На первый взгляд функция достаточно громоздкая, состоит из трёх вложенных циклов, требует проверок на равенство нулю элементов матрицы, чтобы не получить исключительную ситуацию. Можно сравнить с функцией вычисления дискриминанта, использующей рекурсию, которая более проста и наглядна, но требует выделения дополнительной памяти на вызовы рекурсивной функции. Также достоинством метода Гаусса является более высокое быстродействие, по сравнению с рекурсивным алгоритмом.

   Скачать программу.


Уроки Delphi начинающим





порно волосатые крупно

© 2023 Delphi-Manual.ru - Уроки Delphi начинающим с нуля