Mathematica 2D Анимация теплового уравнения - PullRequest
2 голосов
/ 03 декабря 2010

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

RT = 388.726919
R = 1
FUNC == NDSolve[{D[T[x, y, t], t] == 
RT*(D[T[x, y, t], x, x] + D[T[x, y, t], y, y]),

   T[x, y, 0] == 0,
   T[0, y, t] == R*t,
   T[9, y, t] == R*t,
   T[x, 0, t] == R*t,
   T[x, 9, t] == R*t},

  T, {x, 0, 9}, {y, 0, 9}, {t, 0, 6}]

Итак, первые две переменные просто контролируют скорость изменения. Уравнение, которое я решаю, является основным 2D-уравнением теплопроводности, где dT / dt = a (d ^ 2T / dx ^ 2 + d ^ 2T / dy ^ 2). Начальные условия устанавливают все в 0, затем определяют края как источник изменения тепла. Прямо сейчас он проходит по блоку 9х9 от t = 0 до t = 6.

Вторая часть пытается оживить работающую функцию.

ListAnimate[
Table[
   DensityPlot[T[x, y, t] /. FUNC, {x, 0, 9}, {y, 0, 9}, Mesh -> 9]
, {t, 0, 6}]
]

К сожалению, это не работает, и я схожу с ума, пытаясь понять, почему. Сначала я думал, что это как-то связано с функцией интерполяции, но теперь я не уверен, что код анимации тоже работает. У кого-нибудь есть идеи?

Ответы [ 2 ]

9 голосов
/ 03 декабря 2010

Просто быстрая проверка:

RT = 1
R = 1
FUNC = NDSolve[{D[T[x, y, t], t] == 
     RT*(D[T[x, y, t], x, x] + D[T[x, y, t], y, y]), T[x, y, 0] == 0, 
    T[0, y, t] == R*t,
    T[9, y, t] == R*t,
    T[x, 0, t] == R*t,
    T[x, 9, t] == R*t}, T,
   {x, 0, 9}, {y, 0, 9}, {t, 0, 6}];
a = Table[
  Plot3D[T[x, y, t] /. FUNC, {x, 0, 9}, {y, 0, 9}, Mesh -> 15, 
   PlotRange -> {{0, 9}, {0, 9}, {-1, 10}}, 
   ColorFunction -> Function[{x, y, z}, Hue[.3 (1 - z)]]], {t, 0, 6}]
Export["c:\anim.gif", a]

alt text

PS: избежать многих ошибок, используя строчную букву в качестве первого символа для ваших символов ...

1 голос
/ 03 декабря 2010

Я с Марком - в вашей программе нет ничего плохого.Проблема в том, что с вашей функцией после t=0 не происходит ничего интересного: попробуйте взглянуть на

ListAnimate[
 Table[Plot3D[T[x, y, t] /. FUNC, {x, 0, 9}, {y, 0, 9}, Mesh -> 9], {t, 0, 6}]]

. Как видите, все, что происходит, - это масштабирование, так что когда DensityPlot изменяет масштаб каждого кадранезависимо друг от друга они выглядят одинаково :)

...