2017-10-19 1 views
0

파이썬으로 간소화 혼란스러워. I는 다음 this guide하고 .. 플로팅 난 그냥 파이썬 함께 밖으로 시작하고 그래서 내가 조금 해요</p> <p>기본 잠재적 인 흐름 (유니폼, 소스/싱크, 소용돌이 등)에 대한 유선 및 속도 잠재력을 플롯하려고

제가

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 U * r * sympy.cos(theta) 

에 return 문을 변경할 때 나는 반환 객체의 형태를 확인

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 문 및 <class 'sympy.core.symbol.Symbol'>와와 <class 'sympy.core.mul.Mul'>입니다 두 번째 것. 아마 이것이 작동하지 않는 이유와 관련이 있을지 모르지만 어떻게 확신 할 수 없습니까?

내가 가진 유선을 플롯

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를 둘 다 가져야합니다.

관련 문제