Рекомендація щодо методу кінцевих відмінностей у науковому пітоні


20

Для проекту, над яким я працюю (у гіперболічних PDE), я хотів би отримати деяку грубу обробку поведінки, переглянувши деякі числові показники. Я, проте, не дуже хороший програміст.

Ви можете порекомендувати деякі ресурси для навчання як ефективний код різницевих кінцевих схем в Науковому Python (інших мови з невеликими кривим навчанням також вітається)?

Щоб дати вам уявлення про аудиторію (мене) щодо цієї рекомендації:

  • Я чистий математик за навчанням і трохи знайомий з теоретичними аспектами схем кінцевих різниць
  • Мені потрібна допомога, як змусити комп'ютер обчислити те, що я хочу, щоб він обчислював, особливо таким чином, щоб я не повторював занадто багато зусиль, які вже доклали інші (щоб не вигадувати колесо, коли пакет уже доступний). (Ще одне, чого я хотів би уникнути, - це тупо кодувати щось вручну, коли є створені структури даних, що відповідають цілі.)
  • У мене був досвід кодування; але я не мав жодного в Python (отже, я не заперечую, чи є хороші ресурси для вивчення іншої мови (скажімо, наприклад, Октава)).
  • Книги, документація можуть бути корисними, як і колекції прикладного коду.

Основна проблема полягає в тому, що я навіть не знаю, з чого почати шукати: тому навіть основні пропозиції були б корисними.
Віллі Вонг

Обмеження полягає лише в тому, що я не (ще) знайомий з методами обмеженого обсягу; тому мені доведеться вивчити метод спільно. Я, звичайно, не заперечував би проти такої відповіді.
Віллі Вонг

PyClaw може працювати з нелінійними термінами джерела, але написання власного рішень Рімана буде складним, особливо у 2-му чи більш високому вимірах. Якщо ви хочете спробувати просту схему з обмеженим розмежуванням зі структурованими сітками, наступним варіантом буде спробувати щось у petsc4py , (Розкриття: Я також пов'язаний з цим проектом), що має більш загальне призначення і не дуже добре. задокументовано.
Арон Ахмадія


Привіт Віллі (і для читачів, які не дивилися на чат), я думаю, ви це вже знаєте, але оскільки ви згадали про гіперболічні PDE, вам, мабуть, буде краще за допомогою методу обмеженої гучності.
Меттью Емметт

Відповіді:


10

Ось 97- рядовий приклад вирішення простого багатоваріантного PDE з використанням методів кінцевих різниць, внесених професором Девідом Кетчесоном , із сховища py4sci, який я підтримую. Для більш складних задач , де необхідно обробляти шоки або збереження в кінцевих обсягах дискретизації, я рекомендую дивитися на pyclaw , пакет програмного забезпечення , який я допомогти розробці.

"""Pattern formation code

    Solves the pair of PDEs:
       u_t = D_1 \nabla^2 u + f(u,v)
       v_t = D_2 \nabla^2 v + g(u,v)
"""

import matplotlib
matplotlib.use('TkAgg')
import numpy as np
import matplotlib.pyplot as plt
from scipy.sparse import spdiags,linalg,eye
from time import sleep

#Parameter values
Du=0.500; Dv=1;
delta=0.0045; tau1=0.02; tau2=0.2; alpha=0.899; beta=-0.91; gamma=-alpha;
#delta=0.0045; tau1=0.02; tau2=0.2; alpha=1.9; beta=-0.91; gamma=-alpha;
#delta=0.0045; tau1=2.02; tau2=0.; alpha=2.0; beta=-0.91; gamma=-alpha;
#delta=0.0021; tau1=3.5; tau2=0; alpha=0.899; beta=-0.91; gamma=-alpha;
#delta=0.0045; tau1=0.02; tau2=0.2; alpha=1.9; beta=-0.85; gamma=-alpha;
#delta=0.0001; tau1=0.02; tau2=0.2; alpha=0.899; beta=-0.91; gamma=-alpha;
#delta=0.0005; tau1=2.02; tau2=0.; alpha=2.0; beta=-0.91; gamma=-alpha; nx=150;

#Define the reaction functions
def f(u,v):
    return alpha*u*(1-tau1*v**2) + v*(1-tau2*u);

def g(u,v):
    return beta*v*(1+alpha*tau1/beta*u*v) + u*(gamma+tau2*v);


def five_pt_laplacian(m,a,b):
    """Construct a matrix that applies the 5-point laplacian discretization"""
    e=np.ones(m**2)
    e2=([0]+[1]*(m-1))*m
    h=(b-a)/(m+1)
    A=np.diag(-4*e,0)+np.diag(e2[1:],-1)+np.diag(e2[1:],1)+np.diag(e[m:],m)+np.diag(e[m:],-m)
    A/=h**2
    return A

def five_pt_laplacian_sparse(m,a,b):
    """Construct a sparse matrix that applies the 5-point laplacian discretization"""
    e=np.ones(m**2)
    e2=([1]*(m-1)+[0])*m
    e3=([0]+[1]*(m-1))*m
    h=(b-a)/(m+1)
    A=spdiags([-4*e,e2,e3,e,e],[0,-1,1,-m,m],m**2,m**2)
    A/=h**2
    return A

# Set up the grid
a=-1.; b=1.
m=100; h=(b-a)/m; 
x = np.linspace(-1,1,m)
y = np.linspace(-1,1,m)
Y,X = np.meshgrid(y,x)

# Initial data
u=np.random.randn(m,m)/2.;
v=np.random.randn(m,m)/2.;
plt.hold(False)
plt.pcolormesh(x,y,u)
plt.colorbar; plt.axis('image'); 
plt.draw()
u=u.reshape(-1)
v=v.reshape(-1)

A=five_pt_laplacian_sparse(m,-1.,1.);
II=eye(m*m,m*m)

t=0.
dt=h/delta/5.;
plt.ion()

#Now step forward in time
for k in range(120):
    #Simple (1st-order) operator splitting:
    u = linalg.spsolve(II-dt*delta*Du*A,u)
    v = linalg.spsolve(II-dt*delta*Dv*A,v)

    unew=u+dt*f(u,v);
    v   =v+dt*g(u,v);
    u=unew;
    t=t+dt;

    #Plot every 3rd frame
    if k/3==float(k)/3:
        U=u.reshape((m,m))
        plt.pcolormesh(x,y,U)
        plt.colorbar
        plt.axis('image')
        plt.title(str(t))
        plt.draw()

plt.ioff()

8

Ви можете подивитися на Fenics , який є фреймом python / C, який дозволяє вирішити досить загальні рівняння за допомогою спеціальної мови розмітки. В основному він використовує кінцеві елементи, але варто їх переглянути. Підручник повинен дати вам уявлення про те , як легко можна вирішити проблеми.


3

Ця довідка може бути дуже корисною для вас. Це відкрита книга в Інтернеті. Я навчився (досі вчуся), пітона з цієї книги. Я дійсно вважав це дуже хорошим ресурсом.

http://www.openbookproject.net/thinkcs/python/english2e/

Для числового обчислення обов'язково слід перейти до 'numpy'. (просто переконайтеся, що ви правильно зрозуміли "масив" та "матрицю" та "список") (див. для цього документацію з нумером)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.