2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему
 
 Нелинейное ур-е теплопроводности, неявная схема - реализация
Сообщение23.12.2016, 00:04 


28/02/15
52
Требуется написать программу, численно решающую неявное уравнение теплопроводности неявной схемой.
Методичка гласит, что
Цитата:
Неявную схему рассчитываем итерациями. Простые итерации сходятся медленно, запас устойчивости для их сходимости невелик, поэтому чаще всего используется итерационная процедура Ньютона.
Суть этой процедуры:
Присваиваем неизвестной величине $T^{n+1}$ индекс итерации $k$.
Нелинейное относительно неизвестных $T^{n+1}$ слагаемые в правой части
уравнения:
$$h_j\frac{T^{n+1}_j-T^n_j}{\tau}=\sigma\left[\frac{T^{n+1}_{j+1}-T^{n+1}_j}{h_{j+\frac{1}{2}}}\kappa^{n+1}_{j+\frac{1}{2}}-\frac{T^{n+1}_j-T^{n+1}_{j-1}}{h}\kappa^{n+1}_{j-\frac{1}{2}}\right]$$
раскладываем в ряд по малому параметру:
$$\Delta T_j \equiv T^{n+1,k+1}_j-T^{n+1,k}_j,$$
$$f(T^{n+1,k+1})=f(T^{n+1,k})+(\frac{\partial{f}}{\partial{T}})_{n+1,k}\Delta{T}+...$$
Ограничимся линейными членами разложения. Имеем:
$$\begin{gathered}h\frac{T^{n+1}_j+\Delta{T}-T^n_j}{\tau}=\sigma\left[\frac{T^{n+1,k}_{j+1}-T^{n+1,k}_j}{h}\kappa^{n+1,k}_{j+\frac{1}{2}}-\frac{T^{n+1,k}_j-T^{n+1,k}_{j-1}}{h}\kappa^{n+1,k}_{j-\frac{1}{2}}\right]+\\
+\frac{\sigma\Delta{T}_{j+1}}{h_{j+\frac{1}{2}}}\left[\kappa^{n+1,k}_{j+\frac{1}{2}}+(\frac{1}{2}\frac{\partial{f}}{\partial{T}})^{n+1,k}_{j+\frac{1}{2}}(T^{n+1,k}_{j+1}-T^{n+1,k}_j)\right]+\\
+\frac{\sigma\Delta{T}_{j}}{h_{j+\frac{1}{2}}}\left[-\kappa^{n+1,k}_{j+\frac{1}{2}}+(\frac{1}{2}\frac{\partial{f}}{\partial{T}})^{n+1,k}_{j+\frac{1}{2}}(T^{n+1,k}_{j+1}-T^{n+1,k}_j)\right]-\\
-\frac{\sigma\Delta{T}_{j}}{h_{j-\frac{1}{2}}}\left[\kappa^{n+1,k}_{j-\frac{1}{2}}+(\frac{1}{2}\frac{\partial{f}}{\partial{T}})^{n+1,k}_{j-\frac{1}{2}}(T^{n+1,k}_{j}-T^{n+1,k}_{j-1})\right]+\\
+\frac{\sigma\Delta{T}_{j-1}}{h_{j-\frac{1}{2}}}\left[-\kappa^{n+1,k}_{j-\frac{1}{2}}+(\frac{1}{2}\frac{\partial{f}}{\partial{T}})^{n+1,k}_{j-\frac{1}{2}}(T^{n+1,k}_{j}-T^{n+1,k}_{j-1})\right]\end{gathered}$$
Система трехдиагональна относительно неизвестных $\Delta T_j$ и вычисляется методом прогонки. В качестве $T^{n+1, 0}$ обычно используют $T^n$. Для получения
хорошей точности (4-6 знаков) достаточно 3-5 итераций.

Соотвественно, для этой задачи я переписал уравнение относительно $\Delta T$, составил формулу для вычисления прогоночных коэффициентов и написал программу, которая должна всё это вычислять:
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
void Plot::setImplicit()
{
    double *A = new double [N], *B = new double [N],
            *dT = new double [N+1];
    for (int k=0; k<5; k++)
    {
        double *T;
        if (k==0) T = Tb;
        else T = Td;
        A[0]=0;
        B[0]=0;
        for (int j=1; j<N; j++)
        {
            //qDebug()<<T[j];
            double k1 = pow((T[j-1]+T[j])*0.5,25);
            double k2 = pow((T[j]+T[j+1])*0.5,25);
            double dk1 = 25*pow((T[j-1]+T[j])*0.5,24);
            double dk2 = 25*pow((T[j]+T[j+1])*0.5,24);
            //if (k==0) qDebug()<<k1<<" "<<k2;
            A[j] = (-1/h*(k2+0.5*dk2*(T[j+1]-T[j])))/
                    (1/h*(-k1*(A[j-1]+1)+0.5*dk1*(A[j-1]-1)*(T[j]-T[j-1])-k2+0.5*dk2*(T[j+1]-T[j]))-h/tau);
            B[j] = ((h/tau*(T[j]-Tb[j])-k2/h*(T[j+1]-T[j])+k1/h*(T[j]-T[j-1]))-1/h*(-k1+0.5*dk1*(T[j]-T[j-1]))*B[j-1])/
                    (1/h*(-k1*(A[j-1]+1)+0.5*dk1*(A[j-1]-1)*(T[j]-T[j-1])-k2+0.5*dk2*(T[j+1]-T[j]))-h/tau);
            qDebug()<<A[j]<<" "<<B[j];
        }
        dT[N]=B[N-1]/(1-A[N-1]);
        Td[N]=T[N]+dT[N];
        for (int j=N-1; j>=0; j--)
        {
            dT[j]=A[j]*dT[j+1]+B[j];
            Td[j]=T[j]+dT[j];
            //qDebug()<<dT[j]<<" "<<T[j]<<" "<<Td[j];
        }
    }
    for (int j=0; j<=N; j++)
    {
        //qDebug()<<Td[j];
        Tb[j]=Td[j];
    }
}
 

Результаты, мягко говоря, неадекватные. Где у меня ошибка?

 Профиль  
                  
 
 Re: Нелинейное ур-е теплопроводности, неявная схема - реализация
Сообщение23.12.2016, 00:28 
Заслуженный участник


09/05/12
25179
byulent в сообщении #1179327 писал(а):
double k1 = pow((T[j-1]+T[j])*0.5,25);
и последующее в том же духе...

Вы всерьез считаете, что $T^n_j$ - это $T_j$ в степени $n$? Откуда там такие бешеные степени?

 Профиль  
                  
 
 Re: Нелинейное ур-е теплопроводности, неявная схема - реализация
Сообщение23.12.2016, 00:33 


28/02/15
52
Pphantom в сообщении #1179336 писал(а):
Вы всерьез считаете, что $T^n_j$ - это $T_j$ в степени $n$?

Нет, а с чего вы взяли?
Используется синтаксис C++
double *T;
        if (k==0) T = Tb;
        else T = Td;

Это значит, что на 0-й итерации у меня берутся значения на предыдущем временном шаге ($T^{n+1,0}=T^n$), а на остальных итерациях - на недосчитанном текущем.
Pphantom в сообщении #1179336 писал(а):
Откуда там такие бешеные степени?

Из задания. Явная схема с этим вполне себе работала.

 Профиль  
                  
 
 Re: Нелинейное ур-е теплопроводности, неявная схема - реализация
Сообщение23.12.2016, 00:38 
Заслуженный участник


09/05/12
25179
byulent в сообщении #1179338 писал(а):
Из задания. Явная схема с этим вполне себе работала.
А где они в задании?

 Профиль  
                  
 
 Re: Нелинейное ур-е теплопроводности, неявная схема - реализация
Сообщение23.12.2016, 00:42 


28/02/15
52
Pphantom в сообщении #1179339 писал(а):
А где они в задании?

Ну, собственно, вот задание: $\kappa^n_j = \kappa_0 (T^n_j)^{25}, \kappa_0=1$.

 Профиль  
                  
 
 Re: Нелинейное ур-е теплопроводности, неявная схема - реализация
Сообщение23.12.2016, 01:12 
Заслуженный участник


09/05/12
25179
Да уж, "вовремя" Вы признались... :mrgreen: Ну что ж, тогда возражение выше действительно снимается, но задача становится довольно веселенькой. Обычно в таких случаях используют не просто прогонку, но ее модификацию - т.н. метод потоковой прогонки. У Вас то вроде бы не так. Почему?

 Профиль  
                  
 
 Re: Нелинейное ур-е теплопроводности, неявная схема - реализация
Сообщение23.12.2016, 11:02 


28/02/15
52
Pphantom в сообщении #1179343 писал(а):
Обычно в таких случаях используют не просто прогонку, но ее модификацию - т.н. метод потоковой прогонки. У Вас то вроде бы не так. Почему?

"Я и словей-то таких не знаю!" (с). :-)
Ну, если в методичке написано, что эта задача может решаться обычной прогонкой, значит, она может ей решаться.
Вы считаете, тут проблема именно в степени?

 Профиль  
                  
 
 Re: Нелинейное ур-е теплопроводности, неявная схема - реализация
Сообщение23.12.2016, 11:56 
Заслуженный участник


09/05/12
25179
byulent в сообщении #1179397 писал(а):

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

 Профиль  
                  
 
 Re: Нелинейное ур-е теплопроводности, неявная схема - реализация
Сообщение23.12.2016, 17:24 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Ничего себе степень! Это ядерная реакция в центре звезды?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: seraphimt


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group