2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2, 3, 4, 5  След.
 
 [Mathematica 8] Оптимизация модели ур-я Шрёдингера
Сообщение20.08.2014, 00:40 
Заслуженный участник


27/04/09
28128
Взяв двумерное уравнение Шрёдингера с потенциалом$$i\hbar\psi'_t = V\psi - \frac{\hbar^2}{2m}(\psi''_{xx} + \psi''_{yy}})$$и поиграв в конечные разности, написал такое:
Код:
MakeSchrodingerTimeStep[V_, m_, \[HBar]_, \[CapitalDelta]t_, \[CapitalDelta]x_] := Module[
  {a1, a2, V1},
  a1 = I \[HBar] \[CapitalDelta]x^2 \[CapitalDelta]t/(2 m);
  a2 = 2 I \[HBar] \[CapitalDelta]x^2 \[CapitalDelta]t/m;
  V1 = (-((I \[CapitalDelta]t)/\[HBar]) # &) /@ V;
  Function[\[Psi],
   Block[{xnm1, ynm1, \[Psi]1},
    \[Psi]1 = Array[0 &, Dimensions[\[Psi]]];
    {xnm1, ynm1} = Dimensions[\[Psi]] - 1;
    Do[
     \[Psi]1[[xi, yi]] = a1 (\[Psi][[xi - 1, yi]] + \[Psi][[xi + 1, yi]] + \[Psi][[xi, yi - 1]] + \[Psi][[xi, yi + 1]]) + \[Psi][[xi, yi]] (1 - a2 + V1[[xi, yi]]),
     {xi, 2, xnm1}, {yi, 2, ynm1}];
    \[Psi]1
    ]
   ]
  ]
И используется оно примерно так:
Код:
n = 100;
V = Array[5 ((#1/n - .5)^2 + (#2/n - .5)^2) &, {n, n}];
step = MakeSchrodingerTimeStep[V, 1., 1., .3, 1.]; (* V, m, \[HBar], \[CapitalDelta]t, \[CapitalDelta]x *)
\[Psi] = Array[Sin[6.28 4 #2/n] Exp[-((#1 - .3 n)^2 + (#2 - .3 n)^2)/(.3 n)]/Sqrt[2. \[Pi] (.3 n)] &, {n, n}];
grs = {};
Do[
AppendTo[grs,
  ArrayPlot[\[Psi], ColorFunctionScaling -> False,
   ColorFunction -> AmplitudeCF[.05] (* моя *)]];
\[Psi] = step[\[Psi]],
{80}]
ListAnimate[grs, AnimationRunning -> False]
Как бы оптимизировать? Долго слишком (несколько минут приведённый пример работает). Да ещё и, боюсь, я написал что-то неправильно. Ну и в общем код может быть где-то неестественным — сам себя не поправишь, приму все замечания.

-- Ср авг 20, 2014 03:50:36 --

Кстати, разбирающиеся в численных методах, может быть, подскажут, какие соотношения должны тут выполняться между параметрами, чтобы не было того, что тут появляется на последних шагах по времени? Что-то я как будто соблюдал, но, видимо, или не то, или не так, или того недостаточно.

 Профиль  
                  
 
 Re: [Mathematica 8] Оптимизация модели ур-я Шрёдингера
Сообщение20.08.2014, 17:17 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
В уравнении Шрёдингера и численных методах я разбираюсь чуть лучше, чем в разведении страусов и древней истории Мадагаскара, но позволю себе наивный вопрос (раз уж «чуть лучше» ;-) Зачем вы используете процедурное программирование (Do)? Здесь же наверняка можно применить что-то нативное для Wolfram Language. Возможно, конструкцию Sow...Reap.

 Профиль  
                  
 
 Re: [Mathematica 8] Оптимизация модели ур-я Шрёдингера
Сообщение20.08.2014, 17:44 
Заслуженный участник


27/04/09
28128
С нею как раз беда, этот коан я так ещё и не раскусил. :-) Да и выполнится ли она быстрее? (одно ядро с Hyper-Treading). Хотя ещё есть MapIndexed, который тут вписывается… Проверю его. Вру.

Видимо, придётся писать потом на другом языке.

 Профиль  
                  
 
 Re: [Mathematica 8] Оптимизация модели ур-я Шрёдингера
Сообщение20.08.2014, 18:08 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
arseniiv в сообщении #897853 писал(а):
Видимо, придётся писать потом на другом языке.
Не смейте предавать Математику! ;-) Мы же с вами прекрасно знаем, что «Нет ничего невозможного» — лозунг, лучше всего подходящий именно этой системе. Что-нибудь придумается, но нужно подумать.
arseniiv в сообщении #897853 писал(а):
С нею как раз беда, этот коан я так ещё и не раскусил.
Честно признаться, я тоже, хотя были задачи, где эта конструкция подошла бы лучше всего.

 Профиль  
                  
 
 Re: [Mathematica 8] Оптимизация модели ур-я Шрёдингера
Сообщение20.08.2014, 18:33 
Заслуженный участник


27/04/09
28128
Aritaborian в сообщении #897860 писал(а):
Что-нибудь придумается, но нужно подумать.
Что я ещё вижу — компиляцию, но она, вроде, для функции, преобразующей матрицу, хоть и чисел, не допускается.

Aritaborian в сообщении #897860 писал(а):
Не смейте предавать Математику! ;-)
У меня есть C# и MathNet.Numerics — это серьёзное оправдание! :-)

Нестабильность после 60-80-й итерации весьма удручает. Как там всё же надо анализировать разностные схемы?.. Помогает ли повышение порядка?

 Профиль  
                  
 
 Re: [Mathematica 8] Оптимизация модели ур-я Шрёдингера
Сообщение20.08.2014, 19:09 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
arseniiv в сообщении #897878 писал(а):
Что я ещё вижу — компиляцию, но она, вроде, для функции, преобразующей матрицу, хоть и чисел, не допускается.
Никогда серьёзно не вникал в Compile (не нужно было), но теперь прочёл в справке:
Цитата:
Compile handles numerical functions, matrix operations, procedural programming constructs, list manipulation functions, and functional programming constructs, etc.
Или это всё не о том?

 Профиль  
                  
 
 Re: [Mathematica 8] Оптимизация модели ур-я Шрёдингера
Сообщение20.08.2014, 20:47 
Аватара пользователя


29/05/11
227
Красноармейск, Донецкая обл.
arseniiv, я вижу несколько способов ускорить Ваш код:
1. Использовать Compile для частичной компиляции кода.
2. Переписать в другом стиле (с императивного на функциональное или др.), другими методами.
3. Использовать мощный инструмент символьных вычислений.
С последним я ещё не разобрался, в первый — неинтересно. Оставляю второй вариант, который у меня работает в 10-15 раз шустрее Вашего:
Код:
Step[\[Psi]_] := ArrayPad[a1 ListConvolve[{
       {0, 1, 0},
       {1, 0, 1},
       {0, 1, 0}
      } , \[Psi]], 1] + \[Psi] (1 - a2 + V1);

(полностью)

Код:
m = 1.;
\[HBar] = 1.;
\[CapitalDelta]t = .3;
\[CapitalDelta]x = 1.;

n = 100;
V = Array[5 ((#1/n - .5)^2 + (#2/n - .5)^2) &, {n, n}];
\[Psi]0 =
  Array[Sin[6.28 4 #2/n] Exp[-((#1 - .3 n)^2 + (#2 - .3 n)^2)/(.3 n)]/
      Sqrt[2. \[Pi] (.3 n)] &, {n, n}];

a1 = (I \[HBar] \[CapitalDelta]x^2 \[CapitalDelta]t)/(2 m);
a2 = 2 I \[HBar] \[CapitalDelta]x^2 \[CapitalDelta]t/m;
V1 = -((I \[CapitalDelta]t)/\[HBar]) # & /@ V;

Step[\[Psi]_] := ArrayPad[a1 ListConvolve[{
       {0, 1, 0},
       {1, 0, 1},
       {0, 1, 0}
      } , \[Psi]], 1] + \[Psi] (1 - a2 + V1);

First[Timing[grp = NestList[Step, \[Psi]0, 80]]]
ListAnimate[ArrayPlot[#, ColorFunctionScaling -> False] & /@ grp]

Все параметры всегда можно замкнуть в Module-Function, на скорости не сказывается.
Обратите внимание, Times автоматически отображается на списки: Times[list1, list2] == MapThread[Times, {list1, list2}].
Также можно менять ядро свёртки, тем самым меняя разностную схему.

P.S. Вам нулевые краевые условия принципиальны?

 Профиль  
                  
 
 Re: [Mathematica 8] Оптимизация модели ур-я Шрёдингера
Сообщение20.08.2014, 21:18 
Заслуженный участник
Аватара пользователя


30/01/06
72407
А как насчёт результаты повыкладывать? :-)

 Профиль  
                  
 
 Re: [Mathematica 8] Оптимизация модели ур-я Шрёдингера
Сообщение20.08.2014, 22:03 
Аватара пользователя


29/05/11
227
Красноармейск, Донецкая обл.
Munin, если Вы мне замечание сделали, то я подкреплю циферками:

(преамбула)

Код:
m = 1.;
\[HBar] = 1.;
\[CapitalDelta]t = .3;
\[CapitalDelta]x = 1.;
n = 100;
V = Array[5 ((#1/n - .5)^2 + (#2/n - .5)^2) &, {n, n}];
\[Psi]0 =
  Array[Sin[6.28 4 #2/n] Exp[-((#1 - .3 n)^2 + (#2 - .3 n)^2)/(.3 n)]/
      Sqrt[2. \[Pi] (.3 n)] &, {n, n}];
a1 = I \[HBar] \[CapitalDelta]x^2 \[CapitalDelta]t/(2 m);
a2 = 2 I \[HBar] \[CapitalDelta]x^2 \[CapitalDelta]t/m;
V1 = (-((I \[CapitalDelta]t)/\[HBar]) # &) /@ V;
s = 80; (* число шагов *)
Исходный код

(Оффтоп)

Код:
Step = Function[\[Psi],
   Block[{xnm1, ynm1, \[Psi]1},
    \[Psi]1 = Array[0 &, Dimensions[\[Psi]]];
    {xnm1, ynm1} = Dimensions[\[Psi]] - 1;
    Do[
     \[Psi]1[[xi, yi]] =
      a1 (\[Psi][[xi - 1, yi]] + \[Psi][[xi + 1, yi]] + \[Psi][[xi,
            yi - 1]] + \[Psi][[xi, yi + 1]]) + \[Psi][[xi, yi]] (1 -
          a2 + V1[[xi, yi]]),
     {xi, 2, xnm1}, {yi, 2, ynm1}];
    \[Psi]1]
   ];

\[Psi] = \[Psi]0;
grs = {};
First[Timing[Do[AppendTo[grs, \[Psi]]; \[Psi] = Step[\[Psi]], {s}]]]

Out= 11.6287
Заменим императивный цикл Do-Append-Set на Nest

(Оффтоп)

Код:
First[Timing[grs = NestList[Step, \[Psi]0, s]]]

Out= 11.6647
Заменим в исходном коде Function на правило SetDelay

(Оффтоп)

Код:
Step[\[Psi]_] :=
  Block[{xnm1, ynm1, \[Psi]1},
   \[Psi]1 = Array[0 &, Dimensions[\[Psi]]];
   {xnm1, ynm1} = Dimensions[\[Psi]] - 1;
   Do[
    \[Psi]1[[xi, yi]] =
     a1 (\[Psi][[xi - 1, yi]] + \[Psi][[xi + 1, yi]] + \[Psi][[xi,
           yi - 1]] + \[Psi][[xi, yi + 1]]) + \[Psi][[xi, yi]] (1 -
         a2 + V1[[xi, yi]]),
    {xi, 2, xnm1}, {yi, 2, ynm1}];
   \[Psi]1];

\[Psi] = \[Psi]0;
grs = {};
First[Timing[Do[AppendTo[grs, \[Psi]]; \[Psi] = Step[\[Psi]], {s}]]]

Out= 11.4567
Вывод: от этих двух факторов ничего не зависит!

А вот теперь попробуем переписать тело функции.

(Оффтоп)

Код:
Step[\[Psi]_] :=
  ArrayPad[a1 ListConvolve[{{0, 1, 0}, {1, 0, 1}, {0, 1, 0}}, \[Psi]],
     1] + \[Psi] (1 - a2 + V1);

\[Psi] = \[Psi]0;
grs = {};
First[Timing[Do[AppendTo[grs, \[Psi]]; \[Psi] = Step[\[Psi]], {s}]]]

Out= 1.80411
Профит налицо, на порядок.

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

 Профиль  
                  
 
 Re: [Mathematica 8] Оптимизация модели ур-я Шрёдингера
Сообщение20.08.2014, 22:44 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Нет, я в адрес ТС, хотел результаты счёта посмотреть :-) Какие-то несколько минут - не слишком большая цена, если в результате получается анимашка, которую можно вставить на форум, и годами демонстрировать студентам и прочим интересующимся.

 Профиль  
                  
 
 Re: [Mathematica 8] Оптимизация модели ур-я Шрёдингера
Сообщение21.08.2014, 00:14 
Аватара пользователя


29/05/11
227
Красноармейск, Донецкая обл.
Позволю себе вставить картиночку по мотивам кода ТС. Единственное, у ТС разукраска немножко другая, собственная.
Изображение
Размер: 100 х 100 точек, 80 кадров
У меня считалось полторы минуты.

 Профиль  
                  
 
 Re: [Mathematica 8] Оптимизация модели ур-я Шрёдингера
Сообщение21.08.2014, 00:21 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Mysterious Light, GIF-анимация на форуме не отображается, имейте в виду.
(Но можно кликнуть ;-)

 Профиль  
                  
 
 Re: [Mathematica 8] Оптимизация модели ур-я Шрёдингера
Сообщение21.08.2014, 12:49 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Mysterious Light
Я так понимаю, это свободная частица и неподвижный пакет?

 Профиль  
                  
 
 Re: [Mathematica 8] Оптимизация модели ур-я Шрёдингера
Сообщение21.08.2014, 14:19 
Аватара пользователя


29/05/11
227
Красноармейск, Донецкая обл.
Aritaborian в сообщении #898001 писал(а):
Mysterious Light, GIF-анимация на форуме не отображается, имейте в виду.
(Но можно кликнуть ;-)
Спасибо, я уж думал было, что это мой браузер глючит: по ссылке показывает гиф-анимацию, а на форуме — нет.

Munin, за физической интерпретацией обращаться к ТС.
Насколько я вижу, решается вышеуказанное уравнение Ш. с начальным условием $$\psi_0(x,y) = \sin\left(2\pi \frac{4y}n\right) \exp\left(-\frac{(x-0.3n)^2 + (y-0.3n)^2}{0.3 n}\right)$$ для потенциала $$V(x,y) = 5 \left(\frac xn-\frac12\right)^2 + 5 \left(\frac yn-\frac12\right)^2$$

 Профиль  
                  
 
 Re: [Mathematica 8] Оптимизация модели ур-я Шрёдингера
Сообщение21.08.2014, 17:40 
Заслуженный участник


25/02/11
1786
Чисто экспериментально, если убрать $i$ в поределении V1, и уменьшить шаг по $t$ в $4$ раза, то облако движется в точку минимума потенциала, где и застывает.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 75 ]  На страницу 1, 2, 3, 4, 5  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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