Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: фортран. сравнение рангов матриц.  (Прочитано 13996 раз)
0 Пользователей и 1 Гость смотрят эту тему.
YarЬ
Гость
« : 10-07-2009 15:52 » 

здравствуйте! помогите пожалуйста вот с чем:
мне надо написать программу на фортране для сравнения рангов нерасширеной и расширеной матрицы.

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

Код:
program
dimension A(100,100), b(100),
real minor,rang

print*, 'vvedite kolychestvo uravneniy'
read*, n
print*, 'vvedite koeficienty uravnenyy'
  do i=1,n
  read*, (a(i,j), j=1,m)
  end do
  print*, 'vvedite stolbets svobodnyx chlenov'
  read*, (b(i), i=1,n)

if (A(1,1).ne.0) then
 do i=1,n
   do j=1,m
 minor=1
minor=A(i,j)*a(i+1,j+1)-a(i,j+1)*a(i+1,j)
rang=minor
if (minor.eq.0)then
Rang=minor (i-1,j-1)
end if
   exit
  end do
 end do
end if

end program

Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 10-07-2009 16:09 » 

Опиши текстом алгоритм нахождения ранга. А то непонятно, в каком месте тебе непонятно Улыбаюсь
Offtopic:
что-то фортран стал популярен...
Поставлю в угол.
« Последнее редактирование: 10-07-2009 17:18 от Вад » Записан
YarЬ
Гость
« Ответ #2 : 10-07-2009 16:21 » 

я пишу , как сам бы решал.
берется первый элемент, и если он не равен нулю, то ранг матрицы уже 1. дальше смотрим минор 2го порядка  вокруг этого элемента. если он не равен нулю, ищем минор 3 го порядка и т.д.
если мы натыкаемся на минор , равный нулю, и все последующие миноры тоже равны нулю, значит ранг матрицы последний неравный нулю минор.
вот... бред, да?
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 10-07-2009 17:20 » 

Минор 2го порядка в коде вижу. А дальше?
Записан
YarЬ
Гость
« Ответ #4 : 10-07-2009 17:55 » 

я не совсем понимаю, как записать так, что бы после второго минора высчитывался минор 3го порядка, затем 4 и т.д.
по идее, как-то через цикл это можно записать? или надо писать новую формулу к каждому минору?...


Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 10-07-2009 18:22 » 

Я думаю, здесь метод вычисления ранга через миноры слишком сложный: нужно считать, в общем случае, миноры до n-ного порядка.
Думаю, тут лучше приводить матрицу к треугольному виду. И по числу ненулевых элементов на главной диагонали определять ранг.
Записан
YarЬ
Гость
« Ответ #6 : 10-07-2009 18:47 » 

а как это можно сделать?
Записан
YarЬ
Гость
« Ответ #7 : 10-07-2009 18:48 » 

и ведь это можно использовать только для квадратных матриц, да?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 10-07-2009 19:46 » 

Миноры n-го порядка ведь можно посчитать через миноры n-1 порядка. Хотя в целом долго - не отрицаю. Тут как раз хорошо бы динамическое программирование использовать, чтобы повторно не считать то, что уже один раз считалось.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 10-07-2009 19:49 » 

Dimka, динамическое программирование... Хм
 а теперь в терминах фортрана - сможешь? Улыбаюсь
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 11-07-2009 09:29 » 

Sla, как известно, любую рекурсию можно преобразовать в итерацию, где вместо стека вызовов организуется программный стек (например, на базе массивов). Язык программирования тут большого значения не имеет. Разве что придётся побольше подумать.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
YarЬ
Гость
« Ответ #11 : 11-07-2009 14:17 » 

 а можете рассказать примерный алгоритм?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 11-07-2009 21:37 » 

YarЬ, без динамического программирования обычной рекурсией алгоритм вычисления определителя N-го порядка может выглядеть примерно так:

Код: (Ruby)
class Matrix
 def initialize(n)
  @rows,@n=Array.new,n
  for i in 0..@n
   column=Array.new
   for j in 0..@n
    column.push(0)
   end
   @rows.push(column)
  end
 end
 def [](x,y)
  return @rows[y][x]
 end
 def []=(x,y,value)
  @rows[y][x]=value
 end
 def calculateDeterminant
  if @n==2 then
   a1=self[0,0];a2=self[0,1];b1=self[1,0];b2=self[1,1]
   return a1*b2-a2*b1
  else
   j,determinant=0,0
   for i in 0..@n
    ai=self[i,j]
    if ai!=0 then
     sign=(i+j)%2==0?1:-1
     aai=buildSubmatrix(i,j).calculateDeterminant
     determinant+=sign*ai*aai
    end
   end
   return determinant
  end
 end
 def buildSubmatrix(x,y)
  submatrix=Matrix.new(@n-1)
  k=0
  for i in 0..@n
   if i!=x then
    l=0
    for j in 0..@n
     if j!=y then
      submatrix[k,l]=self[i,j]
      l+=1
     end
    end
    k+=1
   end
  end
  return submatrix
 end
end
Как видно из алгоритма (но нереализовано в нём), сокращение количества вычисляемых миноров обеспечивается поиском строки с наибольшим количеством нулей и пропусканием этих нулей при расчёте. Количество нулей можно увеличивать преобразованиями, но тогда задача сведётся к приведению матрицы к треугольному виду (о чём Вад говорил) и вычислению ранга более простым способом.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
YarЬ
Гость
« Ответ #13 : 12-07-2009 08:57 » 

спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines