Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
illuminates
3 / 3 / 0
Регистрация: 14.06.2012
Сообщений: 109
#1

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

10.11.2013, 08:46. Просмотров 2787. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Метод Конечных Разностей для уравнения в частных производных (C++):

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

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

Итерационное вычисление частных производных - C++
доброго времени суток в задачах по численным методам столкнулся с необходимостью вычисления частных производных сами вычисления &quot;в...

Используя таблицу конечных разностей, определить значение 1 и 2-ой производной - C++
1. Используя таблицу конечных разностей, определить значение 1 и 2-ой производной в точках Х=Х0, Х=Х0+0,5h, X=X10-0,5h, X=X10, используя...

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

Метод конечных автоматов для списка слов - C++
Дан список слов X1, X2, …, Xk и строка Y длины n. Определить, входит ли одно из слов Xi в строку Y как подстрока за время C∙n (где C –...

7
Крюгер
0 / 60 / 3
Регистрация: 16.11.2012
Сообщений: 433
Записей в блоге: 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
Крюгер
0 / 60 / 3
Регистрация: 16.11.2012
Сообщений: 433
Записей в блоге: 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
Крюгер
0 / 60 / 3
Регистрация: 16.11.2012
Сообщений: 433
Записей в блоге: 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
Привет! Вот еще темы с ответами:

Метод конечных элементов - C++
Помогите с алгоритмами по программированию МКЭ. С математическими основами метода я разобрался, но не могу понять с чего начать...

метод конечных элементов на си++ - C++
Всем привет!нужно написатьт прогу для решения одномерной задачи методом конечных элементов. в чем ошибка? int _tmain(){ setlocale (...

Метод конечных элементов - ищу баг - C++
Всем привет, конкретно застрял на вычислении матрицы жесткости (пока для одного элемента) из этой статьи...

Метод итераций для уравнения - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; double e=2.7; double q=0; int gr1=-100, gr2=0; double al; double f...


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

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

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