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

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

31.01.2019, 00:17. Просмотров 858. Ответов 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
zss
Модератор
Эксперт С++
8594 / 7553 / 4674
Регистрация: 18.12.2011
Сообщений: 20,004
Завершенные тесты: 1
31.01.2019, 10:30 21
C++
1
2
3
4
5
6
7
void dydt(double y[N],double f[N], double t) 
{
    f[0]= 8.85e4 - y[2] * y[0]*(0.2 - y[0]) / (1. - y1))+ y[0] / 1e-8;
    f[1]=y[0] * y[2];
    f[2]=y[0] * y[3];
    f[3]=1e30*sqrt(y[0])*exp(-0.25) / y0;
}
Я что-то не увидел, где тут используется t
1
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
31.01.2019, 11:56  [ТС] 22
zss, в системе нет t, но в формуле оно есть. Как я поняла, то t - это точка на промежутке и увеличивается на каждой итерации на шаг

а получается, что и якобиан придется пересчитывать на каждой итерации вместе с обратной матрицей? или считаем один раз ?

zss, подскажите пожалуйста, так верно ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void mul_1(double matr[N][N], double v[N], double result[N]) {
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            result[i] += matr[i][j] * v[j];
        }
    }
}
 
void mul(double v[N], double h, double result[N]) {
    for (int i = 0; i < N; i++) {
            v[i] *= h;
            result[i] = v[i];
    }
}
 
void add(double v1[N], double v2[N], double result[N]) {
    for (int i = 0; i < N; i++) {
            v1[i] += v2[i];
            result[i] = v1[i];
    }
}
0
zss
Модератор
Эксперт С++
8594 / 7553 / 4674
Регистрация: 18.12.2011
Сообщений: 20,004
Завершенные тесты: 1
31.01.2019, 12:40 23
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void mul_1(double matr[N][N], double v[N], double result[N]) {
    for (int i = 0; i < N; ++i) {
        rsult[i]=0;
        for (int j = 0; j < N; ++j) {
            result[i] += matr[i][j] * v[j];
        }
    }
}
void mul(double v[N], double h, double result[N]) {
    for (int i = 0; i < N; i++) {
             result[i] = v[i]*h;
    }
}
void add(double v1[N], double v2[N], double result[N]) {
    for (int i = 0; i < N; i++) {
            result[i] = v1[i]+v2[i];
    }
}
1
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
31.01.2019, 13:38  [ТС] 24
zss, а как вызывать метод ? если у меня заданы y, beg_time, max_time, h, N. матрица inv посчитана. а что делать с f ?

rosenbrock(y, beg_time, max_time, h, N, inv, f);
0
31.01.2019, 13:38
zss
Модератор
Эксперт С++
8594 / 7553 / 4674
Регистрация: 18.12.2011
Сообщений: 20,004
Завершенные тесты: 1
31.01.2019, 14:01 25
Похоже f надо пересчитывать каждый раз
Поэтому
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void rosenbrock(double y[N], double t0, double max_t, double h, int n, double matr_inv[N][N]) {
     double t = t0;
     double ynew[N];
     double f[N];
     for t = t0; t <= max_t ;t+=h)
     {
       std::cout << t << "\t" << std::setprecision(5) << y[0] << "\t" << y[1] << "\t" << y[2] << "\t" << y[3] << std::endl;
       dydt(y,f, t);
       mul(matr_inv,f,ynew);
       mul(ynew,h,ynew);
       add(ynew,y,y);
     }
}
И зачем тут какое-то n непонятно.
1
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
31.01.2019, 14:38  [ТС] 26
zss, и как хранить все эти результаты, если в дальнейшем мне нужно ими воспользоваться для минимизации другой функции ?

Добавлено через 10 минут
zss, как пересчитывать на каждой итерации якобиан и обратную матрицу ?
0
zss
Модератор
Эксперт С++
8594 / 7553 / 4674
Регистрация: 18.12.2011
Сообщений: 20,004
Завершенные тесты: 1
31.01.2019, 16:29 27
Цитата Сообщение от ElKros Посмотреть сообщение
как хранить все эти результаты
Пишите в файл.
Цитата Сообщение от ElKros Посмотреть сообщение
как пересчитывать на каждой итерации якобиан и обратную матрицу
Вы же сами написали для этого соответствующие функции
0
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
01.02.2019, 00:38  [ТС] 28
zss, я не функции писала, в в main
Просто метод тоже в цикл заводить нужно будет или как лучше ? Если метод отдельной функцией

Добавлено через 3 минуты
zss, просто если запущу в цикл пересчет матрицы и в этот же цикл метод то, это будет неправильно. А если отдельно его вызову, то матрицы пепесчитывать будет, а в метод возьмется последняя

Добавлено через 8 часов 2 минуты
zss, подскажите пожалуйста, вот так будет верно ? или снова не то ? просто высчитывает только 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
60
61
62
63
64
65
66
67
68
69
70
71
void ros(double y[N], double t0, double max_t, double h) {
    double t = t0;
    double ynew[N];
    double f[N];
    double adj[N][N];  // To adjoint of A[][] 
    double inv[N][N]; // To store inverse of A[][] 
 
    for (t = t0; t <= max_t; t += h) {
        
        //единичная матрица
        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 * (y[2] * (y[0] - 0.1) - 50000000.0 * (y[1] - 1.0))) / (1.0 - y[1]), ((y[0] - 0.2)*y[0] * y[2]) / pow((1.0 - y[1]), 2.), ((y[0] - 0.2)*y[0]) / (1.0 - y[1]),  0.0 },
                            {y[2], 0.0, y[0], 0.0},
                            {y[3], 0.0, 0.0, y[0]},
                            {(5 * pow(10, 29.)*(exp(-0.75 / y[0]))*(1.5 + y[0])) / pow(y[0], 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];
            }
        }
 
        adjoint(temp, adj);
 
        if (inverse(temp, inv))
            PrintMatr(inv, N);
 
        std::cout << t << "\t" << std::setprecision(5) << y[0] << "\t" << y[1] << "\t" << y[2] << "\t" << y[3] << std::endl;
        dydt(y, f, t);
        mul_1(inv, f, ynew);
        mul_2(ynew, h, ynew);
        add(ynew, y, y);
    }
    std::cout << t << "\t" << std::setprecision(5) << y[0] << "\t" << y[1] << "\t" << y[2] << "\t" << y[3] << std::endl;
}
 
int main()
{
    double y[N], f[N];
    y[0] = 10e-10, y[1] = 0, y[2] = 0, y[3] = 0;
    double h = 1e-9;
    double beg_time = 0.0, max_time = 2.5;
 
    cout << "Ros method:\n";
    ros(y, beg_time, max_time, h);
 
    system("pause");
 
    return 0;
}
0
zss
Модератор
Эксперт С++
8594 / 7553 / 4674
Регистрация: 18.12.2011
Сообщений: 20,004
Завершенные тесты: 1
01.02.2019, 07:00 29
Цитата Сообщение от ElKros Посмотреть сообщение
double jac[N][N] = {...
Такое присвоение называется инициализацией и выполняется только при первом проходе цикла.
Надо каждый элемент присваивать явно, а не через список.
0
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
01.02.2019, 08:58  [ТС] 30
zss, т.е., можно задать как функцию для f ? jac[0]=... ? Но потом может не пройти умножение в методе
0
zss
Модератор
Эксперт С++
8594 / 7553 / 4674
Регистрация: 18.12.2011
Сообщений: 20,004
Завершенные тесты: 1
01.02.2019, 09:34 31
Конечно, лучше функцией вида
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SetJak(double y[N],double jac[N][N])
{
    jac[0][0]=(2. * (y[2] * (y[0] - 0.1) - 5.e7 * (y[1] - 1.0))) / (1.0 - y[1]);
    jac[0][1]=((y[0] - 0.2)*y[0] * y[2]) / pow((1.0 - y[1]), 2.);
    jak[0][2]= ((y[0] - 0.2)*y[0]) / (1.0 - y[1]);
    jak[0][3]=0.;
    jak[1][0]=y[2];
    jak[1][1]=0.;
    jak[1][2]=y[0];
    jak[1][3]=0.;
    jak[2][0]=y[3];
    jak[2][1]=0.;
    jak[2][2]=0.;
    jak[2][3]=y[0];
 
    jak[3][0]=5.e29*(exp(-0.75 / y[0]))*(1.5 + y[0])) / pow(y[0], 3. / 2.);
    jak[3][1]=0.;
    jak[3][2]=0.;
    jak[3][3]=0.;
 }
0
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
01.02.2019, 09:55  [ТС] 32
zss, а цикл для нахождения решения системы я правильно записала ? У меня t всегда 0
0
zss
Модератор
Эксперт С++
8594 / 7553 / 4674
Регистрация: 18.12.2011
Сообщений: 20,004
Завершенные тесты: 1
01.02.2019, 12:12 33
Цитата Сообщение от ElKros Посмотреть сообщение
У меня t всегда 0
Цитата Сообщение от ElKros Посмотреть сообщение
for (t = t0; t <= max_t; t += h) {
t Меняется с шагом h.

Для отладки программы советую задать какие-то более простые условия,
для которых решение известно, и сравнить с тем, что получится.

Меня как-то настораживают коэффициенты типа 5.e29
Похоже, Вы где-то неправильно смасштабировали данные.
0
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
01.02.2019, 12:21  [ТС] 34
zss, производную взяла от системы для получения якобиана. Могла и ошибиться, но проверяла и получалось одинаково.
А так, на каждом шаге уже пересчитывается каждая матрица и новые значения выводит, но только 3 значения всего лишь ..
0
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
03.02.2019, 19:37  [ТС] 35
zss, почему-то вычисляет бесконечное количество раз...
0
zss
Модератор
Эксперт С++
8594 / 7553 / 4674
Регистрация: 18.12.2011
Сообщений: 20,004
Завершенные тесты: 1
04.02.2019, 08:48 36
так проверьте в отладчике значения
t0,max_t,h
Как пользоваться отладчиком (в Visual Studio)
0
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
04.02.2019, 08:53  [ТС] 37
zss, они такие, какими их задавала
0
zss
Модератор
Эксперт С++
8594 / 7553 / 4674
Регистрация: 18.12.2011
Сообщений: 20,004
Завершенные тесты: 1
04.02.2019, 09:23 38
Задайте t0=0,h=1,max_t=2
и проверьте что они не меняются в цикле, а цикл выполняется не более 3 раз.
0
ElKros
2 / 2 / 1
Регистрация: 14.02.2018
Сообщений: 472
04.02.2019, 12:15  [ТС] 39
zss, 3 раза вывело
0
zss
Модератор
Эксперт С++
8594 / 7553 / 4674
Регистрация: 18.12.2011
Сообщений: 20,004
Завершенные тесты: 1
04.02.2019, 12:38 40
Ну так почему же тогда бесконечное?
0
04.02.2019, 12:38
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2019, 12:38

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

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

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


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

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

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