Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 28.01.2015
Сообщений: 9

Метод Якоби для нахождения собственных значений

26.09.2018, 02:06. Показов 4588. Ответов 0

Студворк — интернет-сервис помощи студентам
Дано: матрица симметричная. Найти собственные значения методом вращений Якоби, выбрав максимальный по модулю недиагональный элемент. (В итоге работы алгоритма они должны оказаться на диагонали)
Проблема: результат близок к правде, но с подозрительно большой погрешностью.
Например, матрица 2 на 2 из единиц в конце становится матрицей с диагональю -0.33, 1.78, хотя собственные значения 0, 2.
Вряд ли ведь может настолько огромная погрешность быть? Не понимаю, в чем проблема.
(eps = 1e-20)

Эта штука находит индексы максимального элемента:
(работаю только с верхней половиной матрицы, нижнюю не трогаю вообще)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
pair<int, int> max(double **arr, int n) {
    pair<int, int> ij; 
    double res = 0;
    for (int i = 0; i < n; i++) {
        for (int j = i+1; j < n; j++)
            if (fabs(arr[i][j]) > fabs(res)) {
                res = arr[i][j];
                ij.first = i;
                ij.second = j;
            }
    }
    return ij;
}

Это штука, которая работает как функция sgn(x):

C++
1
2
3
4
5
int sign(double a) {
    if (a > 0) return 1;
    if (a < 0) return -1;
    return 0;
}
Вращение Якоби:
(формулы преобразований элементов взяты с Вики и книжки К.Ю. Богачева "Практикум на ЭВМ", если проблема в них, скажите, пожалуйста)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void Jacobi(double **arr, int n, int i0, int j0) {
    double cos = 0, sin = 0;
 
    if (arr[i0][i0] == arr[j0][j0])
        cos = sin = sqrt(2) / 2;
    else {
        double x = -2 * arr[i0][j0], y = arr[i0][i0] - arr[j0][j0];
        cos = sqrt(0.5 * (1 + (fabs(y) / sqrt(x*x + y*y))));
        sin = (sign(x*y)*fabs(x)) / (2 * cos*sqrt(x*x + y*y));
    }
 
    for (int m = 0; m < n; m++) {
        if (m != i0 && m != j0) {
            double ai0m, aj0m;
            if (m > i0) ai0m = arr[i0][m];
            else ai0m = arr[m][i0];
            if (m > j0) aj0m = arr[j0][m];
            else aj0m = arr[m][j0];
 
            if (m > i0) arr[i0][m] = cos*ai0m - sin*aj0m;
            else arr[m][i0] = cos*ai0m - sin*aj0m;
            if (m > j0) arr[j0][m] = sin*ai0m + cos*aj0m;
            else arr[m][j0] = sin*ai0m + cos*aj0m;
        }
    }
 
    arr[i0][i0] = cos*cos*arr[i0][i0] - 2 * sin*cos*arr[i0][j0] + sin*sin*arr[j0][j0];
    arr[j0][j0] = sin*sin*arr[i0][i0] + 2 * sin*cos*arr[i0][j0] + cos*cos*arr[j0][j0];
    arr[i0][j0] = (cos*cos - sin*sin)*arr[i0][j0] + cos*sin*(arr[i0][i0] - arr[j0][j0]); // on Wiki there is a mistake
}
Прогон алгоритма:

C++
1
2
3
4
5
6
7
8
void algorithm(double **arr, int n) {
    pair<int, int> ij = max(arr, n);
    while (fabs(arr[ij.first][ij.second]) > eps){
        ij = max(arr, n);
        Jacobi(arr, n, ij.first, ij.second);
        printArray(arr, n);
    };
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.09.2018, 02:06
Ответы с готовыми решениями:

Вычисление собственных значений и собственных векторов матрицы. Метод скалярных произведений
Курсовая работа!! Задание: &quot;Вычисление собственных значений и собственных векторов матрицы. Метод скалярных произведений&quot; ...

Метод итераций: нахождение собственных векторов и собственных значений матрицы
Доброго времени суток. метод итерации нахождение собственных векторов и собственных значений матрицы - вот тема на которую нужно написать...

Функция hmatrixevd из пакета alglib для поиска собственных значений и собственных векторов
Добрый день. Нужно найти собственные значения и вектора комплексной эрмитовой матрицы. Под решение этой задачи подошла функция hmatrixevd ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.09.2018, 02:06
Помогаю со студенческими работами здесь

Метод Якоби для нахождения собственных значений матрицы
Ребята,у кого нибудь есть реализация метода Якоби,для нахождения собственных значений на C#

Метод вращения Якоби для собственных значений
Добрый день!!! Уважаемые знатоки форума Помогите разобраться с задачей в Maple с методом вращения Якоби для собственных значениях Я не...

Метод вращения Якоби для нахождения собственных чисел матрицы. Укажите, как исправить программу
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids,...

Метод частных Рэлея или метод скалярных произведений для нахождения собственных чисел и векторов
Помогите пожалуйста перевести в Pascal, буду очень благодарен #include&lt;stdio.h&gt; #include&lt;math.h&gt; void Input(int n,int A) { ...

Метод итерации нахождения собственных чисел и собственных векторов матрицы
Помогите пожалуйста


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru