I’m trying to plot an airfoil from the formula as described on this wikipedia page.
This Jupyter notebook can be viewed on this github page.
%matplotlib inline import math import matplotlib.pyplot as pyplot def frange( start, stop, step ): yield start while start <= stop: start += step yield start #https://en.wikipedia.org/wiki/NACA_airfoil#Equation_for_a_cambered_4-digit_NACA_airfoil def camber_line( x, m, p, c ): if 0 <= x <= c * p: yc = m * (x / math.pow(p,2)) * (2 * p - (x / c)) #elif p * c <= x <= c: else: yc = m * ((c - x) / math.pow(1-p,2)) * (1 + (x / c) - 2 * p ) return yc def dyc_over_dx( x, m, p, c ): if 0 <= x <= c * p: dyc_dx = ((2 * m) / math.pow(p,2)) * (p - x / c) #elif p * c <= x <= c: else: dyc_dx = ((2 * m ) / math.pow(1-p,2)) * (p - x / c ) return dyc_dx def thickness( x, t, c ): term1 = 0.2969 * (math.sqrt(x/c)) term2 = -0.1260 * (x/c) term3 = -0.3516 * math.pow(x/c,2) term4 = 0.2843 * math.pow(x/c,3) term5 = -0.1015 * math.pow(x/c,4) return 5 * t * c * (term1 + term2 + term3 + term4 + term5) def naca4( m, p, t, c=1 ): for x in frange( 0, 1.0, 0.01 ): dyc_dx = dyc_over_dx( x, m, p, c ) th = math.atan( dyc_dx ) yt = thickness( x, t, c ) yc = camber_line( x, m, p, c ) xu = x - yt * math.sin(th) xl = x + yt * math.sin(th) yu = yc + yt * math.cos(th) yl = yc - yt * math.cos(th) yield (xu, yu), (xl, yl) #naca2412 m = 0.02 p = 0.4 t = 12 naca4points = naca4( m, p, t ) for (xu,yu),(xl,yl) in naca4points: pyplot.plot( xu, yu, 'r,') pyplot.plot( xl, yl, 'r,') pyplot.ylabel('y') pyplot.xlabel('x') pyplot.axis('equal') figure = pyplot.gcf() figure.set_size_inches(16,16,forward=True)
I expected it to look more like .
Questions: Why is the line not completely smooth? There seems to be a discontinuity where the beginning and end meet. Why does it not look like the diagram on wikipedia? How do I remove the extra loop at the trailing edge? How do I fix the chord so that it runs from 0.0 to 1.0?
Advertisement
Answer
First, t
should be 0.12
not 12
. Second, to make a smoother plot, increase the sample points.
It is also a good idea to use vectorize method in numpy
:
%matplotlib inline import math import matplotlib.pyplot as plt import numpy as np #https://en.wikipedia.org/wiki/NACA_airfoil#Equation_for_a_cambered_4-digit_NACA_airfoil def camber_line( x, m, p, c ): return np.where((x>=0)&(x<=(c*p)), m * (x / np.power(p,2)) * (2.0 * p - (x / c)), m * ((c - x) / np.power(1-p,2)) * (1.0 + (x / c) - 2.0 * p )) def dyc_over_dx( x, m, p, c ): return np.where((x>=0)&(x<=(c*p)), ((2.0 * m) / np.power(p,2)) * (p - x / c), ((2.0 * m ) / np.power(1-p,2)) * (p - x / c )) def thickness( x, t, c ): term1 = 0.2969 * (np.sqrt(x/c)) term2 = -0.1260 * (x/c) term3 = -0.3516 * np.power(x/c,2) term4 = 0.2843 * np.power(x/c,3) term5 = -0.1015 * np.power(x/c,4) return 5 * t * c * (term1 + term2 + term3 + term4 + term5) def naca4(x, m, p, t, c=1): dyc_dx = dyc_over_dx(x, m, p, c) th = np.arctan(dyc_dx) yt = thickness(x, t, c) yc = camber_line(x, m, p, c) return ((x - yt*np.sin(th), yc + yt*np.cos(th)), (x + yt*np.sin(th), yc - yt*np.cos(th))) #naca2412 m = 0.02 p = 0.4 t = 0.12 c = 1.0 x = np.linspace(0,1,200) for item in naca4(x, m, p, t, c): plt.plot(item[0], item[1], 'b') plt.plot(x, camber_line(x, m, p, c), 'r') plt.axis('equal') plt.xlim((-0.05, 1.05)) # figure.set_size_inches(16,16,forward=True)