Я использую 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, она утрачивает свое свойство как функцию, а затем я не могу использовать в качестве аргумента во втором вызове для вывода каждого элемента. Как это можно улучшить? Как я могу сделать подпрограмму программы/функции, чтобы ее вход был такой матрицей, и ее выход был бы ее производной ???
Thanks
Попробую и я дам вам знать. Благодаря! – Daniel
Pd .: Я не понимаю, почему вы прокомментировали, что это не работает, чтобы указать на общую функцию. Вы можете распечатать результаты правильно, что это было, что не работает? – Daniel
@ Даниэль Я получал странные значения, такие как 10^-300 при указании на общую функцию, используя ifort 17 – Exascale