Я нашел этот код fortran90 для нахождения собственных значений и собственных векторов реальной симметричной матрицы с использованием алгоритма Якоби. Я понимаю общую концепцию, но есть 3-4 строки, которые я не понимаю.
Вот кусок кода:
1 do while (b2.gt.abserr)
2 do i=1,n-1
3 do j=i+1,n
4 if (a(j,i)**2 <= bar) cycle ! do not touch small elements
5 b2 = b2 - 2.0*a(j,i)**2
6 bar = 0.5*b2/float(n*n)
7 ! calculate coefficient c and s for Givens matrix
8 beta = (a(j,j)-a(i,i))/(2.0*a(j,i))
9 coeff = 0.5*beta/sqrt(1.0+beta**2)
10 s = sqrt(max(0.5+coeff,0.0))
11 c = sqrt(max(0.5-coeff,0.0))
Итак, b2
определяется как сумма квадратов недиагональных элементов; abserr
- порог точности; bar
- это еще одно пороговое значение для того, чтобы принять наибольшую запись в абсолютном значении, которое мы хотим обнулить, а a(i,j)
- это записи исходной матрицы.
Что я не понимаю, так это строки 9 , 10 и 11 . На всех курсах, видео, в формате PDF и т. Д., Которые я читал или смотрел, коэффициент coeff
здесь ( t большую часть времени) никогда не определяется так. Вместо этого оно определяется как t = 1.0/(abs(beta) + sqrt(beta**2 + 1.0))
, а если beta
отрицательно, то t = -t
. И поэтому я также не уверен насчет линий 10 и 11 , поскольку значения c
и s
относится к beta
.
Если кто-нибудь знает метод собственных значений Якоби для симметричной матрицы и понимает приведенный выше код, я был бы очень признателен за любое объяснение.