【问题标题】:plotting streamlines with python用python绘制流线
【发布时间】:2017-10-19 00:29:00
【问题描述】:

我正在尝试绘制基本势流(均匀、源/汇、涡流等)的流线和速度势

我刚刚开始使用 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'

我检查了返回对象的类型,第一个返回语句为&lt;class 'sympy.core.mul.Mul'&gt;,第二个返回语句为&lt;class 'sympy.core.symbol.Symbol'&gt;。也许这与它为什么不起作用有关,但我不确定如何?

我用以下方式绘制流线

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()

有人可以帮我理解为什么这不起作用以及如何让它起作用吗?谢谢!

【问题讨论】:

  • 下一次:请用代码块格式化回溯:这样可以更好地阅读。

标签: python matplotlib sympy python-3.6 fluid-dynamics


【解决方案1】:

这不起作用的原因是因为阶级差异。你的函数 U * r * sympy.cos(theta)=y。这意味着您返回的函数只有 y。因此,您的 -psi.diff(x)=0 会得到 v 的整数。

用一维数据绘制流线是不可能的。因此,为了在 2D 中绘制流线,您必须在 uniform_flow_stream_function 中同时包含 x 和 y。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-08
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多