Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
1

Вылетает программа

31.01.2019, 00:17. Просмотров 860. Ответов 41
Метки нет (Все метки)

вылетает при нахождении у0 и дальше не идет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void func(double y0, double y1, double y2, double y3, double t0, double max_t, double h, int n, double matr[N][N]) {
 
    double t = t0;
    for (int i = 0; i < ((max_t - t0) / h); i++) {
        std::cout << t << "\t" << std::setprecision(5) << y0 << "\t" << y1 << "\t" << y2 << "\t" << y3 << std::endl;
        y0 += matr_inv[N][N]*h*dy0dt(y0,y1,y2,y3,t0);
        y1 += (matr_inv[N][N] * h*dy1dt(y0, y1, y2, y3, t0));
        y2 += (matr_inv[N][N] * h*dy2dt(y0, y1, y2, y3, t0));
        y3 += (matr_inv[N][N] * h*dy3dt(y0, y1, y2, y3, t0));
        t = t + h;
    }
    std::cout << t << "\t" << std::setprecision(5) << y0 << "\t" << y1 << "\t" << y2 << "\t" << y3 << std::endl;
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2019, 00:17
Ответы с готовыми решениями:

Вылетает программа
Компилятор ошибок не выдает. В ходе работы программы вылетает окно: Скриншот Вот код: #include...

Вылетает программа
Работаю в dev-c++ программа компилируется нормально, как только запускаю вылетает. Помогите...

Вылетает программа
Здравствуйте еще раз! Сама по себе программа работает корректно, но после вывода информации в...

программа вылетает.
привет всем! я новичок. программа ошибок не выдаёт. После ввода всех переменных программа вылетает...

Вылетает программа
Здравствуйте! Сама формулировка задачи: Массив записей содержит информацию о результатах сдачи...

41
L0M
884 / 453 / 231
Регистрация: 01.10.2018
Сообщений: 1,005
Завершенные тесты: 1
31.01.2019, 00:21 2
С учётом того, что написано в аргументах функции, matr_inv[N][N] - это гарантированный выход за границы массива.
0
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
31.01.2019, 00:32  [ТС] 3
L0M, это моя матрица, которую я нашла

Добавлено через 24 секунды
L0M, а как тогда пробовать задавать ?
0
Yetty
2582 / 1814 / 1200
Регистрация: 18.12.2017
Сообщений: 5,833
31.01.2019, 00:38 4
ElKros, напишите условие задачи и Ваш код
0
31.01.2019, 00:38
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
31.01.2019, 00:45  [ТС] 5
Yetty,
http://www.cyberforum.ru/cgi-bin/latex.cgi?{y}_{k+1}={y}_{k}+{\left[E-h/2*A \right]}^{-1}f({t}_{k},{y}_{k})h
A - якобиан системы, f - система
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#include <iostream>
#include <iomanip>
#include <functional>
#include <vector>
#include <boost/multiprecision/cpp_bin_float.hpp>
 
using namespace boost::multiprecision;
using namespace std;
 
typedef number<cpp_bin_float<200>> cpp_dec_float_unlim;
 
#define double cpp_dec_float_unlim
 
#define N 4 
 
double dy0dt(const double& y0, const double& y1, const double& y2, const double& y3, const double& t) {
    return double(8.85e4) - y2 * y0*((double(0.2) - y0) / (double(1.) - y1)) + y0 / double(1e-8);
}
double dy1dt(const double& y0, const double& y1, const double& y2, const double& y3, const double& t) {
    return y0 * y2;
}
double dy2dt(const double& y0, const double& y1, const double& y2, const double& y3, const double& t) {
    return y0 * y3;
}
double dy3dt(const double& y0, const double& y1, const double& y2, const double& y3, const double& t) {
    return double(1e30)*sqrt(y0)*exp(double(-0.25) / y0);
}
 
void getCofactor(double A[N][N], double temp[N][N], int p, int q, int n)
{
    int i = 0, j = 0;
    for (int row = 0; row < n; row++)
    {
        for (int col = 0; col < n; col++)
        {
            if (row != p && col != q)
            {
                temp[i][j++] = A[row][col];
                if (j == n - 1)
                {
                    j = 0;
                    i++;
                }
            }
        }
    }
}
 
double determinant(double A[N][N], int n)
{
    double D = 0;
    if (n == 1)
        return A[0][0];
    double temp[N][N]; 
    int sign = 1;  
    for (int f = 0; f < n; f++)
    {
        getCofactor(A, temp, 0, f, n);
        D += sign * A[0][f] * determinant(temp, n - 1);
 
        sign = -sign;
    }
    return D;
}
void adjoint(double A[N][N], double adj[N][N])
{   
    if (N == 1)
    {
        adj[0][0] = 1;
        return;
    }
    int sign = 1;
    double temp[N][N];
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            getCofactor(A, temp, i, j, N);
 
            sign = ((i + j) % 2 == 0) ? 1 : -1;
 
            adj[j][i] = (sign)*(determinant(temp, N - 1));
        }
    }
}
 
bool inverse(double A[N][N], double inverse[N][N])
{
    double det = determinant(A, N);
    if (det == 0)
    {
        cout << "Singular matrix, can't find its inverse";
        return false;
    }
 
 
    double adj[N][N];
 
    adjoint(A, adj);
 
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            inverse[i][j] = adj[i][j] / double(det);
    return true;
}
 
void PrintMatr(double mas[N][N], int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            std::cout << mas[i][j] << " ";
        std::cout << endl;
    }
}
 
struct my_data {
 
    double t, y0, y1, y2, y3;
    my_data(double _t, double _y0, double _y1, double _y2, double _y3) : t(_t), y0(_y0), y1(_y1), y2(_y2), y3(_y3) {}
 
};
void rosenbrock(double y0, double y1, double y2, double y3, double t0, double max_t, double h, int n, double matr_inv[N][N]) {
 
    double t = t0;
 
    for (int i = 0; i < ((max_t - t0) / h); i++) {
 
        std::cout << t << "\t" << std::setprecision(5) << y0 << "\t" << y1 << "\t" << y2 << "\t" << y3 << std::endl;
        y0 += (matr_inv[N][N] * h*dy0dt(y0, y1, y2, y3, t0));
        y1 += (matr_inv[N][N] * h*dy1dt(y0, y1, y2, y3, t0));
        y2 += (matr_inv[N][N] * h*dy2dt(y0, y1, y2, y3, t0));
        y3 += (matr_inv[N][N] * h*dy3dt(y0, y1, y2, y3, t0));
 
        t = t + h;
    }
    std::cout << t << "\t" << std::setprecision(5) << y0 << "\t" << y1 << "\t" << y2 << "\t" << y3 << std::endl;
}
 
 
int main()
{
    double y0 = 10e-10, y1 = 0, y2 = 0, y3 = 0, h = 1e-9;
    double beg_time = 0.0, max_time = 2.5;
    
    //единичная матрица
    double a[N][N];
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (i == j) a[i][j] = 1;
            else a[i][j] = 0;
        }
    }
 
    // якобиан системы
    double jac[N][N] = {
                        {(2 * (y2 * (y0 - 0.1) - 50000000.0 * (y1 - 1.0))) / (1.0 - y1), ((y0 - 0.2)*y0 * y2) / pow((1.0 - y1), 2.), ((y0 - 0.2)*y0) / (1.0 - y1),  0.0 },
                        {y2, 0.0, y0, 0.0},
                        {y3, 0.0, 0.0, y0},
                        {(5 * pow(10, 29.)*(exp(-0.75 / y0))*(1.5 + y0)) / pow(y0, 3. / 2.), 0.0, 0.0, 0.0}
                    };
    
    //умножение матрицы на число
    double umn[N][N];
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            jac[i][j] *= (h / 2);
            umn[i][j] = jac[i][j];
        }
    }
    
    // вычитание матрицы
    double temp[N][N];
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            temp[i][j] = a[i][j] - umn[i][j];
            //temp[i][j] = a[i][j] - (h/2)*jac[i][j];
        }
    }
 
    double adj[N][N]; 
 
    double inv[N][N]; 
    adjoint(temp, adj);
 
    if (inverse(temp, inv))
        PrintMatr(inv, N);
 
 
    cout << "Rosenbroke1 method:\n";
    rosenbrock(y0, y1, y2, y3, beg_time, max_time, h, N, inv);
 
    system("pause");
 
    return 0;
}
0
L0M
884 / 453 / 231
Регистрация: 01.10.2018
Сообщений: 1,005
Завершенные тесты: 1
31.01.2019, 01:14 6
Цитата Сообщение от ElKros Посмотреть сообщение
это моя матрица, которую я нашла
Вы молодец, что нашли таки свою матрицу
Только вопрос-то в другом.
Вы пишете
C++
1
2
3
4
5
6
7
#define N 4 
// ...
 
void rosenbrock(double y0, double y1, double y2, double y3, double t0, double max_t, 
    double h, int n, double matr_inv[N][N]) {
    // ...
}
Следовательно для matr_inv допустимый диапазон индексов 0..N-1 для каждого измерения. А в теле функции вы пишете
C++
1
        y0 += (matr_inv[N][N] * h*dy0dt(y0, y1, y2, y3, t0));
т.е. обращаетесь явно за границу массива.

Мне лениво искать как там должна выглядеть формула, но могу предположить, что
C++
1
        y0 += (matr_inv[n][n] * h*dy0dt(y0, y1, y2, y3, t0));
не зря же вы int n в функцию передаёте.
0
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
31.01.2019, 01:45  [ТС] 7
L0M, если меняю на n, то все равно вылетает...

Добавлено через 24 минуты
L0M, так-то n у меня нигде не встречается. все ссылается на N
0
L0M
884 / 453 / 231
Регистрация: 01.10.2018
Сообщений: 1,005
Завершенные тесты: 1
31.01.2019, 02:11 8
Цитата Сообщение от ElKros Посмотреть сообщение
если меняю на n, то все равно вылетает...
Ну да, немудрено. Вы же при вызове передаёте N для формального параметра n.
Я не посмотрел с какими параметрами функция вызывается.
Цитата Сообщение от ElKros Посмотреть сообщение
все ссылается на N
Но вы понимаете, что у вас обращение идёт за пределы массива?

И вообще в функции void rosenbrock() написана какая-то лажа. Вычисление y0-y3 не зависит ни от переменной цикла, ни от t, которую вы считаете в теле цикла, но посчитанное значение не используете. А зависит только от начальных значений y0-y3, параметора t0 и этого странного значения в матрице matr_inv. Подозрительно это.
0
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
31.01.2019, 02:23  [ТС] 9
L0M, уже поняла, что выходит за пределы массива. Подскажите пожалуйста, как тогда можно записать формулу ?

Добавлено через 7 минут
Yetty, помогите, пожалуйста.. уже перепробовали многое, но ничего путнего не удается сделать...
В формуле А - это якобиан, зависящий от to и yk.
0
L0M
884 / 453 / 231
Регистрация: 01.10.2018
Сообщений: 1,005
Завершенные тесты: 1
31.01.2019, 02:28 10
Кстати, в строке 125 для ваших входных данных
((max_t - t0) / h) 2 500 000 000.0000000 double
несколько превышает диапазон типа int. Т.е. цикл будет крутиться вечно.
0
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
31.01.2019, 02:31  [ТС] 11
L0M, не задумывалась над этим...

Добавлено через 25 секунд
L0M, так, у меня же нет типа int
0
L0M
884 / 453 / 231
Регистрация: 01.10.2018
Сообщений: 1,005
Завершенные тесты: 1
31.01.2019, 02:38 12
ElKros, см. строку 125. Переменная цикла типа int.
0
zss
Модератор
Эксперт С++
8600 / 7557 / 4677
Регистрация: 18.12.2011
Сообщений: 20,031
Завершенные тесты: 1
31.01.2019, 06:35 13
Смею предположить, что надо было написать
C++
1
 y0 +=  determinant(matr_inv[N][N],n) * h*dy0dt(y0, y1, y2, y3, t0);
0
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
31.01.2019, 07:14  [ТС] 14
zss, почему через детерминант ?
0
zss
Модератор
Эксперт С++
8600 / 7557 / 4677
Регистрация: 18.12.2011
Сообщений: 20,031
Завершенные тесты: 1
31.01.2019, 08:20 15
Так хоть что-то получится.
Судя по формуле в этом месте должно стоять умножение матрицы на вектор.
Но у Вас h - число
dy0dt - тоже число.

И получиться тоже должен вектор.

В целом, эта задача больше подходит для Matlab, а не для C++
0
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
31.01.2019, 09:07  [ТС] 16
zss, я хотела создать вектор для значений у0,у1,у2 у3.

Добавлено через 3 минуты
zss, делала вот так
C++
1
2
3
4
5
vector<function<double(double, double, double, double, double) >> vfunc;
vfunc.push_back(dy0dt);
vfunc.push_back(dy1dt);
vfunc.push_back(dy2dt); 
vfunc.push_back(dy3dt);
И почему-то ошибка
0
zss
Модератор
Эксперт С++
8600 / 7557 / 4677
Регистрация: 18.12.2011
Сообщений: 20,031
Завершенные тесты: 1
31.01.2019, 10:04 17
Это совсем не то, что надо.
Напишите функции матричной арифметики
(умножение матрицы на вектор, вектора на числоб сложение векторов и т.д.)

Примерно такие:
C++
1
2
3
void mul((double A[N][N],double v[N],double result[N]);
void mul(double v[N],double h,double result[N]);
void add(double v1[N],double v2[N],double result[N]);
Далее заведите массив y, ynew и массив f
Функция вычисления должна быть примерно такой
C++
1
2
3
4
5
6
7
8
9
void rosenbrock(double y[N], double t0, double max_t, double h, int n, double matr_inv[N][N],double f[N]) {
     double t = t0;
     double ynew[N];
     for (int i = 0; i < ((max_t - t0) / h); i++) {
     std::cout << t << "\t" << std::setprecision(5) << y[0] << "\t" << y[1] << "\t" << y[2] << "\t" << y[3] << std::endl;
     mul(matr_inv,f,ynew);
     mul(ynew,h,ynew);
     add(ynew,y,y);
}
А вместо dy0dt, dy1dt... напишите одну функцию формирующую вектор f
0
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
31.01.2019, 10:14  [ТС] 18
zss, это умножение матрицы на вектор, вектора на число и сложение ?

Добавлено через 20 секунд
zss, а есть библиотеки для этого ?
0
zss
Модератор
Эксперт С++
8600 / 7557 / 4677
Регистрация: 18.12.2011
Сообщений: 20,031
Завершенные тесты: 1
31.01.2019, 10:21 19
Да напишите сами. Ничего сложного.
0
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
31.01.2019, 10:23  [ТС] 20
zss, не совсем поняла про функцию формирующую вектор
0
31.01.2019, 10:23
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2019, 10:23

Программа вылетает
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; double f(double x){ return...

Вылетает программа
Почему программа вылетает после ввода размерностей:(Исправьте пожалуйста #include &lt;cstdlib&gt;...

Вылетает программа
Вот что пишет: вот код: /*С клавиатуры вводятся две строки, содержащие некоторые слова,...


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

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

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