Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
untoter
0 / 0 / 0
Регистрация: 09.01.2011
Сообщений: 6
#1

Метод бисекции поиска собственных значений матрицы - C++

02.05.2014, 13:38. Просмотров 301. Ответов 0
Метки нет (Все метки)

Здравствуйте. Собственно необходимо реализовать данный алгоритм. Делал по этому сайту https://people.fh-landshut.de/~maure...1.html#GBNDMIN .Считать, считает, но не то, что нужно. Собственные значения должны получиться 0, 2, 6, а получается 2, 5, 8. Помогите пожалуйста найти ошибку.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
 
int main()
{
/* 2 2 0
   2 4 2
   0 2 2
*/
    double A[3] = { 2, 4, 2}; //главная диагональ
    double B[4] = {0, 2, 2, 0}; //поддиагональ
    double ek=0;
    double e = 0.01;
    double s = 0;
    double l = 3;              //номер собственного значения
    int p=0;                   //количество отрицательных L
    //Mmin
    double M[3];
    for (int k = 0; k < 3; ++k){
        M[k] = A[k] - fabs(B[k]) - fabs(B[k + 1]);
        cout << "M:";
        cout << M[k] << endl;
    }
    double Mmin = M[0];
    for (int k = 0; k < 3; ++k) {
        if (M[k] < Mmin) {
            Mmin = M[k];
        }
    }
    cout <<"Min:"<< Mmin << endl;
 
    //Mmax
    double N[3];
    for (int k = 0; k < 3; ++k){
        N[k] = A[k] + fabs(B[k]) + fabs(B[k + 1]);
        cout << "N:";
        cout << N[k] << endl;
    }
    double Mmax = N[0];
    for (int k = 0; k < 3; ++k) {
        if (N[k] > Mmax) {
            Mmax = N[k];
        }
    }
    cout <<"Max:"<< Mmax << endl;
 
 
 
    if (fabs(Mmax) > fabs(Mmin)){
        ek = e*fabs(Mmax);
    }
    else {
        ek = e*fabs(Mmin);
    }
 
    cout << "ek=" << ek << endl;
 
    do{
        s = (Mmin + Mmax) / 2;
        cout << "s=" << s << endl;
 
        double D[3];
        D[0] = A[0] - s;
        cout << D[0] << endl;
        for (int k = 1; k < 3; ++k){
 
            D[k] = A[k] - s - (B[k] * B[k]) / D[k - 1];
            cout << "D[k]:" << D[k] << endl;
            
        }
        
        double L[2];
        L[0] = B[1] / D[0];
        L[1] = B[2] / D[1];
        cout << "L[0]=" << L[0] << endl;
        cout << "L[1]=" << L[1] << endl;
        /*for (int t = 1; t < 3; ++t){
            L[t*(t-1)] = B[t] / D[t-1];
            cout << "L[k]:" << L[t] << endl;
        }*/
        for (int k = 0; k < 2; ++k){
            if (L[k] < 0){
                p++;
            }
        }
        cout << "p=" << p << endl;
 
        if (p < l){
            Mmin = s;
        p = 0;
            cout << "New Mmin=" << Mmin << endl;
        }
        else{
            Mmax = s;
            p = 0;
            cout << "New Mmax=" << Mmax << endl;
 
        }
        cout << "lambda="<<(Mmin+Mmax)/2 << endl;
        
    } while (fabs(Mmax - Mmin)>ek);
    
        
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2014, 13:38     Метод бисекции поиска собственных значений матрицы
Посмотрите здесь:

C++ Метод итераций: нахождение собственных векторов и собственных значений матрицы
C++ вид поиска, метод поиска
Вычисление собственных значений и собственных векторов матрицы C++
C++ Вычисление собственных значений и собственных векторов матрицы. Метод скалярных произведений
Вычисление собственных значений и собственных векторов матрицы C++
C++ метод бисекции C++
Метод бисекции C++
C++ КуР-алгоритм поиска собственных значенийдля почти треугольной матрицы!
Метод бисекции для нахождения корней в нелинейном уравнении C++
C++ Метод бисекции
Функция hmatrixevd из пакета alglib для поиска собственных значений и собственных векторов C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 00:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru