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

Конечно-разностный метод (уравнение теплопроводности) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.76
Victory_Valery
7 / 1 / 1
Регистрация: 24.12.2012
Сообщений: 13
14.11.2013, 02:17     Конечно-разностный метод (уравнение теплопроводности) #1
Добрый день! Задача распространения тепла в стержне описывается уравнением теплопроводности
ut= a2uxx+f(x,t)
дополняется краевыми условиями первого рода: на концах стержня поддерживается заданный температурный режим:
u(0, t) = mu_1(t), u(l, t) = mu_2(t) (2)
Задано начальное распределение температуры в стержне
u(x, 0) = phi(x);
В уравнении (1):
u(x,t) - температура, х - координата, t - время, a2 - коэффициент теплопроводности, f(x,t) - внутренние тепловые источники.
Подобрав шаг по времени tau, вычислить решение задачи вплоть до заданного конечного значения времени t=T. Решение находить в точках стержня c заданным шагом h.
СХЕМА ЯВНАЯ.

Вот листинг программы и заодно мои попытки что-то переработать... Выдает столб нулей и не пишет в файл, не могу понять почему.. (в выходном файле должна быть матрица со значением температуры в каждой точке шаблона(сетки))
Может быть кто-то сможет подправить?
L=6
a2=4
phi(x)=x2(x-6)ex
mu_1(t) = 5
mu_2(t) = 47
h = 0.25
T = 3
f(x,t) = 2
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main(void);
float f (float x, float t);
float mu_1 (float t);
float mu_2 (float t);
float phi (float x);
 // – //
 int main(void)
{
    clrscr();
    FILE *myfile;
    FILE *plotter;
    float a[120] [120];
    float b[120] [120];
    float u[120] [120];
    float T = 3;
    float l =6;
    float h = 0.25;
    float tau = 0.01;
    int n, i, j, k;
    float s = pow (h, 2) / tau;
    n = ceil (l / h);
    for (i = 0; i <= 119; i++){
        for (j = 1; j <= 119; j++){
            u[i] [j] = 0;
            a[i] [j] = 0;
            b[i] [j] = 0;
        }
    }
    for (i = 0; i <= n; i++){
        u[i] [0] = phi (i * h);
    }
    for (j = 0; j <= floor (T /tau); j++){
        u[0] [j] = mu_1 (tau * j);
        u[n] [j] = mu_2 (tau * j);
    }
    for (j = 0; j <= floor (T / tau); j++){
        a[1] [j + 1] = 1 / (2 + s);
    for (i = 2; i <= n - 1; i++){
        a[i] [j + 1] = 1 / (2 + s - a [i - 1] [j + 1]);
    }
    b[1] [j + 1] = mu_1 ((j + 1) * tau) + s * u[1] [j] + pow (h, 2) * f (h, (j + 1) * tau);
    for (i = 2; i <= n - 1; i++){
        b[i] [j + 1] = a [i - 1] [j + 1] + s * u[i] [j] + pow (h, 2) * f (i * h, (j + 1) * tau);
    }
    u[n] [j + 1] = mu_2 ((j + 1) * tau);
    for (k = 1; k <= n - 1; k++){
        u [n - k] [j + 1] = a [n - k] [j + 1] * (b [n - k] [j + 1] + u [n - k + 1] [j + 1]);
    }
    }
 
    for (j = 0; j <= floor (T / tau); j++){
        for (i = 0; i <= n; i++){
            printf ("%.2f", u[i] [j]);
            fprintf (myfile, "u(%g) (%g)=%g; \n", i * h, j * tau, u[i] [j]);
            if (i < n && j < floor (T / tau)){
                fprintf (plotter, "[[%g, %g, %g], [%g, %g, %g], [%g, %g, %g], [%g, %g, %g]]", i * h, j * tau, u[i] [j], (i + 1) * h, j * tau, u [i + 1] [j], i * h, (j + 1) * tau, u[i] [j + 1], (i + 1) * h, (j + 1) * tau, u [i + 1] [j + 1]);
                if (i >= n - 1 && j >= floor (T / tau) - 1){
            }
            else{
            fprintf (plotter,",");
            }
            }
        }
        printf ("\n");
    }
    fclose(myfile);
    fclose(plotter);
    printf ("\n Ось x расположена горизонтально; ось t расположена вертикально и направлена вниз");
    printf ("Шаг по оси x равен % g; шаг по оси t равен % g.\n", h, tau);
    printf ("\nДля выхода нажмите ENTER…");
    while (getch()!= 13);
    return(0);
}
 // – //
float f (float x, float t)
{
return 2;
}
 // – //
float mu_1 (float t)
{
return 5;
}
 // – //
float mu_2 (float t)
{
return 47;
}
 // – //
float phi (float x)
{
return x^2*(x-6)*exp(x);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2013, 02:17     Конечно-разностный метод (уравнение теплопроводности)
Посмотрите здесь:

двумерное уравнение теплопроводности C++
Нелинейное уравнение теплопроводности C++
Уравнение метод ньютона? C++
Решение уравнение теплопроводности C++
C++ уравнение теплопроводности
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ПерС
366 / 282 / 84
Регистрация: 05.11.2013
Сообщений: 806
Записей в блоге: 5
Завершенные тесты: 1
14.11.2013, 07:59     Конечно-разностный метод (уравнение теплопроводности) #2
Может, я чего-то не понимаю, но ты файл-то открывал? fopen?
Victory_Valery
7 / 1 / 1
Регистрация: 24.12.2012
Сообщений: 13
14.11.2013, 12:37  [ТС]     Конечно-разностный метод (уравнение теплопроводности) #3
В условиях была ошибка. Заменила на
u(x,0)=(1.1x2 + 2.1)e-x
u(0,t)=2.1+t
u(1,t)=3.2(t+e-1)
T = 0.05;
l =1;
f(x,t)=xt;
a2=4;
h = 0.1;
tau = 0.01;
но, правда, это не принесло результата
и функция clrscr(); почему-то начала говорить, что она не определена

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
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main(void);
float f (float x, float t);
float mu_1 (float t);
float mu_2 (float t);
float phi (float x);
 // – //
 int main(void)
{
    clrscr();
    FILE *myfile;
    FILE *plotter;
    float a[120] [120];
    float b[120] [120];
    float u[120] [120];
    float T = 0.05;
    float l =1
    float h = 0.1;
    float tau = 0.01;
    int n, i, j, k;
    float s = pow (h, 2) / tau;
    n = ceil (l / h);
    for (i = 0; i <= 119; i++){
        for (j = 1; j <= 119; j++){
            u[i] [j] = 0;
            a[i] [j] = 0;
            b[i] [j] = 0;
        }
    }
    for (i = 0; i <= n; i++){
        u[i] [0] = phi (i * h);
    }
    for (j = 0; j <= floor (T /tau); j++){
        u[0] [j] = mu_1 (tau * j);
        u[n] [j] = mu_2 (tau * j);
    }
    for (j = 0; j <= floor (T / tau); j++){
        a[1] [j + 1] = 1 / (2 + s);
    for (i = 2; i <= n - 1; i++){
        a[i] [j + 1] = 1 / (2 + s - a [i - 1] [j + 1]);
    }
    b[1] [j + 1] = mu_1 ((j + 1) * tau) + s * u[1] [j] + pow (h, 2) * f (h, (j + 1) * tau);
    for (i = 2; i <= n - 1; i++){
        b[i] [j + 1] = a [i - 1] [j + 1] + s * u[i] [j] + pow (h, 2) * f (i * h, (j + 1) * tau);
    }
    u[n] [j + 1] = mu_2 ((j + 1) * tau);
    for (k = 1; k <= n - 1; k++){
        u [n - k] [j + 1] = a [n - k] [j + 1] * (b [n - k] [j + 1] + u [n - k + 1] [j + 1]);
    }
    }
 
    for (j = 0; j <= floor (T / tau); j++){
        for (i = 0; i <= n; i++){
            printf ("%.2f", u[i] [j]);
            fprintf (myfile, "u(%g) (%g)=%g; \n", i * h, j * tau, u[i] [j]);
            if (i < n && j < floor (T / tau)){
                fprintf (plotter, "[[%g, %g, %g], [%g, %g, %g], [%g, %g, %g], [%g, %g, %g]]", i * h, j * tau, u[i] [j], (i + 1) * h, j * tau, u [i + 1] [j], i * h, (j + 1) * tau, u[i] [j + 1], (i + 1) * h, (j + 1) * tau, u [i + 1] [j + 1]);
                if (i >= n - 1 && j >= floor (T / tau) - 1){
            }
            else{
            fprintf (plotter,",");
            }
            }
        }
        printf ("\n");
    }
    fclose(myfile);
    fclose(plotter);
    printf ("\n Ось x расположена горизонтально; ось t расположена вертикально и направлена вниз");
    printf ("Шаг по оси x равен % g; шаг по оси t равен % g.\n", h, tau);
    printf ("\nДля выхода нажмите ENTER…");
    while (getch()!= 13);
    return(0);
}
 // – //
float f (float x, float t)
{
return x * t;
}
 // – //
float mu_1 (float t)
{
return 2.1 + t;
}
 // – //
float mu_2 (float t)
{
return 3.2*(1 + 1/2.71828);
}
 // – //
float phi (float x)
{
return exp(-x)*(1.1 * pow(x,2) + 2.1);
ПерС
366 / 282 / 84
Регистрация: 05.11.2013
Сообщений: 806
Записей в блоге: 5
Завершенные тесты: 1
14.11.2013, 14:54     Конечно-разностный метод (уравнение теплопроводности) #4
c clrscr() проблем не вижу, разве что нет точки с запятой в конце строки 19 и } в конце

у меня благополучно откомпилилось, очистило экран и зависло

так что отладчик в помощь
Yandex
Объявления
14.11.2013, 14:54     Конечно-разностный метод (уравнение теплопроводности)
Ответ Создать тему
Опции темы

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