Gamedev LectureСтатьи

Лекция #4. "Физическая" водичка. Откуда берутся эти $#!^$ формулы? [Лектор - xmvlad]

Автор:

<xmvlad> так для начала ссылка на статью IP: http://www.gamedev.ru/articles/?id=30119
<Sark7> там все как-то сложноъ
<xmvlad> первая формула (1), которую мы видим в этой статье - волновой диф. ур, который является апроксимацией уравнений навьер стока, для случая "тихой воды". То есть для того случая когда, водная поверхность подвержена не значительным колебаниям, етк пример - поверхность озера.
<xmvlad> значит d^2 U / d^2 t = d^2 U / d^2 x + d^2 U / d^2 y
<kas> эээ
<xmvlad> наша задача состоит в том что бы "решить" этот дифур, с приемлемой скоростью :)
<xmvlad> для этого используется явный метод конечно-разностной апроксимации.
<xmvlad> как известно из курса численных методов, вторую производную функции можно приблизить, следующей конечной-разностью:
<xmvlad> d^2 F / d^2 x = F[x - 1] - 2 F[x] + F[x + 1] / dx^2
<xmvlad> dx - шаг апроксимации Fx - 1, Fx, Fx + 1 -значения в функции в "узлах" сетки
<xmvlad> теперь возвращаясь к исходному дифуру (1), заменяем все вторые производные их конечно разностными приближениями
<xmvlad> (U[t+1] - 2*U[t] + U[t-1])/dt^2 = (U[x+1, y] - 2*U[x, y] + U[x-1, y])/dx^2 + (U[x, y+1] - 2*U[x,y] + U[x, y-1])/dy^2
<xmvlad> U[t] - значения U во "временной сетки", U[x,y] - значение функции в двухмерной сетки(поверхности воды)
<xmvlad> при условии равенства dy == dx (квадратная сетка получаем следующее):
<Sark7> эх забыл я вышку

  • kas и низнал никада
  • <xmvlad> да нет тут вышки почти %)
    <Sark7> про конечные разности только смутные воспоминания %)
    <xmvlad> dy == dx == dg
    <xmvlad> U[t+1] = (U[x+1, y] + U[x-1, y] + U[x,y+1] + U[x, y-1] - 4*U[x,y])*(dt/dg)^2 + 2*U[t] - U[t-1]
    <xmvlad> то есть зная значения в двух предыдущих узлах временной сетки, получаем значение для следующего момента времени t + 1
    <xmvlad> в силу того, что U[x,y] == U[t] можно немного оптимизирвоать :)
    <xmvlad> U[t+1] = (U[x+1, y] + U[x-1, y] + U[x,y+1] + U[x, y-1])*(dt/dg)^2 + U[t]*(2 - 4*(dt/dg)^2) - U[t-1]
    <xmvlad> как видно из формулы, необходимо хранить значения для текущего момента времени (t) и предыдущего (t - 1), исходя из этого получаем схему с двумя сетками(двух мерный массив), меняющими друг-друга по "кругу" (см. реализация IP)
    <xmvlad> минусы метода
    <xmvlad> как и все явные методы он является условно устойчивым, то есть при некоторых не благоприятных условиях его может "расколбасить" :)
    <xmvlad> ключевое влияние на устойчивость метода оказывает выбор  коэффиценто
    <xmvlad> ключевое влияние на устойчивость метода оказывает выбор отношения коэффицентов (dt/dg)^2 желательно от 0.4-0.8 :)
    <xmvlad> да еще можно вести фэйковый коэффицент вызкости(выглядит нормально)
    <Sark7> а шо такое dg?
    <kas> обозначения
    <kas>  [20:36:19] xmvlad: dy == dx == dg
    <xmvlad> U[t+1] = (U[x+1, y] + U[x-1, y] + U[x,y+1] + U[x, y-1])*(dt/dg)^2 + U[t]*(2 - 4*(dt/dg)^2) - (1.0f - viscousity)*U[t-1]
    <xmvlad> размер квадратной сетки
    <xmvlad> формула получилась, примерно таже самая что и в реализации IP, только у него там коэффицент левые(с потолка) :)
    <xmvlad> вот и все
    <xmvlad> вопросы?
    <Sark7> а что такое U[t] и чем оно отличается от U[x,y] ?
    <Sark7> это вообще разные массивы?
    <MiF> http://www.gamedev.ru/community/gamedev_lecture/forum/?id=889
    <xmvlad> U[t] это значение функции в момент времени t, U[x,y] это значение функции в точки x,y в момент времени t
    <Sark7> а
    <xmvlad> то есть U[t] == U[x,y]
    <Sark7> гламурно

    20 января 2006