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

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

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

Метод прогонки - исправить код - C++

13.02.2014, 09:58. Просмотров 7431. Ответов 18
Метки нет (Все метки)

Всем здравствуйте!!!
Друзья, передо мной стоит задача, программная реализация метода прогонки.
У меня есть код, который реализует это самый метод прогонки, НО матрица A и матрица B там задается по-моему рандомно, а мне нужно чтоб я их вводил сам с клавиатуры. Программа должна работать в консольном приложении VS 2008. Если кто-то сталкивался с этим и знает как сделать, помогите пожалуйста) Вот код:
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include "stdafx.h"
 
#include <math.h>
 
#include <iostream>
using namespace std;
int i,n,k,n1=5; 
 
double t,z,q,d;
 
double A[5][5];
 
double B[5]; 
 
double eps[5];
 
double X[5]; 
 
double et[5];
 
int main()
 
{
 
for (i=0;i<5;i++)
 
{
 
for (k=0;k<5;k++)
 
{
 
A[i][k]=0;
 
}
 
}
 
cout<<"Enter q: ";
 
cin>>q;
 
cout<<endl<<"Enter d: ";
 
cin>>d;
 
cout<<endl;
A[0][0]=A[4][4]=q;
 
A[1][1]=A[2][2]=A[3][3]=-2;
 
for (i=0;i<4;i++)
 
{
 
k=i+1;
 
A[i][k]=A[k][i]=1;
 
} 
cout<<"Matrix A:"<<endl;
 
for (i=0;i<5;i++)
 
{
 
for (k=0;k<5;k++)
 
{
 
cout<<A[k][i]<<"\t ";
 
}
 
cout<<endl;
 
}
 
B[0]=B[4]=0;
 
for(i=1;i<=3;i++)
 
{
 
B[i]=d;
 
}
 
cout<<"Matrix B:"<<endl;
 
for (i=0;i<5;i++)
 
{
 
cout<<B[i]<<endl;
 
}
 
n=n1-1;
 
eps[0]=-A[0][1]/A[0][0];
 
et[0]=B[0]/A[0][0];
 
for(i=1;i<n;i++)
 
{
 
z=A[i][i]+A[i][i-1]*eps[i-1];
 
eps[i]=-A[i][i+1]/z;
 
et[i]=(B[i]-A[i][i-1]*et[i-1])/z;
 
}
 
X[n]=(B[n]-A[n][n-1]*et[n-1])/(A[n][n]+A[n][n-1]*eps[n-1]);
 
for(i=n-1;i>=0;i--)
 
{
 
X[i]=eps[i]*X[i+1]+et[i];
 
}
 
cout<<"Matrix X:"<<endl;
 
for(i=0;i<n1;i++)
 
{
 
cout<<X[i]<<endl;
 
}
 
return 0;
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2014, 09:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Метод прогонки - исправить код (C++):

Метод Рунге-Кутта 4 порядка (исправить код) - C++
Всем привет. Нужно решить пример методом Рунге-Кутта 4-го порядка точности. Пример: y=1/2*x*y x0=0 - начало интервала. y0=1 -...

Метод прогонки - C++
Здравствуйте, пытаюсь реализовать метод прогонки, не могу проверить работу, не понимаю как заполнять, и как сделать массив чтобы высчитывал...

метод прогонки С++ - C++
Запрограммировать краевую задачу методом прогонки(тридиагональнои матрицы) Добавлено через 4 минуты Очень срочно надо^_^ ...

Метод обратной прогонки - C++
Нужно реализовать метод обратной прогонки на с++.МОЖНО ВЗЯТЬ ЛЮБОЙ ПРИМЕР.КТО МОЖЕТ ПОМОГИТЕ!!

Метод прогонки для СЛАУ - C++
Народ, я почти умер. Писал метод прогонки, работает неправильно, выдает что-то близкое, но неточно. код: #include...

Метод прогонки с разделяемой памятью на CUDA - C++
Здравствуйте. Есть метод прогонки на CUDA для глобальной памяти. Не могу реализовать то же самое для разделяемой ,пишет ошибки и всё. ...

18
S_el
2109 / 1628 / 308
Регистрация: 15.12.2013
Сообщений: 6,491
13.02.2014, 10:21 #2
Вводить элементы с консоли можно в цикле через cin.
0
Trainer
2 / 2 / 0
Регистрация: 10.11.2011
Сообщений: 14
13.02.2014, 10:23 #3
Вот так:
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
#include <math.h>
#include <iostream>
#include <conio.h>
using namespace std;
 
int i,n,k,n1=5; 
double t,z,q,d;
double A[5][5];
double B[5]; 
double eps[5];
double X[5]; 
double et[5];
 
int main()
{
cout<<"Vvedite 5 strok po 5 4isel:"<<endl;
for (i=0;i<5;i++)
    for (k=0;k<5;k++)
        cin>>A[i][k];
 
cout<<"Matrix A:"<<endl;
for (i=0;i<5;i++)
    {
    for (k=0;k<5;k++)
        cout<<A[k][i]<<"\t ";
    cout<<endl;
    }
 
cout<<"Vvedite 3 4isla:"<<endl;
for(i=1;i<=3;i++)
    cin>>B[i];
 
cout<<"Matrix B:"<<endl;
for (i=0;i<5;i++)
    cout<<B[i]<<endl;
 
n=n1-1;
eps[0]=-A[0][1]/A[0][0];
et[0]=B[0]/A[0][0];
 
for(i=1;i<n;i++)
    {
    z=A[i][i]+A[i][i-1]*eps[i-1];
    eps[i]=-A[i][i+1]/z;
    et[i]=(B[i]-A[i][i-1]*et[i-1])/z;
    }
 
X[n]=(B[n]-A[n][n-1]*et[n-1])/(A[n][n]+A[n][n-1]*eps[n-1]);
 
for(i=n-1;i>=0;i--)
    X[i]=eps[i]*X[i+1]+et[i];
 
cout<<"Matrix X:"<<endl;
for(i=0;i<n1;i++)
    cout<<X[i]<<endl;
 
getch();
return 0;
}
1
Alexandr1966
25 / 25 / 1
Регистрация: 17.12.2012
Сообщений: 438
13.02.2014, 10:50  [ТС] #4
а матрица A должна быть обязательно 5 на 5 и матрица B из 3 элементов?
Можно вы поможете реализовать так чтоб я еще и размерности матриц задавал??
0
S_el
2109 / 1628 / 308
Регистрация: 15.12.2013
Сообщений: 6,491
13.02.2014, 11:02 #5
Цитата Сообщение от Alexandr1966 Посмотреть сообщение
Можно вы поможете реализовать так чтоб я еще и размерности матриц задавал??
Читайте про динамический массивы.
0
Alexandr1966
25 / 25 / 1
Регистрация: 17.12.2012
Сообщений: 438
13.02.2014, 11:27  [ТС] #6
Trainer, помогите правильно сделать, будьте любезны?)
0
zss
Модератор
Эксперт С++
6404 / 5970 / 1945
Регистрация: 18.12.2011
Сообщений: 15,401
Завершенные тесты: 1
13.02.2014, 11:38 #7
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
 
int main()
{
   double** A;
   double* B; 
   double* eps;
   double* X; 
   double* et;
   int N;
   cout<<"Vvedite Razmer massivov:";
   cin>>N;
// динамическое создание всех массивов
   B=new double[N];
   eps=new double[N];
   X=new double[N];
   et=new double[N];
   A=new double*[N];
   for(int i=0;i<N;i++)
       A[i]=new double[N];
   cout<<"Vvedite "<<N<<" strok po "<<N<<" 4isel:\n";
   for (i=0;i<N;i++)
       for (k=0;k<N;k++)
           cin>>A[i][k];
   n1=N;
// дальше как было только поменяйте константу 5 на N
// ...
// в конце удаление масивов
   getch();
   delete[] B;
   delete[] eps;
   delete[] et;
   delete[] X;
   for(int i=0;i<N;i++)
       delete[] A[i];
   delete[] A;
   return 0;
}
getch();
return 0;
}
0
Trainer
2 / 2 / 0
Регистрация: 10.11.2011
Сообщений: 14
13.02.2014, 11:42 #8
Если я правильно понял, то матрица А должна иметь одинаковое число столбцов и строк, а матрица В - то же число строк, правильно?
0
Alexandr1966
25 / 25 / 1
Регистрация: 17.12.2012
Сообщений: 438
13.02.2014, 11:51  [ТС] #9
Trainer, да да)
0
Trainer
2 / 2 / 0
Регистрация: 10.11.2011
Сообщений: 14
13.02.2014, 11:57 #10
Тогда можно так (без использования дин. массивов):
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
#include <math.h>
#include <iostream>
#include <conio.h>
using namespace std;
 
int i,n,k,n1; 
double z;
double A[50][50];
double B[50]; 
double eps[50];
double X[50]; 
double et[50];
 
int main()
{
cout<<"Vvedite razmernost matrici: ";
cin>>n1;
 
cout<<"Vvedite "<<n1<<" strok po "<<n1<<" 4isel:"<<endl;
for (i=0;i<n1;i++)
    for (k=0;k<n1;k++)
        cin>>A[i][k];
 
cout<<"Matrix A:"<<endl;
for (i=0;i<n1;i++)
    {
    for (k=0;k<n1;k++)
        cout<<A[k][i]<<"\t ";
    cout<<endl;
    }
 
cout<<"Vvedite "<<n1<<" 4isel:"<<endl;
for(i=1;i<=n1;i++)
    cin>>B[i];
 
cout<<"Matrix B:"<<endl;
for (i=0;i<n1;i++)
    cout<<B[i]<<endl;
 
n=n1-1;
eps[0]=-A[0][1]/A[0][0];
et[0]=B[0]/A[0][0];
 
for(i=1;i<n;i++)
    {
    z=A[i][i]+A[i][i-1]*eps[i-1];
    eps[i]=-A[i][i+1]/z;
    et[i]=(B[i]-A[i][i-1]*et[i-1])/z;
    }
 
X[n]=(B[n]-A[n][n-1]*et[n-1])/(A[n][n]+A[n][n-1]*eps[n-1]);
 
for(i=n-1;i>=0;i--)
    X[i]=eps[i]*X[i+1]+et[i];
 
cout<<"Matrix X:"<<endl;
for(i=0;i<n1;i++)
    cout<<X[i]<<endl;
 
getch();
return 0;
}
Размерность не больше 50. Хотя дин. массивы использовать правильней.
1
Ev_Hyper
Заблокирован
13.02.2014, 12:00 #11
Trainer, в чем смысл использования глобальных переменных?
0
Trainer
2 / 2 / 0
Регистрация: 10.11.2011
Сообщений: 14
13.02.2014, 12:04 #12
Ни в чем, я не обратил внимание. Как было в предложенном примере, так я и оставил.
Их можно сделать и локальными, ничего не изменится конкретно в этом проекте.
0
Alexandr1966
25 / 25 / 1
Регистрация: 17.12.2012
Сообщений: 438
13.02.2014, 12:18  [ТС] #13
Trainer, спасибо огромное)))
0
zss
Модератор
Эксперт С++
6404 / 5970 / 1945
Регистрация: 18.12.2011
Сообщений: 15,401
Завершенные тесты: 1
13.02.2014, 12:25 #14
Alexandr1966, Так все-таки, надо было делать динамическое выделение памяти или нет?
Цитата Сообщение от Alexandr1966 Посмотреть сообщение
Можно вы поможете реализовать так чтоб я еще и размерности матриц задавал??
0
Alexandr1966
25 / 25 / 1
Регистрация: 17.12.2012
Сообщений: 438
13.02.2014, 15:42  [ТС] #15
Да в принципе хоть как)))

Добавлено через 2 часа 31 минуту
А вот в этом методе прогонки матрицу А когда ввёл, она потом переворачивает столбцы и строки, так надо да в этом методе?
И вот матрицу В когда ввел допустим 1 2 3, она выводит её 0 1 2, так тоже надо в этом методе?
просто я не очень разбираюсь подскажите?

Добавлено через 38 минут
Ребят подскажите Trainer, zss
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2014, 15:42
Привет! Вот еще темы с ответами:

Метод прямой прогонки. Динамическое программирование - C++
надо написать прогу, которая искала бы кратчайший путь из одного конца неориентированного графа в другой путем прямой прогонки. я...

Динамическое программирование. Метод прямой прогонки - C++
Мне нужно реализовать граф с поиском минимального пути из начала графа в конец путем прямой прогонки.Сделал граф, как список ребер,...

Исправить код метод Ньютона для решения систем нелинейных уравнений под нужное условие - C++
Данный код для решения системы ax+tg(xy)=0; (y^2-b^2)+lnx=0 Перепишите его,пожалуйста для системы 2x-y-10=0 5x^2-20y^2-100=0 ...

Метод прогонки краевых задач для обыкновеных дифф. уравнений - C++
k(x)=sin^2(x)+1 q(x)=cosx f(x)=e^x \beta1=1 \beta2=1


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
13.02.2014, 15:42
Ответ Создать тему
Опции темы

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