저는 fortran을 사용하고 있으며 그 요소가 기능을하는 행렬의 파생물을 얻으려고합니다.요소가 기능을하는 행렬을 유도하는 방법은 무엇입니까?
program derivada_matrix
integer, parameter :: matrix_size = 5
integer :: i,j
real(8) :: time = 1.0
real(8),dimension (matrix_size, matrix_size) :: W
real(8),dimension (matrix_size, matrix_size) :: dW
call potent(time,W)
do i = 1, matrix_size
do j=1, matrix_size
call Derivada(time,W(i,j),dW(i,j))
end do
end do
print*, 'matrix'
print*, W
print*, 'derivada', dW
end program
Subroutine Derivada (x1,F,D)
implicit none
Real*8 :: x1
Real*8 :: h= 1.0E-6
integer, parameter :: matrix_size = 5
real*8 :: D,F
external F
D = (1.0*F(x1-2*h) - 8.0*F(x1-h) + 8.0*F(x1+h) - 1.0*F(x1+2*h))/(12.0*h)
return
End subroutine Derivada
subroutine potent(T,W)
implicit none
integer, parameter :: matrix_size = 5
real(8),dimension(matrix_size,matrix_size) :: W
Real(8):: T
integer :: i,j
do i = 1, matrix_size
do j=i,matrix_size
W(i,j) = 0.0
W(j,i) = W(i,j)
end do
W(i,i) = cos(T)
end do
RETURN
END subroutine potent
는 기본적으로 제 루틴은 다른 주 대각선에 제로 함수 (코사인)와이 유도체를하기로되어있어 상기 제 서브 루틴 검사 행렬을 생성한다. 이 내가
call Derivada(time,W(i,j),dW(i,j))
1
Warning: Expected a procedure for argument ‘f’ at (1)
내가 두 번째 호출에 얻을 오류/경고 메시지
를 얻을 오류/경고 메시지입니다. W 매트릭스를 만들면 그 속성이 함수로 손실되고 각 요소를 파생시키기 위해 두 번째 호출에서 인수로 사용할 수 없기 때문에 추측합니다. 어떻게 개선 할 수 있습니까? 어떻게 프로그램/함수 서브 루틴을 만들어 그 입력이이 같은 행렬이고 출력이 미분이 될 수 있습니까 ??? 코드는하지 않습니다감사
내가 노력 할게요 내가 너희를 알려 드리겠습니다. 감사! – Daniel
Pd : 제네릭 기능을 가리 키지 않는 이유에 대해 이해할 수 없습니다. 결과를 올바르게 인쇄 할 수 있었고 작동하지 않는 것은 무엇 이었습니까? – Daniel
@Daniel ifort를 사용하여 제네릭 함수를 가리킬 때 10^-300과 같은 별난 값이 생겼습니다. 17 – Exascale