2017-04-26 7 views
1

극좌표 플롯에서 회전하는 실린더 주변의 흐름의 속도 방정식을 플로트하려했습니다. (방정식은 Andersen의 "Fundamentals of Aerodynamics"에서 나온 것입니다.) for 루프 문에서 두 방정식을 볼 수 있습니다.극지 음모 Magnus 효과가 정확한 데이터를 표시하지 않음

큰 소리로 울부 짖는 소리에 대해 계산 된 데이터를 극좌표로 나타내지는 못합니다. 나는 내 생각을 다 해봤지만 아무 곳에도 도착하지 않았다. 나는 데이터를 확인했는데, 어떻게해야 제대로 작동하는지 알 수있다. 여기

내 마지막 시도의 코드 : 당신이 볼 수 있듯이, 나는 0으로 지금은 RPM을 설정 한

import numpy as np 
import matplotlib.pyplot as plt 


RadiusColumn = 1.0 
VelocityInfinity = 10.0 
RPM_Columns   = 0.0# 
ColumnOmega   = (2*np.pi*RPM_Columns)/(60)#rad/s 
VortexStrength  = 2*np.pi*RadiusColumn**2 * ColumnOmega#rad m^2/s 

NumberRadii = 6 
NumberThetas = 19 

theta = np.linspace(0,2*np.pi,NumberThetas) 
radius = np.linspace(RadiusColumn, 10 * RadiusColumn, NumberRadii) 


f = plt.figure() 
ax = f.add_subplot(111, polar=True) 

for r in xrange(len(radius)): 
    for t in xrange(len(theta)): 


     VelocityRadius = (1.0 - (RadiusColumn**2/radius[r]**2)) * VelocityInfinity * np.cos(theta[t]) 
     VelocityTheta = - (1.0 + (RadiusColumn**2/radius[r]**2))* VelocityInfinity * np.sin(theta[t]) - (VortexStrength/(2*np.pi*radius[r])) 
     TotalVelocity = np.linalg.norm((VelocityRadius, VelocityTheta)) 


     ax.quiver(theta[t], radius[r], theta[t] + VelocityTheta/TotalVelocity, radius[r] + VelocityRadius/TotalVelocity) 


plt.show() 

흐름이 왼쪽에서 오른쪽으로 이동하고를 통해 대칭해야한다는 것을 의미 수평축. (흐름은 양쪽 실린더 주위에 같은 방식으로 가야한다.) 결과는 그러나 더 이런 모습이 완료 넌센스입니다

Polar plot result - not correct!

. 설정이없는 경우에도 와도가있는 것처럼 보입니다! 0에서 pi/2까지의 데이터 만 표시 할 때도 더 이상하지 않습니다. 흐름이 ​​바뀝니다.

Polar plot result first quadrant - total mayhem

당신이 코드에서 볼 수 있듯이

, 내가 단위 벡터의 사용을 만들려고했지만 명확하게 갈 방법이 아니다. 유용한 입력에 감사드립니다.

감사합니다.

답변

1

기본적인 문제는 y를 자신 극성 Axes 개체의 .quiver 방법은 여전히 ​​X에 세타 및 방사형 구성 요소를 변환 할 필요가 직교 좌표계에서의 벡터 성분, 그래서 기대하는이고 :

for r in xrange(len(radius)): 
    for t in xrange(len(theta)): 

     VelocityRadius = (1.0 - (RadiusColumn**2/radius[r]**2)) * VelocityInfinity * np.cos(theta[t]) 
     VelocityTheta = - (1.0 + (RadiusColumn**2/radius[r]**2))* VelocityInfinity * np.sin(theta[t]) - (VortexStrength/(2*np.pi*radius[r])) 
     TotalVelocity = np.linalg.norm((VelocityRadius, VelocityTheta)) 

     ax.quiver(theta[t], radius[r], 
        VelocityRadius/TotalVelocity*np.cos(theta[t]) 
        - VelocityTheta/TotalVelocity*np.sin(theta[t]), 
        VelocityRadius/TotalVelocity*np.sin(theta[t]) 
        + VelocityTheta/TotalVelocity*np.cos(theta[t])) 

plt.show() 

fixed figure

그러나 벡터화를 사용하면 코드를 많이 향상시킬 수 있습니다. 필요한 것을 얻기 위해 각 포인트를 반복 할 필요가 없습니다. 그래서 코드의 상당하지만, 심지어 명확 :

def pol2cart(th,v_th,v_r): 
    '''convert polar velocity components to Cartesian, return v_x,v_y''' 

    return v_r*np.cos(th) - v_th*np.sin(th), v_r*np.sin(th) + v_th*np.cos(th) 


theta = np.linspace(0,2*np.pi,NumberThetas,endpoint=False) 
radius = np.linspace(RadiusColumn, 10 * RadiusColumn, NumberRadii)[:,None] 

f = plt.figure() 
ax = f.add_subplot(111, polar=True) 

VelocityRadius = (1.0 - (RadiusColumn**2/radius**2)) * VelocityInfinity * np.cos(theta) 
VelocityTheta = - (1.0 + (RadiusColumn**2/radius**2))* VelocityInfinity * np.sin(theta) - (VortexStrength/(2*np.pi*radius)) 
TotalVelocity = np.linalg.norm([VelocityRadius, VelocityTheta],axis=0) 

VelocityX,VelocityY = pol2cart(theta,VelocityTheta,VelocityRadius) 

ax.quiver(theta,radius, VelocityX/TotalVelocity, VelocityY/TotalVelocity) 

plt.show() 

fixed, vectorized final figure

몇몇 주목할만한 변화 :

  • 내가 thetaendpoint=False 추가 : 함수가 2*pi에서 주기적이기 때문에, 당신은 돈 ' 끝점을 두 번 플롯해야합니다. 즉, 현재는 이 표시되고 화살표가 있음을 의미합니다. 원래의 동작을 원하면 NumberThetas을 하나 줄이는 것이 좋습니다.
  • [:,None] ~ radius을 추가했습니다. 이렇게하면 2 차원 배열이됩니다. 속도의 정의에서 나중에 연산을 수행하면 2 차원 배열이 생깁니다. 각기 다른 기둥이 다른 각도에 해당하고, 다른 행은 다른 반지름에 해당합니다. quiver은 배열 값 입력과 호환되므로 quiver을 한 번 호출하면 작업이 완료됩니다.
  • 속도가 2 차원 배열이기 때문에 기본적으로 3 차원 배열에서 np.linalg.norm을 호출해야합니다. 그러나 작업 할 축을 지정하면 예상대로 작동합니다.
  • 극좌표에서 데카르트 구성 요소로의 변환을 수행하는 보조 함수를 pol2cart으로 정의했습니다. 이것은 필요하지 않지만이 방법으로 나에게 더 분명 해 보인다.

최종 설명 : 짧은 변수 이름과 CamelCase가없는 변수 이름을 선택하는 것이 좋습니다. 아마도 코딩 속도도 빨라질 것입니다.

+1

와우! 고마워, 이거 멋지다! 나는 너의 제안을 시험해 볼 것이다. 덧붙여 말하지만, 변수 이름을 쓰는 데 더 많은 시간이 필요하다는 것에 동의하지만 개인적으로는 코드가 10 배 더 명확 해집니다. 1 년 후, 나는 이것을 읽고 그것은 이야기를 읽는 것과 같을 것이다. 편지 변인은 나를 위해 상당히 성가 셨습니다. 어쨌든, 다시 한번 감사드립니다. – user3604362