Как простой пример, иллюстрирующий мою точку зрения, я пытаюсь решить следующее уравнение f(t+1) = f(t) + f(t)*Tr (f^2)
, начинающееся с t = 0, где Tr - след матрицы (сумма диагональных элементов). Ниже я предоставляю базовый код. Мой код компилируется без ошибок, но не обновляет решение по своему усмотрению. Мой ожидаемый результат также ниже, который я вычислил вручную (его очень легко проверить вручную с помощью матричного умножения).Матричное уравнение, которое должным образом не обновляется во времени
В моем примере кода ниже У меня есть две переменные, хранящие решение, g
для f(t=0)
, которые я реализую, а затем хранить f(t+1)
как f
.
complex,dimension(3,3) :: f,g
integer :: k,l,m,p,q
Пусть G = F (T = 0) определяется как ниже
do l=1,3 !matrix index loops
do k=1,3 !matrix index loops
if (k == l) then
g(k,l) = cmplx(0.2,0)
else if (k /= l) then
g(k,l) = cmplx(0,0)
end if
end do
end do
Я проверил этот результат действительно то, что я хочу, чтобы это было, так что я знаю, е при Т = 0 является правильно определена.
Теперь я пытаюсь использовать эту матрицу при t = 0 и найти матрицу на все время, определяемую уравнением f(t+1) = f(t)+f(t)*Tr(f^2)
, но именно здесь я неправильно реализую код, который я хочу.
do m=1,3 !loop for 3 time iterations
do p=1,3 !loops for dummy indices for matrix trace
do q=1,3
g(1,1) = g(1,1) + g(1,1)*g(p,q)*g(p,q) !compute trace here
f(1,1) = g(1,1)
!f(2,2) = g(2,2) + g(2,2)*g(p,q)*g(p,q)
!f(3,3) = g(3,3) + g(3,3)*g(p,q)*g(p,q)
!assume all other matrix elements are zero except diagonal
end do
end do
end do
Печать этого результата осуществляется
print*, "calculated f where m=", m
do k=1,3
print*, (f(k,l), l=1,3)
end do
Это когда я понимаю, мой код не выполняется правильно.
Когда я печатаю f(k,l)
Я ожидаю, что t = 1 в результате 0.224*identity matrix
, и теперь я получаю это. Однако при t = 2 выход неправильный. Поэтому мой код обновляется правильно для первой итерации, но не после этого.
Я ищу решение, как правильно реализовать уравнение, которое я хочу получить, которого я ожидаю.
Я смущен о нескольких вещах. Что означает 'f (k, l, i, j)' вы ссылаетесь во втором абзаце?Где вы на самом деле вычисляете трассировку? Какова точка петли над 'f (1,1) = g (1,1) + g (1,1) * g (p, q) * g (p, q)', если вы переписываете 'f (1,1) 'каждый раз - окончательный ответ не будет иметь только f (1,1) = g (1,1) + g (1,1) * g (3,3) * g (3, 3) '? – Ross
@Ross Извините, я скопировал свой фактический код, который использует 4D массивы, следовательно, индексы i, j; забудьте про этот простой пример. Спасибо, что поймал это. Вы определенно правы, но именно поэтому я застрял. Я не совсем уверен, каким окончательным ответом я бы попытался выяснить, что делает fortran, но я не мог. Я понимаю, что мой алгоритм не реализуется правильно. Я хочу правильно обновить решение, например: я хочу обновить f (1,1), f (2,2), f (3,3) для каждого временного шага в соответствии с уравнением f (t + 1) = е (т) + F (т) * Тр (е^2). Наконец, я вычисляю здесь трассировку: g (p, q) * g (p, q) –
Попробуйте более тщательно вычислить каждый компонент. Например, вычислите 'f^2' и сохраните его. Затем вычислите след * этого * и сохраните его. Затем вычислите обновление. – Ross