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

Исправить программу на собственные значения и им соответствующие вектора - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Alexandr1966
25 / 25 / 1
Регистрация: 17.12.2012
Сообщений: 425
27.03.2014, 18:46     Исправить программу на собственные значения и им соответствующие вектора #1
Ребята вот смотрите: программа в принципе работает правильно (считает собственное значение L верно), НО собственный вектор матрицы, а именно то что находится по правую часть от матрицы А на картинке не верно. Помогите разобраться че к чему, может эпсилон не тот или еще что-нибудь???

Тестовый пример:

Матрица А:
4 2 2
2 5 1
2 1 6

Матрица x1 (вот это после равно справа от матрицы неверное считает):
0,8077c1
0,7720c1
c1

Ответ:
L1=8,3874

КОД ПРОГИ:
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
#include "stdafx.h"
#include "cmath"
#include "iostream"
#include "locale.h"
using namespace std;
 
void Input(int n,int A[][100])
{
    int i,j;
    for (i=0;i<n;i++)
        for (j=0;j<n;j++){
            std::cout << "Введите A[" << i << "][" << j << "]: ";
            std::cin >> A[i][j];
        }
}
 
void Matr(int A[][100],int n)
{
    float w0[100],w[100],summ=0,w0norm[100],e,d,d0;
    int i,j,k;
    w0[0]=1;
    for (i=1;i<n;i++)
        w0[i]=0;    
    do
    {
        for (i=0;i<n;i++)
            summ=summ+w0[i]*w0[i];
        d0=sqrt(summ);
        for (i=0;i<n;i++)
            w0norm[i]=w0[i]/d0;
        for (i=0;i<n;i++)
        {
            w[i]=0;
            for (j=0;j<n;j++)
                w[i]=w[i]+A[i][j]*w0norm[j];
        }
        summ=0;
        for (i=0;i<n;i++)
            summ=summ+w[i]*w[i];
        d=sqrt(summ);
        e=fabs(d-d0);
        for (i=0;i<n;i++)
            w0[i]=w[i];
        summ=0;
    } while(e>0.001);
    std::cout << "\nМатрица А:\n";
    for (i=0;i<n;i++){
        for (j=0;j<n;j++)
            std::cout << A[i][j] << " ";
        std::cout  << " = " << w0norm[i] << std::endl;
    }
    std::cout << "\nL = " << d << std::endl;  
}
 
int main()
{
    int n,A[100][100];
    setlocale(LC_ALL, "rus");
    std::cout << "Введите размерность квадратной матрицы = ";
    std::cin >> n;
    Input(n,A);
    Matr(A,n);
    
    std::cin.get();
    std::cin.get();
    return 0;
}
Добавлено через 1 час 9 минут
ребята подскажете?

Добавлено через 22 часа 27 минут
помогите пожалуйста

Добавлено через 1 час 51 минуту
великие программисты вы гдее?)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2014, 18:46     Исправить программу на собственные значения и им соответствующие вектора
Посмотрите здесь:

как связаны собственные значения и векторы матриц А и А^5 ? C++
Напишите программу, присваивающую значения элементов списка указателей на символьные строки в стиле С (тип char* ) элементам вектора строк C++
C++ Написать собственные аналоги функций strlen, strcmp, strchr, strcpy, strcat (дописать и исправить ошибки)
Функция, которая вычисляет собственные значения н-мерной матрицы C++
Вычислить значения у, соответствующие каждому значению х C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IrineK
Заблокирован
30.03.2014, 09:02     Исправить программу на собственные значения и им соответствующие вектора #21
Нормально все и с этим вектором (желтый столбец - почти нули).
Оранжевый столбец - приведение вектора (0,540055; 0,51953; 0,66214) к виду

0,815620564
0,784622587
1

Делением каждой составляющей на 0,66214.
Как видите, вектор с заданной точностью похож на
0,8077c1
0,7720c1
c1
Миниатюры
Исправить программу на собственные значения и им соответствующие вектора  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IrineK
Заблокирован
30.03.2014, 09:38     Исправить программу на собственные значения и им соответствующие вектора #22
У вас точность вычислений - до второго знака. Повысьте ее до четвертого знака: строка 45
C++
1
while(e>0.00001);
При этом вы будете получать вектор с точностью до множителя.
Так, полученный сейчас (0,540055; 0,51953; 0,66214) соответствует с1 = 0,66214.

Добавлено через 28 минут
Кроме того, полученный вектор является нормированным, то бишь
0,540055 ^2 + 0,51953 ^2 + 0,66214 ^2 = 1
что кошерно.
Alexandr1966
25 / 25 / 1
Регистрация: 17.12.2012
Сообщений: 425
31.03.2014, 05:13  [ТС]     Исправить программу на собственные значения и им соответствующие вектора #23
IrineK, только точность поменять и программа заработает правильно?

Добавлено через 2 минуты
IrineK, мне нужно, чтоб в программе выводило вектор который у вас КОРИЧНЕВЫМ ЦВЕТОМ
IrineK
Заблокирован
31.03.2014, 06:37     Исправить программу на собственные значения и им соответствующие вектора #24
Еще раз для тех, кто в определенных актуальных средствах передвижения:
Цитата Сообщение от IrineK Посмотреть сообщение
полученный сейчас (0,540055; 0,51953; 0,66214) соответствует с1 = 0,66214.
получите вектор, поделите каждый элемент на последний.

Цитата Сообщение от Alexandr1966 Посмотреть сообщение
мне нужно
Это требование препа или религии?

Добавлено через 27 минут
Продолжу.
Вычисление собственных матриц дает возможность найти собственные вектора.
Это не является просто мазохистским упражнением в рамках курса вышки.

Находит реальное практическое применение при повороте систем координат.
Т.е., необходимо для упрощения описания динамических систем в физике и компьютерной графике.

Собственные вектора всегда находятся с точностью до множителя, поскольку являются решением избыточной системы однородных уравнений. Вектор, найденный в примере, предложенном в вашей книге, является нормированным, т.е. именно тем, который нужен на практике для поворота СК.

Если вы хотите вернуть его в ненормированное состояние (в принципе - нерабочее), вам нужно сделать операцию, описанную выше.
Alexandr1966
25 / 25 / 1
Регистрация: 17.12.2012
Сообщений: 425
31.03.2014, 16:24  [ТС]     Исправить программу на собственные значения и им соответствующие вектора #25
IrineK, Я не понимаю как код исправить, помогите исправить, преподаватель требует((((
IrineK
Заблокирован
31.03.2014, 18:02     Исправить программу на собственные значения и им соответствующие вектора #26
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Alexandr1966 Посмотреть сообщение
помогите исправить
Строка 50 заменяем на:
C++
1
std::cout  << " = " << w0norm[i]/w0norm [n-1] << std::endl;
Всё.
Alexandr1966
25 / 25 / 1
Регистрация: 17.12.2012
Сообщений: 425
01.04.2014, 15:57  [ТС]     Исправить программу на собственные значения и им соответствующие вектора #27
IrineK, спасибо вам огромное)))

Добавлено через 10 часов 7 минут
IrineK, а вот еще вопрос? в моем коде ИТТЕРАЦИОННЫЙ ПРОЦЕСС в этом методе есть???
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2014, 03:24     Исправить программу на собственные значения и им соответствующие вектора
Еще ссылки по теме:

C++ Вычислить значения t, соответствующие каждому значению х
Вычислить значения y, соответствующие каждому значению х C++
Вычислить собственные значения матрицы через итерационный процесс C++

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

Или воспользуйтесь поиском по форуму:
IrineK
Заблокирован
02.04.2014, 03:24     Исправить программу на собственные значения и им соответствующие вектора #28
Итерационный процесс - строки 24-45 - достижение точности результата до 3 знака за конечное во шагов, то бишь итераций.
Yandex
Объявления
02.04.2014, 03:24     Исправить программу на собственные значения и им соответствующие вектора
Ответ Создать тему
Опции темы

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