2017-10-19 92 views
0

我試圖繪製基本位流(均勻,源出/吸入式,渦流式等)繪圖與Python

我剛開始接觸蟒蛇,因此我有點流線和速度勢簡化困惑。我下面this guide ..

我可以使用此功能

def cylinder_stream_function(U=1, R=1): 
    r = sympy.sqrt(x**2 + y**2) 
    theta = sympy.atan2(y, x) 
    return U * (r - R**2/r) * sympy.sin(theta) 

和它的作品繪製流線的流動圍繞圓柱體。但是,當我改變return語句

return U * r * sympy.cos(theta) 

均勻流動,我得到

Traceback (most recent call last): 
    File "test.py", line 42, in 
<module> 
    plot_streamlines(ax, u, v) 
    File "test.py", line 32, in plot_streamlines 
    ax.streamplot(X, Y, u(X, Y), v(X, Y), color='cornflowerblue') 
    File "/usr/local/lib/python3.6/site-packages/matplotlib/__init__.py", 
line 1710, in inner 
    return func(ax, *args, **kwargs) 
    File "/usr/local/lib/python3.6/site-packages/matplotlib/axes/_axes.py", 
line 4688, in streamplot 
    integration_direction=integration_direction) 
    File "/usr/local/lib/python3.6/site-packages/matplotlib/streamplot.py", 
line 136, in streamplot 
    if (u.shape != grid.shape) or (v.shape != grid.shape): 
    AttributeError: 'int' object has no attribute 'shape' 

我檢查返回的對象類型下面的錯誤,這是<class 'sympy.core.mul.Mul'>與第一return語句和<class 'sympy.core.symbol.Symbol'>與第二個。也許這與它爲什麼不起作用有關,但我不知道如何?

我繪製的流線具有以下

import numpy as np 
import matplotlib.pyplot as plt 
import sympy 
from sympy.abc import x, y 

def uniform_flow_stream_function(U=1): 
    r = sympy.sqrt(x**2 + y**2) 
    theta = sympy.atan2(y, x) 
    return U * r * sympy.sin(theta) 

def velocity_field(psi): 
    u = sympy.lambdify((x, y), psi.diff(y), 'numpy') 
    v = sympy.lambdify((x, y), -psi.diff(x), 'numpy') 
    return u, v 

def plot_streamlines(ax, u, v, xlim=(-4, 4), ylim=(-4, 4)): 
    x0, x1 = xlim 
    y0, y1 = ylim 
    # create a grid of values 
    Y, X = np.ogrid[y0:y1:100j, x0:x1:100j] 
    ax.streamplot(X, Y, u(X, Y), v(X, Y), color='cornflowerblue') 

psi = uniform_flow_stream_function() 
u, v = velocity_field(psi) 
fig, ax = plt.subplots(figsize=(5, 5)) 

plot_streamlines(ax, u, v) 
plt.show() 

有人可以幫我明白爲什麼這不工作,我怎樣才能得到它的工作?謝謝!

+0

下一次:請使用代碼塊格式化回溯:這使得它更好地閱讀。 – Evert

回答

0

這不起作用的原因是因爲類別的差異。你的函數U * r * sympy.cos(theta)= y。這意味着你只返回一個y的函數。因此,您的-psi.diff(x)= 0,您得到一個整數v。

用1D數據繪製流線是不可能的。因此,爲了在2D中繪製流線,您必須在uniform_flow_stream_function中同時包含x和y。