Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мат физика Реферат.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
349.7 Кб
Скачать

4 Решение задачи спектральным методом

Для начала рассмотрим простую одномерную задачу распространения тепла в стержне. Уравнение, описывающее распространение тепла при некотором начальном распределении температуры по стержню: Такое уравнение решается аналитически методом разделения переменных, но нас интересует как это можно сделать численно. Прежде всего нужно определиться, как считать вторую пространственную производную по х. Проще всего это делается каким-нибудь разностным методом, например: Но мы поступим иначе. Распределение температуры есть функция координаты и времени, и в каждый момент времени эта функция может быть представлена в виде суммы ряда Фурье, который в численном виде обрезается на n-ом члене: Где u^«с крышечкой» — это коэффициенты разложения ряда Фурье. Подставим выражение для ряда в уравнение переноса тепла: Получаем уравнение для коэффициентов Фурье, в котором отсутствует производная по координате! Теперь это обыкновенное дифференциальное уравнение, а не в частных производных, которое можно решить простым разностным методом. Уже легче, теперь остается найти коэффициенты разложения и в этом нам очень поможет быстрое преобразование Фурье (дальше FFT).

Логика здесь следующая:

  1. в начальный момент времени дана функция координаты, описывающая распределение температуры по стержню;

2) разбиваем стержень на сетку из n точек;

3) находим комплексные коэффициенты Фурье с помощью алгоритма FFT, обозначим операцию как F(u);

4) умножаем полученные коэффиценты на -|k|2, получаем Фурье-образ второй производной. Аналогично можно получить Фурье-образ производной более высоких порядков p, достаточно умножить на (ik)p;

5) делаем обратное преобразование Фурье F-1(u), с помощью алгоритма IFFT, получаем значения второй производной в точках на сетке;

6) делаем шаг по времени, уже обычной разностной, явной или неявной, схемой; 7) повторяем.

Рассмотрим теперь как это работает в программе для Matlab/Octave. В качестве начального распределения температуры возьмем гладкую функцию u0=2+sin(x)+sin(2x), стержень длинной 2π разобьем на 50 точек, с шагом по времени h=0.1, граничные условия периодичные (кольцо). 

Код для одномерного уравнения переноса тепла

clear all;

n = 50; % number of points

dx = 2*pi/n; % space step

x = 0:dx:2*pi-dx; % grid

h = 0.1; % temporal step

times = 10; % number of iterations in time

k = fftshift(-n/2:1:n/2-1); % wave numbers

k2 = k.*k;

u0 = 2 + sin(x) + sin(2*x); % initial conditions

u = zeros(times,n); % stores results

u(1,:) = u0;

uf = fft(u0); % Fourier coefficients of initial function

for i=2:times

uf = uf.*(1-h*k2); % next time step in Fourier space

u(i,:) = real(ifft(uf)); % IFFT to physical space

end

[X,T] = meshgrid(x,0:h:times*h-h);

waterfall(X,T,u)

Стоит отметить особенность алгоритма FFT в Matlab, связанную с тем, что полученные коэффициенты разложения на выходе d=fft(u) идут не по порядку, а смещены, первая половина на месте второй и наоборот. Cначала идут коэффициенты с номерами от 0 до n/2-1, потом с номерами от -n/2 до -1. С этим были проблемы… Полученное решение можно видеть на графике в виде «водопада» линий распределения температуры по х для каждого момента времени t. Видно, что решение испытывает численную неустойчивость, связано это с невыполнением критерия Куранта. Избавиться от неустойчивости можно уменьшив шаг по времени, либо применяя более продвинутую неявную схему, например Кранка-Николсона [3]