Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 31.03.2017
Сообщений: 8
1

Инициализация глобальной переменной

15.04.2017, 19:12. Показов 919. Ответов 2
Метки нет (Все метки)

Здравствуйте, мне необходимо в программе по решению СНАУ добавить возможность задавать коэфициенты при неизвестных вводом через консоль.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
vector<vector<double>> J(3, vector<double>(3, 0)); // матрица Якоби
vector<double> Z(3), Fk(3), Zk(3); // под вектора   
vector<vector<double>> T; // обратная матрица
double k = 0, dt = 0.000001, e = 0.00001;
// Ввод функций
double f1(double x, double y, double z) {
   return  x + x*x - 2*y*z - 0.1;
}
 
double f2(double x, double y, double z) {
   return  y - y*y + 3*x*z + 0.2;
}
 
double f3(double x, double y, double z) {
   return  z + z*z + 2*x*y - 0.3;
}
............
Как добавить возможность задавать коэффициенты перед неизвестными вводом с консоли? ( не вводя их каждый раз в функцию,как показал ниже )
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
double f1(double x, double y, double z) {
int M;
cout << "введите M";
cin >> M;
   return  x + x*x - M*y*z - M;
}

Если задать изначально глобальную переменную int m=2, то все работает
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
.........
using namespace std;
int M=2;
vector<vector<double>> J(3, vector<double>(3, 0)); // матрица Якоби
vector<double> Z(3), Fk(3), Zk(3); // под вектора   
vector<vector<double>> T; // обратная матрица
double k = 0, dt = 0.000001, e = 0.00001;
 
double f1(double x, double y, double z) {
   return  x + x*x - M*y*z - M;
}
 
double f2(double x, double y, double z) {
   return  y - y*y + M*x*z + M;
}
 
double f3(double x, double y, double z) {
   return  z + z*z + M*x*y - M;
}
............

вводом с консоли никак не получается. Пробовал
Кликните здесь для просмотра всего текста

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
............................
using namespace std;
int M;
void znach()
{
cout << "введите M";
cin >> M;
}
 
vector<vector<double>> J(3, vector<double>(3, 0)); // матрица Якоби
vector<double> Z(3), Fk(3), Zk(3); // под вектора   
vector<vector<double>> T; // обратная матрица
double k = 0, dt = 0.000001, e = 0.00001;
 
double f1(double x, double y, double z) {
   return  x + x*x - M*y*z - M;
}
 
double f2(double x, double y, double z) {
   return  y - y*y + M*x*z + M;
}
 
double f3(double x, double y, double z) {
   return  z + z*z + M*x*y - M;
}
............

но в данном случае программа работала некорректно.

Добавлено через 50 минут
На всякий случай выложил полный начальный код
Кликните здесь для просмотра всего текста

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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
 
using namespace std;
 
 
#define N 3 // 
 
 
vector<vector<double>> J(N, vector<double>(N, 0)); // матрица Якоби
vector<double> Z(N), Fk(N), Zk(N); // под вектора   
vector<vector<double>> T; // обратная матрица
double k = 0, dt = 0.000001, e = 0.00001;
 
//===========Функции=====================
double f1(double x, double y, double z) {
   return  x + x*x - 2*y*z - 0.1;
}
 
double f2(double x, double y, double z) {
   return  y - y*y + 3*x*z + 0.2;
}
 
double f3(double x, double y, double z) {
   return  z + z*z + 2*x*y - 0.3;
}
 
//===========Производные=================
typedef double(*pointer)(double, double, double);
double dtx(pointer f, double x, double y, double z, double dt) {
    return (f(x + dt, y, z) - f(x,y,z)) / dt;
}
 
double dty(pointer f, double x, double y, double z, double dt) {
    return (f(x, y + dt, z) - f(x,y,z)) / dt;
}
 
double dtz(pointer f, double x, double y, double z, double dt) {
    return (f(x, y, z + dt) - f(x,y,z)) / dt;
}
 
// найти обратную матрицу
vector <vector<double>> inverse(vector<vector<double>> J) {
    int n = J.size();
    vector <vector<double>> T(n, vector<double> (n, 0));  
    for (int i = 0; i < n; i++){
        T[i][i] = 1.0;
    }  
    for (int i = 0; i < n; i++){
        int row = i;
        double mx = J[i][i];
        for(int k = i + 1; k < n; k++){
            if (abs(J[k][i]) > mx){
                row = k;
                mx = abs(J[k][i]);
            }
        }
        if (row != i) {
            swap(J[row], J[i]);
            swap(T[row], T[i]);
        }
        for (int j = i+1; j < n; j++){
            double e = J[j][i]/J[i][i];
            for (int k = 0; k < n; k++){
                J[j][k] -= e*J[i][k];
                T[j][k] -= e*T[i][k];
            }
        }
    }
    for (int i = n - 1; i >= 0; i--) {
        for (int j = i - 1; j >= 0; j--){
            double e = J[j][i]/J[i][i];
            for (int k = 0; k < n; k++){
                J[j][k] -= e*J[i][k];
                T[j][k] -= e*T[i][k];
            }
        }
        for (int j = 0; j < n; j++) {
            T[i][j] /= J[i][i];
        }
    }
    return T;
}
 
// Вывод на печать
 
void Print(int k)
{
    
    if ( k == 1 )
    printf("\n|    k   |    Zk   |  F(Zk)  |   Zk+1  |    e<   |\n");        
    printf(  "|--------|---------|---------|---------|---------|\n");
        
    printf("| %4d   |", k);
    for (int i = 0; i < N; i++) {
            printf(" %-8.4f|", Z[i]);
            printf(" %-8.4f|", Fk[i]);
            printf(" %-8.4f|", Zk[i]);
            printf(" %-8.5f|", abs(Z[i]-Zk[i]));            
            if( i + 1 != N ) printf("\n|        |");
            else puts("");
    }
}
    
void main()
{
    // задать начальное приближение
    // X            Y            Z
    Zk[0] = -0.1; Zk[1] = 0.2; Zk[2] = -0.3;
    
    do
    {   
        // копируем текущее значение
        for (int i = 0; i < N; i++) Z[i] = Zk[i];
        
        // вычисляем ф-ции
        Fk[0] = f1(Z[0], Z[1], Z[2]); 
        Fk[1] = f2(Z[0], Z[1], Z[2]);
        Fk[2] = f3(Z[0], Z[1], Z[2]);
        
        // составить матрицу Якоби
        J[0][0] = dtx(&f1, Z[0], Z[1], Z[2], dt);
        J[0][1] = dty(&f1, Z[0], Z[1], Z[2], dt);
        J[0][2] = dtz(&f1, Z[0], Z[1], Z[2], dt);
                
        J[1][0] = dtx(&f2, Z[0], Z[1], Z[2], dt);
        J[1][1] = dty(&f2, Z[0], Z[1], Z[2], dt);
        J[1][2] = dtz(&f2, Z[0], Z[1], Z[2], dt);
 
        J[2][0] = dtx(&f3, Z[0], Z[1], Z[2], dt);
        J[2][1] = dty(&f3, Z[0], Z[1], Z[2], dt);
        J[2][2] = dtz(&f3, Z[0], Z[1], Z[2], dt);
                    
        // найти обратную матрицу от J
        T = inverse(J); 
    
        // умножаем матрицу T на вектор Fk   
        for (int i = 0; i < N; i++) {
            Zk[i] = 0;
            for (int j = 0; j < N; j++) {
                Zk[i] += T[i][j] * Fk[j];
            }
            Zk[i] = Z[i] - Zk[i]; // отнять от текущего значения
        }
        k++;
        Print( (int)k);
    }while ( abs(Z[0] - Zk[0]) > e );
    
    printf("\n Roots \n X : %.4f\n Y : %.4f\n Z : %.4f\n", Zk[0], Zk[1], Zk[2]);
 
 
    system("pause");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.04.2017, 19:12
Ответы с готовыми решениями:

Различие глобальной и глобальной статической переменной
у нас есть заголовочный файл со стражами, допустим global.h , его используют несколько других...

Избавиться от глобальной переменной
#include &lt;iostream&gt; // подключаем ввод/вывод #include &lt;cmath&gt; ...

Вывод глобальной переменной
Переменная f объявлена и инициализирована как глобальная переменная, но после этих циклов...

Можно ли обратиться к перекрытой глобальной переменной?
int x; void f(int x); int main() { f(2); return 0; }; void f(int x) { x=x; // здесь я...

2
nd2
3416 / 2796 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
15.04.2017, 19:26 2
Цитата Сообщение от ofsavier Посмотреть сообщение
Пробовал
Цитата Сообщение от ofsavier Посмотреть сообщение
но в данном случае программа работала некорректно.
И где, в коде, вызывал znach()?
1
0 / 0 / 0
Регистрация: 31.03.2017
Сообщений: 8
15.04.2017, 21:00  [ТС] 3
Цитата Сообщение от nd2 Посмотреть сообщение
И где, в коде, вызывал znach()?
Точно, спасибо, все работает)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2017, 21:00

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Srand для обнуления глобальной переменной
Надо для переменной задать рандомное значение, чтобы каждый раз при запуске обнулял. #pragma once...

Как сделать матрицу глобальной переменной?
int main() {randomize(); int N,M; cout&lt;&lt;&quot;Vvedit rozmirnist matrici NxM:\n&quot;; cin&gt;&gt;N; cin&gt;&gt;M;...

Работа с глобальной переменной типа bool
ок, я создала глобальную переменную типа bool (да, лучше этого избегать и все такое, но сейчас так...

Увеличение значения переменной, обявленной в глобальной области
Начал изучать CUDA, т. к. надо пистаь курсач... И вот у меня появился вопрос. Допустим я выделил в...

Как изменить значение глобальной переменной в функции?
#include &lt;cstdlib&gt; #include &lt;stdlib.h&gt; #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;math.h&gt; ...

Класс памяти по умолчанию для глобальной переменной
Здравствуйте! Прочитала такую вещь тут Вот что-то не укладывается мне в голове пункт 2 и...


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

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

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