Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/16: Рейтинг темы: голосов - 16, средняя оценка - 4.63
illuminates
3 / 3 / 0
Регистрация: 14.06.2012
Сообщений: 109
1

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

10.11.2013, 08:46. Просмотров 2977. Ответов 7
Метки нет (Все метки)

Здравствуйте, требуется ваша помощь в нахождении ошибки в программе. Вычисляю по явной схеме. Выдает какие-то очень большие числа.

Задача такая:
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

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

Метод конечных разностей для решения дифференциального уравнения
Используя метод конечных разностей, решить краевую задачу для дифференциального...

Метод конечных разностей для краевой задачи
Помогите пожалуйста. Надо написать программу, которая решает краевую задачу для...

Решение краевой задачи для линейного дифференциального уравнения второго порядка методом конечных разностей
Помогите составить программу в С++: Используя метод конечных разностей, найти...

Нахождение конечных разностей в с++
Очень нужна помощь, недавно начала осваивать с++, нужно написать программу,...

Итерационное вычисление частных производных
доброго времени суток в задачах по численным методам столкнулся с...

7
Крюгер
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 437
Записей в блоге: 9
Завершенные тесты: 1
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]
это так странно выглядит... ты уже удаляешь массив, и приплетаешь индексы зачем то
0
illuminates
3 / 3 / 0
Регистрация: 14.06.2012
Сообщений: 109
10.11.2013, 13:12  [ТС] 3
Крюгер,
спасибо помогло.

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

Используя таблицу конечных разностей, определить значение 1 и 2-ой производной
1. Используя таблицу конечных разностей, определить значение 1 и 2-ой...

Ищу источники информации по численному решению ДУ в частных производных
Знает ли кто-нибудь хорошую книгу или сайт по численному решению ДУЧП? ...

Метод конечных автоматов для списка слов
Дан список слов X1, X2, …, Xk и строка Y длины n. Определить, входит ли одно из...


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

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

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