2016-04-13 5 views
2

3つの変数を持つODEモデルのベクトルフィールドをプロットしようとしています。私は、第3軸に沿ってベクトルを平均し、その値の標準偏差の情報と共にベクトルフィールドを提示したいと思います。 ODEシステムは、次のとおりです。私は現在使用しています3つの変数のODEのPythonベクトルフィールド

a = 1. 
b1 = 0.1 
b2 = 0.11 
c1 = 1.5 
c2 = 1.6 
d = 0.75 
def dudt(a,b1,b2,u,v1,v2): 
    return a*u - b1*u*v1 - b2*u*v2 
def dv1dt(d,c1,b1,u,v1): 
    return -c1*v1 + d*b1*u*v1 
def dv2dt(d,c2,b2,u,v2): 
    return -c2*v2 + d*b2*u*v2 

機能は次のとおりです。これは、第3の軸に沿って標準偏差が意味を成さない、ゼロであることを私に与え

import numpy as np 
import matplotlib.pyplot as plt 
def plotVF(mS=None, density= 20,color='k'): 
    mB1 = np.linspace(0,1.1,int(density)) 
    mB2 = np.linspace(0,1.1,int(density)) 
    if mS==None: 
     mS = np.linspace(0,1.1,int(density)) 
     B1,B2,S = np.meshgrid(mB1,mB2,mS) 
     average=True 
    else: 
     B1,B2 = np.meshgrid(mB1,mB2) 
     S = mS 
     average=False 
    DB1 = dv1dt(d,c1,b1,S,B1) 
    DB2 = dv2dt(d,c2,b2,S,B2) 
    DS = dudt(a,b1,b2,S,B1,B2) 
    if average: 
     print "Averaging" 
     DB1std = np.std(DB1,axis=2) 
     DB2std = np.std(DB2,axis=2) 
     DB1 = np.mean(DB1,axis=2) 
     DB2 = np.mean(DB2,axis=2) 
     DS = np.mean(DS,axis=2) 
     vecstd = np.hypot(DB1std,DB2std) 
     plt.imshow(vecstd) 
     plt.colorbar() 
     B1,B2 = np.meshgrid(mB1,mB2) 
    M = (np.hypot(DB1, DB2, DS)) 
    M[ M == 0] = 1. 
    DB1=DB1/M 
    DB2=DB2/M 
    DS=DS/M 
    print B1.shape,B2.shape,DB1.shape,DB2.shape 
    plt.quiver(B1, B2, DB1, DB2, pivot='mid', color=color) 
    plt.xlim(0,1.1), plt.ylim(0,1.1) 
    plt.grid('on') 
    plt.show() 

Vector_Field 誰かが私は何を間違っているのか考えていますか?

+1

あなたがしようとしていることについていくつかの言葉を書いてください。私はベクトルフィールドをプロットしています。しかし、あなたのコードは、あなたが問題になっている部分を正確に理解するには時間がかかりすぎます。 – kanayamalakar

+0

@kanayamalakar画像を追加しました。ベクトルフィールドの背景色は、メッシュグリッドの各点のベクトルの標準偏差であると仮定しています(平均化を行っています) – Ohm

+0

すべてゼロではありません。左下よりも右上に青色の明るい色合いがあります。だから多分色のスケールを変更するだけですか? – sulkeh

答えて

1

あなたのコードはほぼ完璧です。ただ1つの問題があります:あなたはplt.imshowへのバニラコールでカラーマップをプロットしています。

名前が示すとおり、画像をプロットするのにimshowが使用されます。そのため、デフォルトでは座標入力は期待されず、ピクセルデータを含む単一の配列だけが必要です。これは、imshowへの簡単な呼び出しでは、画像のピクセル数に相当する軸の制限があることを意味します.2次元データ配列の寸法です。 imshowによって直接作成された画像を見ると、制限がx,y=20になることがわかります。その後、実際の基礎となるメッシュに応じて新しい範囲を設定し、プロットを最初の2つのデータポイントに切り捨てます。

ソリューションは、あなたが存在する座標空間にあなたのプロットを配置したい場所を明示的にplt.imshow()を伝えることです:

plt.imshow(vecstd, extent=[B1.min(),B1.max(),B2.min(),B2.max()], origin='lower') 

最初のキーワード引数extentはデータがプロットされるべきにxy制限を与えます。重要な第2キーワード引数originに注目してください。デフォルトでimshowは "逆さま"のものをプロットします。ではなく、実際の画像を逆さまにプロットします。デカルト座標で定義されたものをプロットするのにimshowを使用しているときは、座標系の原点がの上のの図の左隅(画像の場合)ではなく、の下に左隅(通常のプロットの場合)。

関連する問題