使用 python 绘制流线图
plotting streamlines with python
我正在尝试绘制基本势流(均匀、source/sink、涡流等)的流线和速度势
我刚开始使用 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'
我检查了 return 对象的类型,第一个 return 语句是 <class 'sympy.core.mul.Mul'>
,第二个是 <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()
有人可以帮助我理解为什么这不起作用以及我如何让它起作用吗?谢谢!
这不起作用的原因是 class 差异。你的函数 U * r * sympy.cos(theta)=y。这意味着您要返回一个只有 y 的函数。因此你的 -psi.diff(x)=0 你得到一个整数 v.
一维数据无法绘制流线图。因此,为了在 2D 中绘制流线图,您必须在 uniform_flow_stream_function
中同时包含 x 和 y。
我正在尝试绘制基本势流(均匀、source/sink、涡流等)的流线和速度势
我刚开始使用 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'
我检查了 return 对象的类型,第一个 return 语句是 <class 'sympy.core.mul.Mul'>
,第二个是 <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()
有人可以帮助我理解为什么这不起作用以及我如何让它起作用吗?谢谢!
这不起作用的原因是 class 差异。你的函数 U * r * sympy.cos(theta)=y。这意味着您要返回一个只有 y 的函数。因此你的 -psi.diff(x)=0 你得到一个整数 v.
一维数据无法绘制流线图。因此,为了在 2D 中绘制流线图,您必须在 uniform_flow_stream_function
中同时包含 x 和 y。