• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Ошибка Вычисления Главного Собственного Вектора. С++.

  • Автор темы Kro0sh
  • Дата начала
K

Kro0sh

Нужно написать программу.Что в общем то я сделал,но есть проблема пропала переменная, но я никак не пойму где именно это произошло.Вследствие чего выводятся непонятно откуда взятые значения. :( Само задание написано в прикрепленном файле 1.doc. Просьба помочь нуждаюсь в зачете по этому предмету :)

Главный собственный вектор
1.11193e-118 1.09975e-106 6.93655e-076 1
Оценки главного собственного значения
8.9934e+117 7.27439e+106 8.64983e+075 71

Программа :

C++:
#include <math.h>
#include <fstream>
#include <iostream>
#include <conio.h>
using namespace std;

double ** CreateMatrix (int M, int N, ifstream *pFin = NULL)
{
double **A = new double *[M];
double *Body = new double [M * N], *pRow = Body;
for (int i = 0; i < M; A[i++] = pRow, pRow += N);
if (pFin == NULL) return A;
for (int i = 0; i < M; i++)
for (int j = 0; j < N; *pFin >> A[j++]);
return A;
}

int main (int n, char *narg[])
{
setlocale (LC_ALL, "Russian");
if (n != 3)
{
cout << "Неверно указаны параметры:" << endl;
cout << "1) Путь до входного файла" << endl << "2) Путь выводного файла";
getch();
return 1;
}
ifstream Fin (narg[1]);
if (!Fin.is_open())
{
cout << narg[1] << " не открылся";
getch();
return 2;
}
ofstream Fout (narg[2]);
if (!Fout.is_open())
{
cout << narg[2] << " не открылся";
getch();
return 2;
}
int N;
Fin >> N;
double **Ain = CreateMatrix (N, N, &Fin);
double **A = CreateMatrix (N, N);
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
A[j] = Ain[j];
double *V = new double [N];
double *Vold = new double [N];
double D;
Vold[0] = 0.0;
for (;;)
{ //9
double S = 0;

for (int i = 0; i < N; i++) //10
{
V = 0;
for (int j = 0; j < N;j++)
V+= A[j];
S += V;
};
for (int i = 0; i < N; i++) //11
V=(V / S);

if (Vold[0] != 0.0) //12
{
double t=0;
for (int i = 0; i < N; i++)
t+=pow((V-Vold), 2); //12.1
D = sqrt (t / N);
if (D < 0.0000001) //12.2
break;
}

for (int i = 0; i < N; i++) //13
Vold = V;

for ( int i = 0; i < N; i++) //14
{
for ( int j = 0; j < N; j++)
{
double t = 0;
for ( int k = 0; k < N; k++)
t += (A[k] * A[k][j]);
A[j] = t;
}
}
}//15

double *E = new double [N]; //16
for (int i = 0; i < N; i++)
{
E = 0;
for (int j = 0; j < N; j++)
E += Ain[j]*V[j];
}
for (int i = 0; i < N; i++)
E = E / V;

Fout << "Главный собственный вектор" << endl;
for (int i = 0; i < N; i++)
Fout << V << " ";
Fout << endl << "Оценки главного собственного значения" << endl;
for (int i = 0; i < N; i++)
Fout << E << " ";
}
C++:
 

Вложения

  • 1.doc
    46 КБ · Просмотры: 155
  • Data.txt
    38 байт · Просмотры: 472
  • DataOut.txt
    151 байт · Просмотры: 542
R

rrrFer

Код:
double ** CreateMatrix (int M, int N, ifstream *pFin = NULL) 
{
double **A = new double *[M];
double *Body = new double [M * N], *pRow = Body;
for (int i = 0; i < M; A[i++] = pRow, pRow += N);
if (pFin == NULL) return A;
for (int i = 0; i < M; i++)
for (int j = 0; j < N; *pFin >> A[i][j++]);
return A;
}
штоэта?

Добавлено:
пропала переменная,
как это понять?
 
K

Kro0sh

Код:
double ** CreateMatrix (int M, int N, ifstream *pFin = NULL) 
{
double **A = new double *[M];
double *Body = new double [M * N], *pRow = Body;
for (int i = 0; i < M; A[i++] = pRow, pRow += N);
if (pFin == NULL) return A;
for (int i = 0; i < M; i++)
for (int j = 0; j < N; *pFin >> A[i][j++]);
return A;
}
штоэта?

Добавлено:
как это понять?

Это функция создания матрицы. "Пропала переменная" в том смысле что в файле вывода выводится не верный результат.( По моему это из-за какой то переменной)
 
R

rrrFer

По моему это из-за какой то переменной

дак пройдись отладчиком и посмотри на значения переменных.
 
K

Kro0sh

На мой взгляд ошибка в переменной E, но в ней и ошибаться то вроде негде -_-
 
R

rrrFer

вобщем либо ты где-то делишь на ноль (у тебя тип дабл - там может быть просто очень маленькое значение, на которое он поделит без эксепшнов).
Я посмотрел код, вроде бы все инициализируется перед использованием, наверное ты ошибся в алгоритме или вводишь недопустимые данные.
 
K

Kro0sh

Видимо проблема вообще в задании. Так как у одногрупницы попался этот же вариант и такая же ошибка(Она сдавала во вторник), препод ошибку у нее так и не нашел) Скорей всего на самом деле просто где то очень маленькое значение)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!