11

Matplotlibの矢筒プロットに問題があります。速度ベクトル場が与えられた場合、流線の上に速度ベクトルをプロットしたいと思います。ベクトルは、期待どおりに流れ関数に接していません。

流れ関数を計算するには、 http: //www-pord.ucsd.edu/~matlab/stream.htmで入手できるDr. PankratovのMatlabコードのPython翻訳バージョンを使用します(私のものはGitHubで間もなく入手可能になります)。

その結果を使用して、私はこのコードを使用します:

import numpy
import pylab

# Regular grid coordineates, velocity field and stream function
x, y = numpy.meshgrid(numpy.arange(0, 21), numpy.arange(0, 11))
u = numpy.array([[10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
        27, 28, 29, 30],
       [ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
        26, 27, 28, 29],
       [ 8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
        25, 26, 27, 28],
       [ 7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
        24, 25, 26, 27],
       [ 6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
        23, 24, 25, 26],
       [ 5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
        22, 23, 24, 25],
       [ 4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
        21, 22, 23, 24],
       [ 3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
        20, 21, 22, 23],
       [ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
        19, 20, 21, 22],
       [ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
        18, 19, 20, 21],
       [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
        17, 18, 19, 20]])
v = numpy.array([[  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,
         13,  14,  15,  16,  17,  18,  19,  20],
       [ -1,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,
         12,  13,  14,  15,  16,  17,  18,  19],
       [ -2,  -1,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,
         11,  12,  13,  14,  15,  16,  17,  18],
       [ -3,  -2,  -1,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,
         10,  11,  12,  13,  14,  15,  16,  17],
       [ -4,  -3,  -2,  -1,   0,   1,   2,   3,   4,   5,   6,   7,   8,
          9,  10,  11,  12,  13,  14,  15,  16],
       [ -5,  -4,  -3,  -2,  -1,   0,   1,   2,   3,   4,   5,   6,   7,
          8,   9,  10,  11,  12,  13,  14,  15],
       [ -6,  -5,  -4,  -3,  -2,  -1,   0,   1,   2,   3,   4,   5,   6,
          7,   8,   9,  10,  11,  12,  13,  14],
       [ -7,  -6,  -5,  -4,  -3,  -2,  -1,   0,   1,   2,   3,   4,   5,
          6,   7,   8,   9,  10,  11,  12,  13],
       [ -8,  -7,  -6,  -5,  -4,  -3,  -2,  -1,   0,   1,   2,   3,   4,
          5,   6,   7,   8,   9,  10,  11,  12],
       [ -9,  -8,  -7,  -6,  -5,  -4,  -3,  -2,  -1,   0,   1,   2,   3,
          4,   5,   6,   7,   8,   9,  10,  11],
       [-10,  -9,  -8,  -7,  -6,  -5,  -4,  -3,  -2,  -1,   0,   1,   2,
          3,   4,   5,   6,   7,   8,   9,  10]])
psi = numpy.array([[   0. ,    0.5,    2. ,    4.5,    8. ,   12.5,   18. ,   24.5,
          32. ,   40.5,   50. ,   60.5,   72. ,   84.5,   98. ,  112.5,
         128. ,  144.5,  162. ,  180.5,  200. ],
       [  -9.5,  -10. ,   -9.5,   -8. ,   -5.5,   -2. ,    2.5,    8. ,
          14.5,   22. ,   30.5,   40. ,   50.5,   62. ,   74.5,   88. ,
         102.5,  118. ,  134.5,  152. ,  170.5],
       [ -18. ,  -19.5,  -20. ,  -19.5,  -18. ,  -15.5,  -12. ,   -7.5,
          -2. ,    4.5,   12. ,   20.5,   30. ,   40.5,   52. ,   64.5,
          78. ,   92.5,  108. ,  124.5,  142. ],
       [ -25.5,  -28. ,  -29.5,  -30. ,  -29.5,  -28. ,  -25.5,  -22. ,
         -17.5,  -12. ,   -5.5,    2. ,   10.5,   20. ,   30.5,   42. ,
          54.5,   68. ,   82.5,   98. ,  114.5],
       [ -32. ,  -35.5,  -38. ,  -39.5,  -40. ,  -39.5,  -38. ,  -35.5,
         -32. ,  -27.5,  -22. ,  -15.5,   -8. ,    0.5,   10. ,   20.5,
          32. ,   44.5,   58. ,   72.5,   88. ],
       [ -37.5,  -42. ,  -45.5,  -48. ,  -49.5,  -50. ,  -49.5,  -48. ,
         -45.5,  -42. ,  -37.5,  -32. ,  -25.5,  -18. ,   -9.5,    0. ,
          10.5,   22. ,   34.5,   48. ,   62.5],
       [ -42. ,  -47.5,  -52. ,  -55.5,  -58. ,  -59.5,  -60. ,  -59.5,
         -58. ,  -55.5,  -52. ,  -47.5,  -42. ,  -35.5,  -28. ,  -19.5,
         -10. ,    0.5,   12. ,   24.5,   38. ],
       [ -45.5,  -52. ,  -57.5,  -62. ,  -65.5,  -68. ,  -69.5,  -70. ,
         -69.5,  -68. ,  -65.5,  -62. ,  -57.5,  -52. ,  -45.5,  -38. ,
         -29.5,  -20. ,   -9.5,    2. ,   14.5],
       [ -48. ,  -55.5,  -62. ,  -67.5,  -72. ,  -75.5,  -78. ,  -79.5,
         -80. ,  -79.5,  -78. ,  -75.5,  -72. ,  -67.5,  -62. ,  -55.5,
         -48. ,  -39.5,  -30. ,  -19.5,   -8. ],
       [ -49.5,  -58. ,  -65.5,  -72. ,  -77.5,  -82. ,  -85.5,  -88. ,
         -89.5,  -90. ,  -89.5,  -88. ,  -85.5,  -82. ,  -77.5,  -72. ,
         -65.5,  -58. ,  -49.5,  -40. ,  -29.5],
       [ -50. ,  -59.5,  -68. ,  -75.5,  -82. ,  -87.5,  -92. ,  -95.5,
         -98. ,  -99.5, -100. ,  -99.5,  -98. ,  -95.5,  -92. ,  -87.5,
         -82. ,  -75.5,  -68. ,  -59.5,  -50. ]])

# The plots!
pylab.close('all')
pylab.ion()
pylab.figure(figsize=[8, 8])
pylab.contour(x, y, psi, 20, colors='k', linestyles='-', linewidth=1.0)
pylab.quiver(x, y, u, v, angles='uv', scale_units='xy', scale=10)

ax = pylab.axes()
ax.set_aspect(1.)

私の問題を説明するために次の結果を生成します。

任意の速度場とその流れ関数\Psi、予期しないアスペクト比のベクトル

明らかに計算は問題ありませんが、速度ベクトルは予想どおり流れ関数に接していません。正確な保存値を使用して、Matlabは私が欲しいものを正確に示す震えプロットを生成します。私の場合、アスペクト比を1に設定すると目的の結果が得られますが、軸の長方形に特定のアスペクト比が強制されます。

ax = pylab.axes()
ax.set_aspect(1.)

「units」、「angles」、「scale」などのさまざまな引数を試しましたが、すでに失敗しています。

キャンバスのアスペクト比に適応し、予想どおりに等高線に接する矢筒プロットを作成する方法を知っている人はいますか?

私はこれと同様の結果を期待しています(ベクトルが流線にどのように接しているかに注意してください): Matlabを使用した任意の速度場とその流れ関数\Psi、予想されるアスペクト比のベクトル

どうもありがとう!

4

1 に答える 1

12

を使用して矢筒(ドキュメント)をプロットします

pylab.quiver(x, y, u, v, angles='xy', scale_units='xy', scale=10)

angles='uv' ベクトルの角度をによって設定し、からへのベクトルatan2(u,v)angles='xy'描画します(x,y)(x+u, y+v)

于 2012-08-25T21:10:08.360 に答える