2015-06-26 2 views
-1

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

det A = sum on i=1...N:(-1)**(i+1) a_i1 det ||A||_i1 

, где ||A||_i1 является кофактором матрицу A, в n-1 X n-1 матрицу, созданную за счет устранения i строку и столбец 1. и вот где я застрял.

Это то, что я написал до сих пор

integer, parameter :: rk= selected_real_kind(6) 
end module prec 


module lap 
    use prec 
implicit none 

contains 
    recursive function det(a,n) result (d) 
    real(kind=rk), intent(in), dimension(n,n) :: a 
    real(kind=rk), dimension(n-1,n-1) :: b 
    real(kind=rk) :: d 
    integer ::i 
    integer, intent(in)::n 



if (size(a) > 4) then 
    do i=1,n 
b(1:(i-1),:) = a(1:(i-1),:) 
b(i:n,:) = a((i+1):n,:) 
b(:,:) = a(:,2:n) 
    d= ((-1)**(i+1))*a(i,1)*det(b,n) 
end do 
    else 
     d = a(1,1)*a(2,2)-a(1,2)*a(2,1) 

     end if 
    end function det 
end module lap 




     program sistema 

он продолжает говорить мне, что у меня есть, не совместимые массивы, даже если я с помощью подмножества (и мой профессор говорит, что это довольно легко получить | | с подмножествами).

+1

Куда он жалуется компилятор? Я также отмечу, что на вашем примере, по-видимому, отсутствуют фрагменты. – francescalus

+1

То, что вы написали до сих пор, похоже, является двумя последними строками модуля под названием 'prec', модуля, называемого' lap', и первой строкой программы, называемой 'sistema'. Вам нужно быть более ясными о том, что ваш код и точно о том, какие сообщения об ошибках генерирует ваш компилятор. И на каких строках в источнике. –

ответ

1

Было бы неплохо увидеть части вашего кода, которые отсутствуют. Однако, я думаю, что вижу проблему:

С размерами a(n,n) и b(n-1,n-1) вы не можете сделать b(1:(i-1),:) = a(1:(i-1),:), потому что размеры второго измерения не совпадают. Вы должны проверить определение матрицы кофакторов - вы должны удалить столбец , а также строку . Вместо три линии установки б, вы должны попробовать:

b(1:(i-1),:) = a(1:(i-1),2:n) 
b(i:n,:) = a((i+1):n,2:n) 

Edit: блядь, я всегда перепутать строки и столбца. Возможно, я имею в виду удалить ряд вместо столбец?

+0

@francescalus Я должен был сделать более понятным, что эта линия должна быть снята. Отредактировано и спасибо. – Ross

+0

Он делает это также в 'b (:, :) = a (:, 2: n)', где несоответствие размеров для первого измерения (n-1 vs n). – casey

Смежные вопросы