LINUX.ORG.RU

python, matplotlib и анимация.


0

1

Я в пистоне новичек, поэтому не пинать.

Никак не могу заставить работать следующий код:

сама математическая часть работает. А вот анимацию никак не могу заставить работать. два часа бьюсь.

#!/usr/bin/python2

from numpy import *
from numpy.random import *
import matplotlib.pyplot as pyplot
from matplotlib import animation

gamma=1.6; sigma=1.6; mu=0.2; ro=1.5; D=100.0; alpha=3.0; beta=3.0; p=0.2;
N=20; M=20;
dx=1.0/N; dt=dx**2/(2*D)/2;

n=rand(N,M); w=rand(N,M);

lambda1=dt/dx**2
lambda2=dt*D/dx**2
def stempel(n,i,j):
    return n[fmod(i+1+N,N),j]+n[fmod(i-1+N,N),j]+\
    n[i,fmod(j-1+M,M)]+n[i,fmod(j+1+M,M)]-4*n[i,j]

def schritt(n,w):

    n2=n; w2=w;

    for i in range(0,N):
        for j in range (0,M):
            n2[i,j]=n[i,j]+lambda1*stempel(n,i,j)+\
            dt*((gamma*w[i,j]/(1+sigma*w[i,j])-mu)*n[i,j]-n[i,j]**2);

            w2[i,j]=w[i,j]+dt*(p-(1-ro*n[i,j])*w[i,j]-w[i,j]**2*n[i,j])+\
            lambda2*stempel(w-beta*n,i,j);
    return n2,w2

fig=pyplot.figure();
ax=pyplot.axes();
field=ax.pcolor(rand(0,0));

def init():
    return

def animate(i):
    n,w=schritt(n,w)
    field.pcolor(n)
    return field

anim=animation.FuncAnimation(fig, animate, init_func=init,frames=10,interval=20,blit=True)

#for i in range (0,20):
    #pyplot.pcolor(n)
    #fig.canvas.draw();
    #n,w=schritt(n,w)
★★☆☆☆

#!/usr/bin/python2

import numpy as np
from numpy import *
from numpy.random import *
import matplotlib.pyplot as pyplot
from matplotlib import animation

gamma=1.6; sigma=1.6; mu=0.2; ro=1.5; D=100.0; alpha=3.0; beta=3.0; p=0.2;
N=20; M=20;
dx=1.0/N; dt=dx**2/(2*D)/2;

global n,w
n=rand(N,M); w=rand(N,M);

lambda1=dt/dx**2
lambda2=dt*D/dx**2
def stempel(n,i,j):
    return n[fmod(i+1+N,N),j] \
          +n[fmod(i-1+N,N),j] \
          +n[i,fmod(j-1+M,M)] \
          +n[i,fmod(j+1+M,M)] \
          -4*n[i,j]

def schritt(n,w):
    n2=n; w2=w;
    for i in range(0,N):
        for j in range (0,M):
            n2[i,j]=n[i,j]+lambda1*stempel(n,i,j)+\
            dt*((gamma*w[i,j]/(1+sigma*w[i,j])-mu)*n[i,j]-n[i,j]**2);

            w2[i,j]=w[i,j]+dt*(p-(1-ro*n[i,j])*w[i,j]-w[i,j]**2*n[i,j])+\
            lambda2*stempel(w-beta*n,i,j);
    return (n2,w2)

fig=pyplot.figure();
ax=pyplot.axes();

x=np.linspace(0,1,N)
y=np.linspace(0,1,M)

def init():
    return pyplot.pcolor(n, y, n)

def animate(i):
    global n,w
    (n,w)=schritt(n,w)
    return pyplot.pcolor(x, y, n)

anim=animation.FuncAnimation(fig, animate, init_func=init,frames=10,interval=20,blit=True)
anim.save('out.mp4')

но n не меняется. если в animate поменять (n,w)=schritt(n,w) на n=rand(N,M) в ролике будут видны кадры.

anonymous ()
Ответ на: комментарий от anonymous

да. быстрее не получится. я применяю дубовый FTCS метода решения дифура. А он стабильный только при относительно малоый временных шагах. увеличь до 500. Сабж моделирует распределение растительности на почве.

dikiy ★★☆☆☆ ()

Особенно stempel и schritt хорошо выглядят. Странно что animate а не animieren. Для полноты картины.

morse ★★★★★ ()
Ответ на: комментарий от morse

Особенно stempel и schritt хорошо выглядят. Странно что animate а не animieren. Для полноты картины.

тю. я иногда и транслитом называю. Главное, что понятно.

dikiy ★★☆☆☆ ()
Ответ на: комментарий от dikiy
#!/usr/bin/python2

import numpy as np
from numpy import *
from numpy.random import *
import matplotlib.pyplot as pyplot
from matplotlib import animation

gamma=1.6; sigma=1.6; mu=0.2; ro=1.5; D=100.0; alpha=3.0; beta=3.0; p=0.2;
N=20; M=20;
dx=1.0/N; dt=dx**2/(2*D)/2;

global n,w
n=rand(N,M); w=rand(N,M);

lambda1=dt/dx**2
lambda2=dt*D/dx**2
def stempel(n,i,j):
    return n[fmod(i+1+N,N),j] \
          +n[fmod(i-1+N,N),j] \
          +n[i,fmod(j-1+M,M)] \
          +n[i,fmod(j+1+M,M)] \
          -4*n[i,j]

def schritt(n,w):
    n2=n; w2=w;
    for i in range(0,N):
        for j in range (0,M):
            n2[i,j]=n[i,j]+lambda1*stempel(n,i,j)+\
            dt*((gamma*w[i,j]/(1+sigma*w[i,j])-mu)*n[i,j]-n[i,j]**2);

            w2[i,j]=w[i,j]+dt*(p-(1-ro*n[i,j])*w[i,j]-w[i,j]**2*n[i,j])+\
            lambda2*stempel(w-beta*n,i,j);
    return (n2,w2)

fig=pyplot.figure();
ax=pyplot.axes();

x=np.linspace(0,1,N)
y=np.linspace(0,1,M)

def init():
    return pyplot.pcolor(n, y, n),

def animate(i):
    print i
    global n,w
    (n,w)=schritt(n,w)
    return pyplot.pcolor(x, y, n),

anim=animation.FuncAnimation(fig, animate, init_func=init,frames=100,interval=20,blit=True)
#anim.save('out.mp4')

pyplot.show()
anonymous ()
Ответ на: комментарий от anonymous

а запятую я вообще не заметил.... блин, разбираться походу с этим matplotlib еще долго. init я убрал нафиг....

В общем, оно работает!!!1!!1 спасибо!

dikiy ★★☆☆☆ ()
Ответ на: комментарий от anonymous

странно, а почему оно тепепрь после заданного количества итераций не выходит? или оно теперь просто в цикле работает?

dikiy ★★☆☆☆ ()
Ответ на: комментарий от dikiy

да, он кадры запоминает, нужно сказать: pyplot.hold(False)

anonymous ()

Eddy_Em, нужна помощь по физике :) Связано с теорией нестабильностей. не могу заставить сабжевую программу генерировать ничего кроме простейшего узора из четырех точек.

dikiy ★★☆☆☆ ()
Ответ на: комментарий от Eddy_Em

А чего там у тебя?

не мог получить стабильные структуры в районе нестабильности дифура. Точнее получал, но самую примитивную. но я уже решил.

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

dikiy ★★☆☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.