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

Метод Конечных Разностей для уравнения в частных производных - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
illuminates
1 / 1 / 0
Регистрация: 14.06.2012
Сообщений: 98
10.11.2013, 08:46     Метод Конечных Разностей для уравнения в частных производных #1
Здравствуйте, требуется ваша помощь в нахождении ошибки в программе. Вычисляю по явной схеме. Выдает какие-то очень большие числа.

Задача такая:
http://www.cyberforum.ru/cgi-bin/latex.cgi?U_t=3(1,1-0,5x)U_{xx}+e^t-1
http://www.cyberforum.ru/cgi-bin/latex.cgi? U(0,t)=0
http://www.cyberforum.ru/cgi-bin/latex.cgi? U(1,t)=0
http://www.cyberforum.ru/cgi-bin/latex.cgi?U(x,0)=0.01(1-x)x

Решение нужно найти с точностью http://www.cyberforum.ru/cgi-bin/latex.cgi?0.0001 на отрезке http://www.cyberforum.ru/cgi-bin/latex.cgi?T=1/a^*, где a^*=\max a(x,t)
Построить графики функций http://www.cyberforum.ru/cgi-bin/latex.cgi?u(x^*,t), u(x,jt^*) где http://www.cyberforum.ru/cgi-bin/latex.cgi?x^*=0.6, t^*=T/10, j=1,2,4

явная разностная схема такая:
(http://www.cyberforum.ru/cgi-bin/latex.cgi?$u_t^{j+1}-u_i^j)/\tau=3(1,1-0,5x_i)(u_{i+1}^{j}-2u_i^j+u_{i-1}^j)/h^2+e^{t_j}+1

код программы:
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
int main ( void )
{
    setlocale(LC_ALL, "rus");
 
    int I = 10, J = 30, i, j;
    double  T = 1.0/ pow(3.3, 0.5), h_x = 1.0/ I, h_t = T/ J, epsilon = h_t + pow(h_x, 2), c;
    double **u = new double *[I + 1];
    for (i = 0; i <= I; i++) u[i] = new double [J + 1]; 
 
    cout<< "Схема может быть неустойчива  при значениях Х :\n";
    for (i = 0; i <= I; i++)
    {
        c = 3 * (1.1 - 0.5 * h_x * i) * h_t * pow(h_x, -2);
        if (c < 0.5) cout << i * h_x << "   ";
    }
    cout <<"\n";
    
    //нулевой слой (j = 0)
    for (i = 0; i <= I; i++)
    {
        u [i][0] = 0.01 * (1 - i * h_x) * i * h_x;
        //u [i][0] = 1 - i * h_x;  //НУ, несоответствие ГУ и НУ!
    }
        //последующие слои
    for (j = 0; j <= J; j++)
    {
        for (i = 1; i < I; i++) //расчёт j + 1 - го слоя по j-му
        {
            u [0][j + 1] = 0; //ГУ u [0][j + 1] = 1;
            u [I][j + 1] = 0; //ГУ
            u [i][j + 1] = u [i][j] + h_t * (3 * (1.1 - 0.5 * h_x * i) * (u [i + 1][j] -2 * u [i][j] + u [i - 1][j])/ pow(h_x, 2) + exp(h_t * j) - 1);
        }
    }
    int Jv = J/10;
 
    ofstream out;
    out.open ("D:\\proga7.txt");
 
    out << "U = U(0.6, t):\n";
    cout << "U = U(0.6, t):\n";
    for (i = 0; i <= J; i++)
    {
        out << h_t * i <<"\t"<< u [6][i] <<"\n";
        cout << h_t * i <<"\t"<< u [6][i] <<"\n";
    }
    out << "\n U = U(x, 0.33):\n";
    cout << "\n U = U(x, 0.33):\n";
    for (i = 0; i <= I; i++)
    {
        out << h_x * i <<"\t"<< u [i][Jv] <<"\n";
        cout << h_x * i <<"\t"<< u [i][Jv] <<"\n";
    }
    out << "\n U = U(x, 0.66):\n";
    cout << "\n U = U(x, 0.66):\n";
    for (i = 0; i <= I; i++)
    {
        out << h_x * i <<"\t"<< u [i][Jv * 2] <<"\n";
        cout << h_x * i <<"\t"<< u [i][Jv * 2] <<"\n";
    }
    out << "\n U = U(x, 1.32):\n";
    cout << "\n U = U(x, 1.32):\n";
    for (i = 0; i <= I; i++)
    {
        out << h_x * i <<"\t"<< u [i][Jv * 4] <<"\n";
        cout << h_x * i <<"\t"<< u [i][Jv * 4] <<"\n";
    }
    out.close();
    getch();
    return 0;
}
выводит следующее:


Добавлено через 23 минуты
вместо трех знаков вопроса, должно стоять слово "где"

Добавлено через 13 часов 23 минуты
Добавил также выгрузку динамического массива:
for (i=0; i<I;i++)
{
delete [] u[i];
}
delete [] u;
ругается:
ОС Windows инициировала точку останова в proga7Метод конечных разностей.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в proga7Метод конечных разностей.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит proga7Метод конечных разностей.exe

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2013, 08:46     Метод Конечных Разностей для уравнения в частных производных
Посмотрите здесь:

Метод конечных элементов C++
Метод Ньютона и итераций для нелинейного уравнения C++
C++ метод итераций для уравнения
C++ Метод итераций для развязывания нелинейного уравнения
C++ Нахождение конечных разностей в с++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Крюгер
 Аватар для Крюгер
0 / 60 / 3
Регистрация: 16.11.2012
Сообщений: 409
Записей в блоге: 3
10.11.2013, 09:30     Метод Конечных Разностей для уравнения в частных производных #2

Не по теме:

а можно скрин лога, где ругается?



Добавлено через 2 минуты
и да выгрузка по моему не правильная (так нельзя делать)
можно так
C++
1
2
3
4
5
for (i=0; i<I;i++)
{
u[i]=0;
}
delete [] u; //по сути проще сразу это вызвать
Добавлено через 1 минуту
C++
1
delete [] u[i]
это так странно выглядит... ты уже удаляешь массив, и приплетаешь индексы зачем то
illuminates
1 / 1 / 0
Регистрация: 14.06.2012
Сообщений: 98
10.11.2013, 13:12  [ТС]     Метод Конечных Разностей для уравнения в частных производных #3
Крюгер,
спасибо помогло.

Можно ли Вас попросить помочь?, а то сам не могу найти свою ошибку.
Крюгер
 Аватар для Крюгер
0 / 60 / 3
Регистрация: 16.11.2012
Сообщений: 409
Записей в блоге: 3
10.11.2013, 13:16     Метод Конечных Разностей для уравнения в частных производных #4
illuminates, которая там еще ошибка? выложи лог
illuminates
1 / 1 / 0
Регистрация: 14.06.2012
Сообщений: 98
10.11.2013, 14:16  [ТС]     Метод Конечных Разностей для уравнения в частных производных #5
Крюгер, нет нет, ошибок больше нет. но числа в ответе очень большие и маленькие выдаются, чего не должно быть
Крюгер
 Аватар для Крюгер
0 / 60 / 3
Регистрация: 16.11.2012
Сообщений: 409
Записей в блоге: 3
10.11.2013, 14:37     Метод Конечных Разностей для уравнения в частных производных #6
illuminates, напиши словами свой алгоритм, как ты считаешь , вернее как нужно посчитать, и ошибка сама всплывет, ну или я найду
illuminates
1 / 1 / 0
Регистрация: 14.06.2012
Сообщений: 98
11.11.2013, 15:49  [ТС]     Метод Конечных Разностей для уравнения в частных производных #7
Крюгер, Всё разобрался, спасибо большое за помощь!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2015, 20:47     Метод Конечных Разностей для уравнения в частных производных
Еще ссылки по теме:

C++ Метод конечных разностей для краевой задачи
C++ метод конечных элементов на си++
C++ Метод конечных автоматов для списка слов

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

Или воспользуйтесь поиском по форуму:
Proska
0 / 0 / 0
Регистрация: 13.09.2013
Сообщений: 6
29.10.2015, 20:47     Метод Конечных Разностей для уравнения в частных производных #8
illuminates, а программы рабочей не осталось? Тоже вот разбираюсь с методом, было бы здорово если она у тебя сохранилась, а то уже два года прошло...)
Yandex
Объявления
29.10.2015, 20:47     Метод Конечных Разностей для уравнения в частных производных
Ответ Создать тему
Опции темы

Текущее время: 04:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru