Я не понимаю, как коэффициенты для матрицы вращения Гивенса были закодированы здесь - PullRequest
2 голосов
/ 09 апреля 2019

Я нашел этот код 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.

Если кто-нибудь знает метод собственных значений Якоби для симметричной матрицы и понимает приведенный выше код, я был бы очень признателен за любое объяснение.

...