Scientific Pythonの有限差分法の推奨事項


20

私が取り組んでいるプロジェクト(双曲線PDEの場合)では、いくつかの数値を見て、動作の大まかなハンドルを取得したいと思います。しかし、私はあまり良いプログラマーではありません。

Scientific Pythonで有限差分スキームを効果的にコーディングする方法を学習するためのリソースをお勧めできますか(学習曲線が小さい他の言語も歓迎します)?

この推奨事項の対象者(私)のアイデアを提供するには:

  • 私は訓練によって純粋な数学者であり、有限差分スキームの理論的な側面にある程度精通しています
  • 私が助けが必要なのは、コンピューターに計算したいものを計算させる方法です。特に、他の人がすでに行った労力をあまり重複させないように(車輪を再発明しないようにパッケージは既に利用可能です)。(私が避けたいもう一つのことは、目的に合ったデータ構造が確立されているときに、何かを手作業でコーディングすることです。)
  • コーディングの経験があります。しかし、Pythonには何もありませんでした(したがって、別の言語を学習するための優れたリソースがあるかどうかは気にしません[たとえば、Octave])。
  • サンプルコードのコレクションと同様に、書籍とドキュメントの両方が役立ちます。

主な問題は、どこから探し始めればよいかさえわからないことです。そのため、基本的な提案も役立ちます。
ウィリーウォン

制限は、私が(まだ)有限体積法に精通していないことだけです。そのため、この方法を併せて学習する必要があります。もちろん、そのような答えには反対しません。
ウィリーウォン

PyClawは非線形ソース用語を処理できますが、独自のリーマンソルバーを記述するのは、特に2次元以上の次元では複雑になります。構造化されたグリッドで単純な有限差分スキームを試したい場合、次のオプションはpetsc4pyで何かを試すことです(開示:私もこのプロジェクトに所属しています)。文書化。
アロンアフマディア


こんにちはウィリー(およびチャットを見たことのない読者向け)は、すでにこれを知っていると思いますが、双曲線PDEについて述べたので、おそらく有限体積法の方が良いでしょう。
マシューエメット

回答:


10

これは、私が保守しているpy4sciリポジトリーのDavid Ketcheson教授によって寄稿された、有限差分法を使用して単純な多変量PDEを解く97行の例です。有限ボリュームの離散化でショックや保存を処理する必要があるより複雑な問題については、開発を支援するソフトウェアパッケージ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

この参照は非常に役立つ場合があります。これはインターネット上で開かれた本です。この本からpythonを学びました(まだ学習中です)。本当に良いリソースだと思いました。

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

数値計算については、間違いなく「numpy」を選択する必要があります。( 'array'と 'matrix'と 'list'を正しく理解していることを確認してください)(numpyのドキュメントを参照してください)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.