С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Alexandr1966
26 / 26 / 1
Регистрация: 17.12.2012
Сообщений: 438
#1

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

27.03.2014, 18:46. Просмотров 1606. Ответов 27
Метки нет (Все метки)

Ребята вот смотрите: программа в принципе работает правильно (считает собственное значение 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 минуту
великие программисты вы гдее?)
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2014, 18:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Исправить программу на собственные значения и им соответствующие вектора (C++):

Исправить программу по поиску значения мин и мах функции - C++
Условие: Значение функции f(x)=4x3-3x2+2x-1 определены в точках x=X0(hx)Xn. ( Х0 - начальное, hx - шаг, Xn - конечное ) Определить...

Напишите программу, присваивающую значения элементов списка указателей на символьные строки в стиле С (тип char* ) элементам вектора строк - C++
Напишите программу, присваивающую значения элементов списка указателей на символьные строки в стиле С (тип char* ) элементам вектора строк...

Написать собственные аналоги функций strlen, strcmp, strchr, strcpy, strcat (дописать и исправить ошибки) - C++
вот задание: Написать собственные аналоги функций strlen, strcmp, strchr, strcpy, strcat из стандартной библиотеки cstring (string.h). ...

Как связаны собственные значения и векторы матриц А и А^5? - C++
помогите пожалуйста решить вот такую задачу(очень срочно надо):как связаны собственные значения и векторы матриц А и А^5 ?

Функция, которая вычисляет собственные значения н-мерной матрицы - C++
Подскажите пожалуйста функцию, которая вычисляет собственные значения n-мерной матрицы. Или источники где подсмотреть. Спасибо. Очень...

Вычислить собственные значения матрицы через итерационный процесс - C++
Задача вычислить собственные значения через итерационный процесс пишу программу для матрицы 5 0 0 0 4 0 0 0 3 решает все верно,...

27
IrineK
Заблокирован
30.03.2014, 08:10 #16
Так у вас все правильно.
0
Alexandr1966
26 / 26 / 1
Регистрация: 17.12.2012
Сообщений: 438
30.03.2014, 08:34  [ТС] #17
IrineK, так вектор то неправильно выводится:
Матрица x1 (вот это после равно справа от матрицы неверное считает):
0,8077c1
0,7720c1
c1

Добавлено через 19 секунд
IrineK, программу мою запускали? она в консольном приложении VS2008 работает
0
Alexandr1966
26 / 26 / 1
Регистрация: 17.12.2012
Сообщений: 438
30.03.2014, 08:38  [ТС] #18
вот посомтрите
0
Миниатюры
Исправить программу на собственные значения и им соответствующие вектора  
Alexandr1966
26 / 26 / 1
Регистрация: 17.12.2012
Сообщений: 438
30.03.2014, 08:42  [ТС] #19
IrineK, или это вовсе не вектор выводится? тогда что?
0
IrineK
Заблокирован
30.03.2014, 08:47 #20
Цитата Сообщение от Alexandr1966 Посмотреть сообщение
программу мою запускали?
Нет.
Вы же предоставили все данные.
Хотя, как оказалось, не все и не так.
Ладно, посмотрим.
0
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
0
Миниатюры
Исправить программу на собственные значения и им соответствующие вектора  
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
что кошерно.
0
Alexandr1966
26 / 26 / 1
Регистрация: 17.12.2012
Сообщений: 438
31.03.2014, 05:13  [ТС] #23
IrineK, только точность поменять и программа заработает правильно?

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

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

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

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

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

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

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

Решение краевой задачи на собственные значения методом Галеркина - C++
Помогите пожалуйста реализовать эту задачу, буду очень благодарна! Очень нужно

Составить главную программу и функцию. Для данного вектора А(М) найти количество неповторяющихся элементов вектора - C++
Здравствуйте. Буду очень благодарен,если кто нибудь напишет два кода к этим задачам. Спасибо за внимание. Задача 1. Составить...

Вычислить значения y, соответствующие каждому значению х - C++
Не могу решить, понятия не имею как решать... помогите) Вычислить значения y, соответствующие каждому значению х ( xn≤x≤xk , шаг...

Вычислить значения z, соответствующие каждому значению x - C++
Вычислить значения z, соответствующие каждому значению x (xn=&lt;x=&lt;xk, шаг изменения x равен dx) по формуле z=sin(cos(x)).Определить сумму...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.