├── notebooks ├── batch_bezier.txt ├── naca0012.txt └── example_01.ipynb ├── README.md ├── setup.py ├── pyfoil ├── xfoil.py └── parametric_airfoil.py ├── simple-quadratic-bezier-curve-example.py ├── composite-quadratic-bezier-curve-airfoil-example.py └── LICENSE /notebooks/batch_bezier.txt: -------------------------------------------------------------------------------- 1 | LOAD 2 | airfoil.txt 3 | 4 | oper 5 | visc 1000000 6 | pacc 7 | pacc_results.txt 8 | 9 | alfa 0 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # aerodynamic-shape-optimization 2 | 3 | ### Installation 4 | ```sh 5 | pip install git+https://github.com/nathanrooy/aerodynamic-shape-optimization 6 | ``` 7 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | 2 | from setuptools import setup 3 | 4 | with open("README.md", "r") as fh: 5 | long_description = fh.read() 6 | 7 | setup( 8 | name='pyfoil', 9 | version='0.0.1', 10 | author='Nathan A. Rooy', 11 | author_email='nathanrooy@gmail.com', 12 | url='https://github.com/nathanrooy/aerodynamic-shape-optimization', 13 | description='A Python library for 2D airfoil analysis and shape optimization', 14 | long_description=long_description, 15 | long_description_content_type="text/markdown", 16 | packages=['pyfoil'], 17 | python_requires='>=3.5', 18 | classifiers=[ 19 | 'Programming Language :: Python :: 3', 20 | 'License :: OSI Approved :: MIT License', 21 | 'Operating System :: OS Independent' 22 | ] 23 | ) 24 | -------------------------------------------------------------------------------- /pyfoil/xfoil.py: -------------------------------------------------------------------------------- 1 | #--- IMPORT DEPENDENCIES ------------------------------------------------------+ 2 | 3 | import os 4 | 5 | #--- FUNCTIONS ----------------------------------------------------------------+ 6 | 7 | def run_xfoil(): 8 | 9 | # run xfoil 10 | os.system('xfoil < batch_bezier.txt') 11 | 12 | # read in results 13 | results_dict = read_xfoil_pacc_file('pacc_results.txt') 14 | 15 | # reset files 16 | os.system('rm -rf pacc_results.txt') 17 | 18 | return results_dict 19 | 20 | 21 | def read_xfoil_pacc_file(file_name): 22 | with open(file_name) as f: 23 | for i, row in enumerate(f.readlines()): 24 | if i == 12: 25 | results = [item for item in row.replace('\n','').split(' ') if item != ''] 26 | return { 27 | 'alpha':float(results[0]), 28 | 'cl':float(results[1]), 29 | 'cd':float(results[2]), 30 | 'cd_p':float(results[3]), 31 | 'cm':float(results[4]), 32 | 'top_xtr':float(results[5]), 33 | 'bot_xtr':float(results[6]) 34 | } 35 | 36 | 37 | #--- EXAMPLE RUN --------------------------------------------------------------+ 38 | 39 | #print(run_xfoil()) 40 | 41 | #--- END ----------------------------------------------------------------------+ 42 | -------------------------------------------------------------------------------- /simple-quadratic-bezier-curve-example.py: -------------------------------------------------------------------------------- 1 | #------------------------------------------------------------------------------+ 2 | # 3 | # Nathan A. Rooy 4 | # Simple Quadratic Bezier Curve Example 5 | # 2015-08-12 6 | # 7 | #------------------------------------------------------------------------------+ 8 | 9 | #--- IMPORT DEPENDENCIES ------------------------------------------------------+ 10 | 11 | from __future__ import division 12 | import numpy as np 13 | 14 | #--- MAIN ---------------------------------------------------------------------+ 15 | 16 | numPts=20 # number of points in Bezier Curve 17 | controlPts=[[0,0],[0.5,1],[1,0]] # control points 18 | t=np.array([i*1/numPts for i in range(0,numPts+1)]) 19 | 20 | B_x=(1-t)*((1-t)*controlPts[0][0]+t*controlPts[1][0])+t*((1-t)*controlPts[1][0]+t*controlPts[2][0]) 21 | B_y=(1-t)*((1-t)*controlPts[0][1]+t*controlPts[1][1])+t*((1-t)*controlPts[1][1]+t*controlPts[2][1]) 22 | 23 | #--- PLOT ---------------------------------------------------------------------+ 24 | 25 | from pylab import * 26 | xPts,yPts=zip(*controlPts) 27 | plot(B_x,B_y,'b',label='Bezier Curve') 28 | plot(xPts,yPts,color='#666666',) 29 | plot(xPts,yPts,'o',mfc='none',mec='r',markersize=8,label='Control Points') 30 | plt.title('Quadratic Bezier Curve') 31 | plt.xlim(-0.1,1.1) 32 | plt.ylim(-0.1,1.1) 33 | plt.legend(loc=1,fontsize=12) 34 | plt.savefig('01-basic-quadratic-bezier-curve.png',dpi=100) 35 | plt.show() 36 | 37 | #--- END ----------------------------------------------------------------------+ 38 | -------------------------------------------------------------------------------- /composite-quadratic-bezier-curve-airfoil-example.py: -------------------------------------------------------------------------------- 1 | #------------------------------------------------------------------------------+ 2 | # 3 | # Nathan A. Rooy 4 | # Composite Quadratic Bezier Curve Example (Airfoil) 5 | # 2015-08-12 6 | # 7 | #------------------------------------------------------------------------------+ 8 | 9 | #--- IMPORT DEPENDENCIES ------------------------------------------------------+ 10 | 11 | from __future__ import division 12 | import numpy as np 13 | 14 | #--- MAIN ---------------------------------------------------------------------+ 15 | 16 | def quadraticBezier(t,points): 17 | B_x=(1-t)*((1-t)*points[0][0]+t*points[1][0])+t*((1-t)*points[1][0]+t*points[2][0]) 18 | B_y=(1-t)*((1-t)*points[0][1]+t*points[1][1])+t*((1-t)*points[1][1]+t*points[2][1]) 19 | return B_x,B_y 20 | 21 | def airfoil(ctlPts,numPts,write): 22 | curve=[] 23 | t=np.array([i*1/numPts for i in range(0,numPts)]) 24 | 25 | # calculate first Bezier curve 26 | midX=(ctlPts[1][0]+ctlPts[2][0])/2 27 | midY=(ctlPts[1][1]+ctlPts[2][1])/2 28 | B_x,B_y=quadraticBezier(t,[ctlPts[0],ctlPts[1],[midX,midY]]) 29 | curve=curve+zip(B_x,B_y) 30 | 31 | # calculate middle Bezier Curves 32 | for i in range(1,len(ctlPts)-3): 33 | p0=ctlPts[i] 34 | p1=ctlPts[i+1] 35 | p2=ctlPts[i+2] 36 | midX_1=(ctlPts[i][0]+ctlPts[i+1][0])/2 37 | midY_1=(ctlPts[i][1]+ctlPts[i+1][1])/2 38 | midX_2=(ctlPts[i+1][0]+ctlPts[i+2][0])/2 39 | midY_2=(ctlPts[i+1][1]+ctlPts[i+2][1])/2 40 | 41 | B_x,B_y=quadraticBezier(t,[[midX_1,midY_1],ctlPts[i+1],[midX_2,midY_2]]) 42 | curve=curve+zip(B_x,B_y) 43 | 44 | # calculate last Bezier curve 45 | midX=(ctlPts[-3][0]+ctlPts[-2][0])/2 46 | midY=(ctlPts[-3][1]+ctlPts[-2][1])/2 47 | 48 | B_x,B_y=quadraticBezier(t,[[midX,midY],ctlPts[-2],ctlPts[-1]]) 49 | curve=curve+zip(B_x,B_y) 50 | curve.append(ctlPts[-1]) 51 | 52 | # write airfoil coordinates to text file 53 | if write: 54 | xPts,yPts=zip(*curve) 55 | f=open('airfoilCoords.txt','wa') 56 | for i in range(len(xPts)): 57 | f.write(str(xPts[i])+','+str(yPts[i])+'\n') 58 | f.close() 59 | 60 | return curve 61 | 62 | #--- 11 CONTROL POINT AIRFOIL EXAMPLE -----------------------------------------+ 63 | 64 | points=[[1,0.001], # trailing edge (top) 65 | [0.76,0.08], 66 | [0.52,0.125], 67 | [0.25,0.12], 68 | [0.1,0.08], 69 | [0,0.03], # leading edge (top) 70 | [0,-0.03], # leading edge (bottom) 71 | [0.15,-0.08], 72 | [0.37,-0.01], 73 | [0.69,0.04], 74 | [1,-0.001]] # trailing edge (bottom) 75 | 76 | #--- RUN EXAMPLE --------------------------------------------------------------+ 77 | 78 | curve=airfoil(points,16,write=True) # pick even number of points so that the leading edge is defined by a single point... 79 | 80 | #--- PLOT ---------------------------------------------------------------------+ 81 | 82 | from pylab import * 83 | import matplotlib.pyplot as plt 84 | 85 | xPts,yPts=zip(*points) 86 | xPts2,yPts2=zip(*curve) 87 | plot(xPts2,yPts2,'b') 88 | plot(xPts,yPts,color='#666666') 89 | plot(xPts,yPts,'o',mfc='none',mec='r',markersize=8) 90 | plt.title('Composite Quadratic Bezier Curve Based Airfoil') 91 | plt.xlim(-0.05,1.05) 92 | plt.ylim(-0.55,0.55) 93 | ##plt.savefig('airfoil-final.png',dpi=72) 94 | plt.show() 95 | 96 | #--- END ----------------------------------------------------------------------+ 97 | -------------------------------------------------------------------------------- /pyfoil/parametric_airfoil.py: -------------------------------------------------------------------------------- 1 | #------------------------------------------------------------------------------+ 2 | # 3 | # Nathan A. Rooy 4 | # Functions for parameterizing 2D airfoils via Bezier Curves 5 | # 2020-01-24 6 | # 7 | #------------------------------------------------------------------------------+ 8 | 9 | #--- IMPORT DEPENDENCIES ------------------------------------------------------+ 10 | 11 | import numpy as np 12 | from math import pi 13 | from math import sqrt 14 | 15 | #--- MAIN ---------------------------------------------------------------------+ 16 | 17 | def get_t(x, ctlPts): 18 | 19 | # given x, solve for t 20 | a = ctlPts[0][0] 21 | b = ctlPts[1][0] 22 | c = ctlPts[2][0] 23 | 24 | d = abs(c*x + x*a - 2*x*b + b**2 - c*a) 25 | t_0 = (a - b + sqrt(d)) / (c + a - 2*b) 26 | t_1 = (a - b - sqrt(d)) / (c + a - 2*b) 27 | 28 | # determine which root to return 29 | roots = np.array([t_0, t_1]) 30 | t = roots[np.where((np.abs(roots) <= 1.0001) & (np.abs(roots) >= 0))][0] 31 | 32 | # rounding error is annoying... 33 | if t > 1: t = 1 34 | return t 35 | 36 | 37 | def quadratic_bezier(t, ctlPts): 38 | y =(1-t)*((1-t)*ctlPts[0][1]+t*ctlPts[1][1])+t*((1-t)*ctlPts[1][1]+t*ctlPts[2][1]) 39 | return y 40 | 41 | 42 | 43 | def bezier_airfoil(x_coords, ctlPts): 44 | 45 | # cycle through control points 46 | curve=[] 47 | total_pts = len(ctlPts) 48 | for i in range(0, len(ctlPts)-1): 49 | 50 | # calculate first bezier curve 51 | if i==0: 52 | x_mid = (ctlPts[1][0]+ctlPts[2][0])/2 53 | y_mid = (ctlPts[1][1]+ctlPts[2][1])/2 54 | x_clip = sorted(x_coords[np.where(x_coords > x_mid)], reverse=True) 55 | x_bezier = [get_t(item, [ctlPts[0],ctlPts[1],[x_mid, y_mid]]) for item in x_clip] 56 | y = quadratic_bezier(np.asarray(x_bezier), [ctlPts[0],ctlPts[1],[x_mid,y_mid]]) 57 | curve.append(ctlPts[0]) # append top trailing edge point 58 | curve=curve+list(zip(x_clip ,y)) 59 | 60 | # calculate middle bezier curves 61 | if i>=1 and i x_mid2: x_clip = sorted(x_coords[(x_coords > x_mid2) & (x_coords <= x_mid1)], reverse=True) 69 | if x_mid1 < x_mid2: x_clip = sorted(x_coords[(x_coords < x_mid2) & (x_coords >= x_mid1)], reverse=False) 70 | 71 | x_bezier = [get_t(item, [[x_mid1, y_mid1], ctlPts[i+1], [x_mid2, y_mid2]]) for item in x_clip] 72 | y = quadratic_bezier(np.asarray(x_bezier), [[x_mid1,y_mid1],ctlPts[i+1],[x_mid2,y_mid2]]) 73 | curve=curve+list(zip(x_clip, y)) 74 | 75 | # calculate last bezier curve 76 | if i==total_pts-2: 77 | x_mid=(ctlPts[-3][0]+ctlPts[-2][0])/2 78 | y_mid=(ctlPts[-3][1]+ctlPts[-2][1])/2 79 | x_clip = sorted(x_coords[x_coords > x_mid], reverse=False) 80 | x_bezier = [get_t(item, [[x_mid, y_mid],ctlPts[-2],ctlPts[-1]]) for item in x_clip] 81 | y = quadratic_bezier(np.asarray(x_bezier), [[x_mid, y_mid],ctlPts[-2],ctlPts[-1]]) 82 | curve=curve+list(zip(x_clip, y)) 83 | curve.append(ctlPts[-1]) # append bottom trailing edge point 84 | 85 | # geo check 86 | # 1) make sure leading edge is [0,0] 87 | return curve 88 | 89 | 90 | def munge_ctlpts(cps, n_top, n_bot): 91 | ''' 92 | Munge the outputs from a given optimizer into a form that's suitable 93 | for the bezier function 94 | 95 | x = [le_radius, px1, py1, px2, py2,...,pxn, pyn] 96 | ''' 97 | assert len(cps) % 2 == 1, 'The number of inputs must be odd because each control point has 2 points associated with it, plus a leading edge radius' 98 | 99 | te_half_thickness = 0.001260 100 | te_top = [1, te_half_thickness] 101 | te_bot = [1,-te_half_thickness] 102 | le_x = 0 103 | 104 | le_radius = cps[0] 105 | 106 | ctlpts = [] 107 | ctlpts.append(te_top) 108 | for i in range(1, n_top * 2 + 1, 2): 109 | ctlpts.append([cps[i], cps[i+1]]) 110 | 111 | ctlpts.append([le_x, le_radius]) 112 | ctlpts.append([le_x, -le_radius]) 113 | 114 | for i in range(n_top * 2 + 1, len(cps), 2): 115 | ctlpts.append([cps[i], cps[i+1]]) 116 | 117 | ctlpts.append(te_bot) 118 | 119 | return ctlpts 120 | 121 | -------------------------------------------------------------------------------- /notebooks/naca0012.txt: -------------------------------------------------------------------------------- 1 | 1.000000 0.001260 2 | 0.990000 0.002654 3 | 0.980000 0.004032 4 | 0.970000 0.005393 5 | 0.960000 0.006737 6 | 0.950000 0.008066 7 | 0.940000 0.009378 8 | 0.930000 0.010676 9 | 0.920000 0.011958 10 | 0.910000 0.013225 11 | 0.900000 0.014477 12 | 0.890000 0.015715 13 | 0.880000 0.016939 14 | 0.870000 0.018148 15 | 0.860000 0.019344 16 | 0.850000 0.020526 17 | 0.840000 0.021694 18 | 0.830000 0.022848 19 | 0.820000 0.023989 20 | 0.810000 0.025117 21 | 0.800000 0.026231 22 | 0.790000 0.027332 23 | 0.780000 0.028420 24 | 0.770000 0.029494 25 | 0.760000 0.030555 26 | 0.750000 0.031603 27 | 0.740000 0.032637 28 | 0.730000 0.033658 29 | 0.720000 0.034666 30 | 0.710000 0.035659 31 | 0.700000 0.036639 32 | 0.690000 0.037605 33 | 0.680000 0.038557 34 | 0.670000 0.039494 35 | 0.660000 0.040417 36 | 0.650000 0.041325 37 | 0.640000 0.042218 38 | 0.630000 0.043096 39 | 0.620000 0.043958 40 | 0.610000 0.044804 41 | 0.600000 0.045634 42 | 0.590000 0.046447 43 | 0.580000 0.047243 44 | 0.570000 0.048021 45 | 0.560000 0.048782 46 | 0.550000 0.049524 47 | 0.540000 0.050248 48 | 0.530000 0.050951 49 | 0.520000 0.051635 50 | 0.510000 0.052298 51 | 0.500000 0.052940 52 | 0.490000 0.053560 53 | 0.480000 0.054158 54 | 0.470000 0.054732 55 | 0.460000 0.055282 56 | 0.450000 0.055807 57 | 0.440000 0.056307 58 | 0.430000 0.056780 59 | 0.420000 0.057225 60 | 0.410000 0.057643 61 | 0.400000 0.058030 62 | 0.390000 0.058387 63 | 0.380000 0.058712 64 | 0.370000 0.059005 65 | 0.360000 0.059263 66 | 0.350000 0.059486 67 | 0.340000 0.059672 68 | 0.330000 0.059820 69 | 0.320000 0.059928 70 | 0.310000 0.059994 71 | 0.300000 0.060017 72 | 0.290000 0.059995 73 | 0.280000 0.059926 74 | 0.270000 0.059807 75 | 0.260000 0.059637 76 | 0.250000 0.059412 77 | 0.240000 0.059131 78 | 0.230000 0.058790 79 | 0.220000 0.058386 80 | 0.210000 0.057916 81 | 0.200000 0.057375 82 | 0.190000 0.056760 83 | 0.180000 0.056066 84 | 0.170000 0.055287 85 | 0.160000 0.054418 86 | 0.150000 0.053452 87 | 0.140000 0.052380 88 | 0.130000 0.051193 89 | 0.120000 0.049882 90 | 0.110000 0.048432 91 | 0.100000 0.046828 92 | 0.090000 0.045050 93 | 0.080000 0.043072 94 | 0.070000 0.040863 95 | 0.060000 0.038376 96 | 0.050000 0.035547 97 | 0.040000 0.032277 98 | 0.030000 0.028401 99 | 0.020000 0.023598 100 | 0.010000 0.017037 101 | 0.000000 0.000000 102 | 0.010000 -0.017037 103 | 0.020000 -0.023598 104 | 0.030000 -0.028401 105 | 0.040000 -0.032277 106 | 0.050000 -0.035547 107 | 0.060000 -0.038376 108 | 0.070000 -0.040863 109 | 0.080000 -0.043072 110 | 0.090000 -0.045050 111 | 0.100000 -0.046828 112 | 0.110000 -0.048432 113 | 0.120000 -0.049882 114 | 0.130000 -0.051193 115 | 0.140000 -0.052380 116 | 0.150000 -0.053452 117 | 0.160000 -0.054418 118 | 0.170000 -0.055287 119 | 0.180000 -0.056066 120 | 0.190000 -0.056760 121 | 0.200000 -0.057375 122 | 0.210000 -0.057916 123 | 0.220000 -0.058386 124 | 0.230000 -0.058790 125 | 0.240000 -0.059131 126 | 0.250000 -0.059412 127 | 0.260000 -0.059637 128 | 0.270000 -0.059807 129 | 0.280000 -0.059926 130 | 0.290000 -0.059995 131 | 0.300000 -0.060017 132 | 0.310000 -0.059994 133 | 0.320000 -0.059928 134 | 0.330000 -0.059820 135 | 0.340000 -0.059672 136 | 0.350000 -0.059486 137 | 0.360000 -0.059263 138 | 0.370000 -0.059005 139 | 0.380000 -0.058712 140 | 0.390000 -0.058387 141 | 0.400000 -0.058030 142 | 0.410000 -0.057643 143 | 0.420000 -0.057225 144 | 0.430000 -0.056780 145 | 0.440000 -0.056307 146 | 0.450000 -0.055807 147 | 0.460000 -0.055282 148 | 0.470000 -0.054732 149 | 0.480000 -0.054158 150 | 0.490000 -0.053560 151 | 0.500000 -0.052940 152 | 0.510000 -0.052298 153 | 0.520000 -0.051635 154 | 0.530000 -0.050951 155 | 0.540000 -0.050248 156 | 0.550000 -0.049524 157 | 0.560000 -0.048782 158 | 0.570000 -0.048021 159 | 0.580000 -0.047243 160 | 0.590000 -0.046447 161 | 0.600000 -0.045634 162 | 0.610000 -0.044804 163 | 0.620000 -0.043958 164 | 0.630000 -0.043096 165 | 0.640000 -0.042218 166 | 0.650000 -0.041325 167 | 0.660000 -0.040417 168 | 0.670000 -0.039494 169 | 0.680000 -0.038557 170 | 0.690000 -0.037605 171 | 0.700000 -0.036639 172 | 0.710000 -0.035659 173 | 0.720000 -0.034666 174 | 0.730000 -0.033658 175 | 0.740000 -0.032637 176 | 0.750000 -0.031603 177 | 0.760000 -0.030555 178 | 0.770000 -0.029494 179 | 0.780000 -0.028420 180 | 0.790000 -0.027332 181 | 0.800000 -0.026231 182 | 0.810000 -0.025117 183 | 0.820000 -0.023989 184 | 0.830000 -0.022848 185 | 0.840000 -0.021694 186 | 0.850000 -0.020526 187 | 0.860000 -0.019344 188 | 0.870000 -0.018148 189 | 0.880000 -0.016939 190 | 0.890000 -0.015715 191 | 0.900000 -0.014477 192 | 0.910000 -0.013225 193 | 0.920000 -0.011958 194 | 0.930000 -0.010676 195 | 0.940000 -0.009378 196 | 0.950000 -0.008066 197 | 0.960000 -0.006737 198 | 0.970000 -0.005393 199 | 0.980000 -0.004032 200 | 0.990000 -0.002654 201 | 1.000000 -0.001260 202 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | {one line to give the program's name and a brief idea of what it does.} 635 | Copyright (C) {year} {name of author} 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | {project} Copyright (C) {year} {fullname} 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /notebooks/example_01.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Example 01 - Maximize C_l / C_d\n", 8 | "- pyfoil: https://github.com/nathanrooy/aerodynamic-shape-optimization\n", 9 | "- simulated annealing: https://github.com/nathanrooy/simulated-annealing" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 1, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "from scipy.optimize import minimize\n", 19 | "from simulated_annealing import sa\n", 20 | "from pso import pso_simple\n", 21 | "from matplotlib import pyplot as plt\n", 22 | "\n", 23 | "from pyfoil.parametric_airfoil import *\n", 24 | "from pyfoil.xfoil import *" 25 | ] 26 | }, 27 | { 28 | "cell_type": "code", 29 | "execution_count": 2, 30 | "metadata": {}, 31 | "outputs": [], 32 | "source": [ 33 | "# lets read in the naca0012 airfoil geometry\n", 34 | "target_airfoil = []\n", 35 | "with open('naca0012.txt','r') as foil_txt:\n", 36 | " for i, row in enumerate(foil_txt.readlines()):\n", 37 | " if len(row.split())==2: \n", 38 | " x, y = row.split()\n", 39 | " target_airfoil.append([float(x), float(y)]) \n", 40 | " \n", 41 | "target_airfoil = np.asarray(target_airfoil)" 42 | ] 43 | }, 44 | { 45 | "cell_type": "code", 46 | "execution_count": 3, 47 | "metadata": {}, 48 | "outputs": [], 49 | "source": [ 50 | "# reverse fit the parametric airfoil to the naca0012\n", 51 | "xpts = np.linspace(0,0.99,100)\n", 52 | "initial_airfoil = [0.03, 0.76, 0.08, 0.48, 0.13, 0.15, 0.12, 0.15, -0.08, 0.37, -0.01, 0.69, 0.04]" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 4, 58 | "metadata": {}, 59 | "outputs": [], 60 | "source": [ 61 | "# create cost function\n", 62 | "def shape_match(control_pts, xpts=xpts, ta=target_airfoil):\n", 63 | " ca = np.array(bezier_airfoil(xpts, munge_ctlpts(control_pts, 3, 3)))\n", 64 | " try:\n", 65 | " return 1000 * np.sum(abs(ca[:,0] - ta[:,0]) + abs(ca[:,1] - ta[:,1]))\n", 66 | " except:\n", 67 | " return 1e10" 68 | ] 69 | }, 70 | { 71 | "cell_type": "code", 72 | "execution_count": 5, 73 | "metadata": {}, 74 | "outputs": [ 75 | { 76 | "name": "stdout", 77 | "output_type": "stream", 78 | "text": [ 79 | "Optimization terminated successfully.\n", 80 | " Current function value: 31.505106\n", 81 | " Iterations: 65\n", 82 | " Function evaluations: 37541\n" 83 | ] 84 | } 85 | ], 86 | "source": [ 87 | "# minimize this thing\n", 88 | "res = minimize(shape_match, initial_airfoil, method='Powell', tol=1e-10, options={'disp': True, 'maxiter':10000})" 89 | ] 90 | }, 91 | { 92 | "cell_type": "code", 93 | "execution_count": 6, 94 | "metadata": {}, 95 | "outputs": [ 96 | { 97 | "data": { 98 | "text/plain": [ 99 | "31.50510557112153" 100 | ] 101 | }, 102 | "execution_count": 6, 103 | "metadata": {}, 104 | "output_type": "execute_result" 105 | } 106 | ], 107 | "source": [ 108 | "res.fun" 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": 7, 114 | "metadata": {}, 115 | "outputs": [ 116 | { 117 | "data": { 118 | "text/plain": [ 119 | "array([ 0.02421917, 0.85743828, 0.02209078, 0.44159938, 0.06038287,\n", 120 | " 0.15018644, 0.05948909, 0.11880418, -0.05293774, 0.31333506,\n", 121 | " -0.06417121, 0.71570799, -0.03953462])" 122 | ] 123 | }, 124 | "execution_count": 7, 125 | "metadata": {}, 126 | "output_type": "execute_result" 127 | } 128 | ], 129 | "source": [ 130 | "res.x" 131 | ] 132 | }, 133 | { 134 | "cell_type": "code", 135 | "execution_count": 8, 136 | "metadata": {}, 137 | "outputs": [ 138 | { 139 | "data": { 140 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0EAAAD4CAYAAAAq0O35AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOzdebSdV33m+e8+8zzec86dB0mW5XlAtgUmECYD1cHACgSSdIBKOiw6RWeoTq8iVLogpDrLVZUODQm0iw7JghQJSUgRCBkoHMxkIFgewKNsDXeezzxP7+4/7rWRLMmWpStdSff5LM465z3v3u/5vdcXrfucvd/9GmstIiIiIiIiO4VruwsQERERERG5kBSCRERERERkR1EIEhERERGRHUUhSEREREREdhSFIBERERER2VEUgkREREREZEfZkhBkjHmDMeaQMeawMeYDp9j/CmPMg8aYnjHmbc/Z1zfGPLz5+PJW1CMiIiIiInI65lzvE2SMcQNPAa8D5oH7gZ+11j5+XJtJIAb8JvBla+0XjttXs9ZGzqkIERERERGRM+TZgmPcChy21h4FMMZ8Hngz8GwIstZOb+5ztuDzREREREREztpWTIcbAeaO257ffO9MBYwxB40x3zfGvGUL6hERERERETmtrRgJOlcT1toFY8wu4OvGmEestUee28gY817gvQDhcPgl+/btu9B1ioiIiIjIJeKBBx5Yt9ZmTrVvK0LQAjB23Pbo5ntnxFq7sPl81BjzDeAm4KQQZK39FPApgP3799uDBw+eQ8kiIiIiInI5M8bMnG7fVkyHux+4whgzZYzxAe8EzmiVN2NM0hjj33w9ANzOcdcSiYiIiIiIbLVzDkHW2h7wfuCrwBPAX1lrHzPGfMQYcyeAMeYWY8w88HbgvxpjHtvsfhVw0BjzQ+Be4K7jV5UTERERERHZaue8RPZ20HQ4ERERERF5PsaYB6y1+0+172JYGEFERERERM5Ct9tlfn6eVqu13aVsm0AgwOjoKF6v94z7KASJiIiIiFyi5ufniUajTE5OYozZ7nIuOGst+Xye+fl5pqamzrjfViyMICIiIiIi26DVapFOp3dkAAIwxpBOp1/0SJhCkIiIiIjIJWynBqBnnM35KwSJiIiIiMhZKZVKfPKTnzzvn/ONb3yD7373u1t2PIUgERERERE5Ky82BFlrcRznRX+OQpCIiIiIiFwUPvCBD3DkyBFuvPFGfuM3foPXvOY13HzzzVx33XV86UtfAmB6eporr7ySd73rXVx77bXMzc3x6U9/mr1793Lrrbfyy7/8y7z//e8HYG1tjZ/+6Z/mlltu4ZZbbuG+++5jenqau+++m49+9KPceOONfPvb3z7nurU6nIiIiIjIZeB3/u4xHl+sbOkxrx6O8aE3XXPa/XfddRePPvooDz/8ML1ej0ajQSwWY319nQMHDnDnnXcC8PTTT/OZz3yGAwcOsLi4yO/+7u/y4IMPEo1GefWrX80NN9wAwK/92q/xG7/xG7z85S9ndnaW17/+9TzxxBO8733vIxKJ8Ju/+Ztbcl4KQSIiIiIics6stXzwgx/kW9/6Fi6Xi4WFBVZWVgCYmJjgwIEDAPzgBz/gla98JalUCoC3v/3tPPXUUwDcc889PP74488es1KpUKvVtrxWhSARERERkcvA843YXAif+9znWFtb44EHHsDr9TI5Ofns0tXhcPiMjuE4Dt///vcJBALns1RdEyQiIiIiImcnGo1SrVYBKJfLZLNZvF4v9957LzMzM6fsc8stt/DNb36TYrFIr9fjb/7mb57dd8cdd/CHf/iHz24//PDDJ33OVlAIEhERERGRs5JOp7n99tu59tprefjhhzl48CDXXXcdn/3sZ9m3b98p+4yMjPDBD36QW2+9ldtvv53JyUni8TgAH//4xzl48CDXX389V199NXfffTcAb3rTm/jiF7+4ZQsjGGvtOR/kQtu/f789ePDgdpchIiIiIrKtnnjiCa666qrtLuNFq9VqRCIRer0eb33rW/nFX/xF3vrWt5718U71czDGPGCt3X+q9hoJEhERERGRC+rDH/4wN954I9deey1TU1O85S1vuaCfr4URRERERETkgvr93//9bf18jQSJiIiIiMiOohAkIiIiIiI7ikKQiIiIiIjsKApBIiIiIiKyoygEiYiIiIjIWfv4xz/OVVddRTKZ5K677jrr40QikS2s6vlpdTgRERERETlrn/zkJ7nnnnsYHR3d7lLOmEaCRERERETkrLzvfe/j6NGjvPGNb+SjH/0o73//+wF4z3vew6/+6q/yspe9jF27dvGFL3wB2LhJ6mte8xpuvvlmrrvuOr70pS9tS90aCRIRERERuRz84wdg+ZGtPebg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\n", 141 | "text/plain": [ 142 | "
" 143 | ] 144 | }, 145 | "metadata": { 146 | "needs_background": "light" 147 | }, 148 | "output_type": "display_data" 149 | } 150 | ], 151 | "source": [ 152 | "# lets plot the solution\n", 153 | "\n", 154 | "matched_airfoil = np.array(bezier_airfoil(xpts, munge_ctlpts(res.x, 3, 3)))\n", 155 | "x0, y0 = zip(*target_airfoil)\n", 156 | "x1, y1 = zip(*matched_airfoil)\n", 157 | "\n", 158 | "fig, ax = plt.subplots(figsize=(14,5))\n", 159 | "plt.plot(x0, y0, label='target')\n", 160 | "plt.plot(x1, y1, label='final')\n", 161 | "\n", 162 | "ax.set_aspect('equal')\n", 163 | "plt.ylim(-0.15,0.15)\n", 164 | "plt.legend()\n", 165 | "plt.show()" 166 | ] 167 | }, 168 | { 169 | "cell_type": "code", 170 | "execution_count": 9, 171 | "metadata": {}, 172 | "outputs": [], 173 | "source": [ 174 | "# the initial airfoil used panels with constant spacing\n", 175 | "# lets be smart and change this to cosine spacing\n", 176 | "# while using the control points we just solved for.\n", 177 | "\n", 178 | "num_panels = 60\n", 179 | "num_pts = num_panels + 1\n", 180 | "\n", 181 | "x_rad = np.linspace(0, pi, num_pts)\n", 182 | "x_cos = (np.cos(x_rad) / 2) + 0.5\n", 183 | "x_cos = x_cos[1:]\n", 184 | "\n", 185 | "# matched airfoil with cosine spacing\n", 186 | "initial_airfoil = np.array(bezier_airfoil(x_cos, munge_ctlpts(res.x, 3, 3)))" 187 | ] 188 | }, 189 | { 190 | "cell_type": "code", 191 | "execution_count": 10, 192 | "metadata": {}, 193 | "outputs": [ 194 | { 195 | "data": { 196 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0EAAAD4CAYAAAAq0O35AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOzdeZzcVZ3v/9epfV+7et+SkACBkAAhbOMCDF5ElDuOCzoqODPo6Kj33plhRmf8CTL8Rp251/k5o3O97hs/QXFUFHcQF1AgQRGBQLbu9L5VVdfStde5f3TTJCRAIJ10kn4/H49+dNX3nPP9fk51p1OfOsvXWGsRERERERFZKRzLHYCIiIiIiMjRpCRIRERERERWFCVBIiIiIiKyoigJEhERERGRFUVJkIiIiIiIrChKgkREREREZEVZkiTIGHOZMeZxY8xOY8x7D1L+YmPMg8aYujHmNU8raxhjfrvwdftSxCMiIiIiIvJMzOHeJ8gY4wSeAC4FhoEHgDdYax/dp04/EAH+BrjdWnvbPmUFa23osIIQERERERE5RK4lOMcWYKe1djeAMeYW4EpgMQmy1g4slDWX4HoiIiIiIiIv2FJMh+sChvZ5Prxw7FD5jDFbjTG/Nsb81yWIR0RERERE5BktxUjQ4eqz1o4YY1YDdxljHrbW7np6JWPM24C3AQSDwbNPOeWUox2niIiIiIgcJ7Zt2zZtrU0drGwpkqARoGef590Lxw6JtXZk4ftuY8zdwJnAAUmQtfZTwKcANm/ebLdu3XoYIYuIiIiIyInMGDP4TGVLMR3uAWCtMWaVMcYDXAUc0i5vxpi4Mca78LgFuJB91hKJiIiIiIgstcNOgqy1deBdwA+Bx4CvWWsfMcbcaIx5FYAx5hxjzDDwWuD/GGMeWWh+KrDVGPMQ8FPgw/vuKiciIiIiIrLUDnuL7OWg6XAiIiIiIvJsjDHbrLWbD1Z2LGyMICIiIiJyTKjVagwPD1Mul5c7FDlEPp+P7u5u3G73IbdREiQiIiIismB4eJhwOEx/fz/GmOUOR56DtZaZmRmGh4dZtWrVIbdbio0RREREREROCOVymWQyqQToOGGMIZlMPu+ROyVBIiIiIiL7UAJ0fHkhPy8lQSIiIiIiK0woFDrq17z88svJZrNH/boHozVBIiIiIiJyxH3ve99b7hAWaSRIREREROQY8pWvfIUtW7awadMm3v72t9NoNAD4/Oc/z7p169iyZQvXXnst73rXuwC45ppruO222xbbPznKUygUuOSSSzjrrLPYsGED3/72t5/1usVikVe84hVs3LiR008/nVtvvRWA/v5+/vZv/5YNGzawZcsWdu7cCcB3vvMdzj33XM4880z+8A//kImJicXrvvWtb2XDhg2cccYZfOMb31g8z/T0NAMDA5x66qlce+21nHbaabzsZS+jVCoB8MADD3DGGWewadMmrrvuOk4//fSleln3o5EgEREREZGD+OB3HuHR0dySnnN9Z4TrX3naM5Y/9thj3Hrrrdxzzz243W7e+c53cvPNN3PppZdy/fXXs23bNqLRKBdddBFnnnnms17L5/PxzW9+k0gkwvT0NOeddx6vetWrnnENzQ9+8AM6Ozu54447AJidnV0si0ajPPzww3zpS1/iv//3/853v/td/uAP/oBf//rXGGP4zGc+wz//8z/zv/7X/+If//EfF+sDZDKZA661Y8cOvvrVr/LpT3+a173udXzjG9/gTW96E29961v59Kc/zfnnn8973/ve53w9XyglQSIiIiIix4g777yTbdu2cc455wBQKpVobW3lvvvu46UvfSmpVAqA17/+9TzxxBPPei5rLX//93/Pz3/+cxwOByMjI0xMTNDe3n7Q+hs2bOCv//qv+bu/+zuuuOIKXvSiFy2WveENb1j8/j/+x/8A5rcTf/3rX8/Y2BjVanVxi+qf/OQn3HLLLYtt4/H4AddatWoVmzZtAuDss89mYGCAbDZLPp/n/PPPB+CNb3wj3/3ud5/7RXsBlASJiIiIiBzEs43YHCnWWq6++mo+9KEP7Xf8W9/61jO2cblcNJtNAJrNJtVqFYCbb76Zqakptm3bhtvtpr+//1m3kl63bh0PPvgg3/ve93j/+9/PJZdcwgc+8AFg/x3Ynnz87ne/m7/6q7/iVa96FXfffTc33HDDIffT6/UuPnY6nYvT4Y4WrQkSERERETlGXHLJJdx2221MTk4CkE6nGRwc5Nxzz+VnP/sZMzMz1Go1vv71ry+26e/vZ9u2bQDcfvvt1Go1YH46W2trK263m5/+9KcMDg4+67VHR0cJBAK86U1v4rrrruPBBx9cLHtyfdCtt966OFIzOztLV1cXAF/84hcX61566aV84hOfWHx+sOlwBxOLxQiHw9x3330A+40mLTWNBImIiIiIHCPWr1/PTTfdxMte9jKazSZut5tPfOITnHfeedxwww2cf/75xGKxxalkANdeey1XXnklGzdu5LLLLiMYDALwJ3/yJ7zyla9kw4YNbN68mVNOOeVZr/3www9z3XXX4XA4cLvd/O///b8XyzKZDGeccQZer5evfvWrANxwww289rWvJR6Pc/HFF7Nnzx4A3v/+9/OXf/mXnH766TidTq6//npe/epXH1L/P/vZz3LttdficDh4yUteQjQafV6v36Ey1tojcuIjafPmzXbr1q3LHYaIiIiInGAee+wxTj311OUO4zl94QtfYOvWrXz84x8/4tfq7+9n69attLS0HPFrFQqFxd3tPvzhDzM2NsbHPvax52x3sJ+bMWabtXbzweprJEhERERERI4Jd9xxBx/60Ieo1+v09fXxhS984YhcRyNBIiIiIiILjpeRINnf8x0J0sYIIiIiIiKyoigJEhERERGRFUVJkIiIiIiIrChKgkREREREZEVREiQiIiIicgLZunUr73nPe5Y7jOf0gQ98gJ/85CfLcm1tkS0iIiIicgLZvHkzmzcfdFO0Y8qNN964bNfWSJCIiIiIyDHkS1/6EmeccQYbN27kzW9+MwADAwNcfPHFnHHGGVxyySXs3bsXgK9//eucfvrpbNy4kRe/+MUA3H333VxxxRUA3HDDDfzpn/4pL33pS1m9ejX/9m//tnidr3zlK2zZsoVNmzbx9re/nUajcUAs733ve1m/fj1nnHEGf/M3fwPANddcw1/8xV+wefNm1q1bx3e/+93FGF/0ohdx1llncdZZZ3HvvfcunucjH/kIGzZsYOPGjbz3ve9dPM9tt90GzN+Q9frrr+ess85iw4YNbN++HYCpqSkuvfRSTjvtNP78z/+cvr4+pqenD/s11kiQiIiIiMjBfP+9MP7w0p6zfQO8/MPPWPzII49w0003ce+999LS0kI6nQbg3e9+N1dffTVXX301n/vc53jPe97Dt771LW688UZ++MMf0tXVRTabPeg5t2/fzk9/+lPy+Twnn3wy73jHO9i5cye33nor99xzD263m3e+853cfPPNvOUtb1lsNzMzwze/+U22b9+OMWa/8w8MDHD//feza9cuLrroInbu3Elrays//vGP8fl87Nixgze84Q1s3bqV73//+3z729/mvvvuIxAILPbp6VpaWnjwwQf5j//4D/7n//yffOYzn+GDH/wgF198Me973/v4wQ9+wGc/+9kX8qofQCNBIiIiIiLHiLvuuovXvva1tLS0AJBIJAD41a9+xRvf+EYA3vzmN/PLX/4SgAsvvJBrrrmGT3/60wcdyQF4xStegdfrpaWlhdbWViYmJrjzzjvZtm0b55xzDps2beLOO+9k9+7d+7WLRqP4fD7+7M/+jP/8z/8kEAgslr3uda/D4XCwdu1aVq9ezfbt26nValx77bVs2LCB1772tTz66KMA/OQnP+Gtb33rYvsn+/R0r371qwE4++yzGRgYAOCXv/wlV111FQCXXXYZ8Xj8+b2gz0AjQSIiIiIiB/MsIzbHik9+8pPcd9993HHHHZx99tls27btgDper3fxsdPppF6vY63l6quv5kMf+tAzntvlcnH//fdz5513ctttt/Hxj3+cu+66CwBjzH51jTH867/+K21tbTz00EM0m018Pt/z6suTcT4Z45GkkSARERERkWPExRdfzNe//nVmZmYAFqeOXXDBBdxyyy0A3HzzzbzoRS8CYNeuXZx77rnceOONpFIphoaGDuk6l1xyCbfddhuTk5OL1xkcHNyvTqFQYHZ2lssvv5x//dd/5aGHHlos+/rXv06z2WTXrl3s3r2bk08+mdnZWTo6OnA4HHz5y19eHJm69NJL+fznP8/c3Nx+fToUF154IV/72tcA+NGPfkQmkznkts9GI0EiIiIiIseI0047jX/4h3/gJS95CU6nkzPPPJMvfOEL/Pu//ztvfetb+Zd/+RdSqRSf//znAbjuuuvYsWMH1louueQSNm7cyM9+9rPnvM769eu56aabeNnLXkaz2cTtdvOJT3yCvr6+xTr5fJ4rr7yScrmMtZaPfvSji2W9vb1s2bKFXC7HJz/5SXw+H+985zv54z/+Y770pS9x2WWXEQwGgflpbL/97W/ZvHkzHo+Hyy+/nH/6p386pNfj+uuv5w1veANf/vKXOf/882lvbyccDj+fl/SgjLX28E9izGXAxwAn8Blr7YefVv5i4P8DzgCustbetk/Z1cD7F57eZK394nNdb/PmzXbr1q2HHbeIiIiIyL4ee+wxTj311OUO45h2zTXXcMUVV/Ca17zmiF+rUqngdDpxuVz86le/4h3veAe//e1vD6h3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\n", 197 | "text/plain": [ 198 | "
" 199 | ] 200 | }, 201 | "metadata": { 202 | "needs_background": "light" 203 | }, 204 | "output_type": "display_data" 205 | } 206 | ], 207 | "source": [ 208 | "# final sanity check\n", 209 | "\n", 210 | "x0, y0 = zip(*matched_airfoil)\n", 211 | "x1, y1 = zip(*initial_airfoil)\n", 212 | "\n", 213 | "fig, ax = plt.subplots(figsize=(14,5))\n", 214 | "plt.plot(x0, y0, label='equal spacing')\n", 215 | "plt.plot(x1, y1, label='cosine spacing')\n", 216 | "\n", 217 | "ax.set_aspect('equal')\n", 218 | "plt.ylim(-0.15,0.15)\n", 219 | "plt.legend()\n", 220 | "plt.show()" 221 | ] 222 | }, 223 | { 224 | "cell_type": "code", 225 | "execution_count": 11, 226 | "metadata": {}, 227 | "outputs": [ 228 | { 229 | "data": { 230 | "image/png": "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R/z1r39Fa82VV17JQw89tMu28+fP3+/7sdvtAJhMpujr7cvBYBCz2cy4ceP417/+td/9zWYzwWBwv+fqSuSaICGEEEIIISK2bt0aDTuvvPIKo0ePpl+/fjQ0NETXBwIBVq9eTSAQYPLkyTzyyCP07dt3j2MlJibSo0cPXnvtNcC4sefXX399wD5899139OzZk5tvvpkLLriAb775hrFjxzJv3jzq6+sBaG5uZsuWLQwdOpRPPvmElpYWgsEgr7/++iG939NOO42FCxeyceNGADo6OnYZSdqbhIQEnE7nIZ3neCMhSAghhBBCiIh+/frxzDPPUFRUREtLC9dffz02m4158+Zx5513MnDgQMrKyli0aBGLFi2ivLyce++9N1ocobq6epfjvfzyy8ycOZOBAwcyYMAA3nrrrQP24dVXX6W4uJiysjJWrVrFFVdcQf/+/XnggQf4wQ9+QGlpKePGjaOmpobc3Fzuvvtuhg0bxqhRoygsLCQpKemg329GRgazZ8/mkksuobS0lBEjRkSLN+zL+eefz5tvvtmlCyMorfWx7sMhGzJkiC4vLz/W3RBCCCGEEJ1o7dq1FBUVHetudDkul4v4+HiCwSATJ05k+vTpTJw48Vh363u1t787SqllWushe9teRoKEEEIIIYTowu677z7KysooLi6mR48eXHjhhce6S8c9KYwghBBCCCFEF7b9nkTi4MlIkBBCCCGEEOKkIiFICCGEEEIIcVKRECSEEEIIIYQ4qUgIEkIIIYQQQpxUJAQJIYQQQghxnJs9e/Ye9yDa2T333MMHH3zwPfZo/9577z369etH7969efjhh6PrN2/ezPDhw+nduzdTpkzB7/cD8OmnnzJo0CAsFgvz5s2Lbr9ixQpGjBjBgAEDKC0tZe7cuZ3SPwlBQgghhBBCdIJgMHjUjr2/EBQKhbj//vs555xzjtr5D0UoFOIXv/gF//d//8eaNWv417/+xZo1awC48847ufXWW9m4cSMpKSnMnDkTgO7duzN79mwuvfTSXY4VGxvLSy+9xOrVq3nvvff45S9/SWtr6xH3UUKQEEIIIYQQQEVFBaeccgpTp06lqKiISZMm4Xa7Abj//vsZOnQoxcXFXHvttWitARgzZgy//OUvGTJkCE8++ST//ve/GT58OKeeeirnnHMOdXV1gHEvnyuvvJLTTz+dgoIC3njj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//W/uf471FRV0Nndy7N/e76/FaaupoppU1pxFbuIHXPke/iXr122qyUmVAgxdbVVACw+/2wWn3/2Xj//wvlzWDh/znB/5SIiIjKG1BIkIuNGPp8nFk8QjcUJF1tdunp6eXbl85x26sncestSIqkU0Wics0//AHNmTWN7WwfPPvs3PnzuGaz466r+Fpm66io8HvdYfyQREREZI2oJEpEJweFw9LfI7FRVUc7pi06A1lY+O2/6O+aTaqir4eyWWmht5egj5412kUVERGQCUod1EZkYLrkEfvCDwvxRA1lbGE794ovHplwiIiIy4SgEicjEcPnlhXmjzj8fVq2CTKawPP/8wv7LLx/rEoqIiMgEoRAkIhNDKFSYOHfePDjvPPD7C8t588blhLoiIiIyfmlgBBEREREROejsa2AEtQSJiIiIiEhJUQgSEREREZGSohAkIiIiIiIlRSFIRERERERKikKQiIiIiIiUFIUgEREREREpKQpBIiIiIiJSUhSCRERERESkpCgEiYiIiIhISVEIEhERERGRkqIQJCIiIiIiJUUhSERERERESopCkIiIiIiIlBSFIBERERERKSkKQSIiIiIiUlIUgkREREREpKSMKAQZY6qMMQ8ZY14rLiv3ct4DxpgeY8z9b9s/1RjzrDFmvTFmqTHGM5LyiIiIiIiIDGakLUHfBJZba2cAy4vbe/Jj4KI97P8hcL21djrQDVwywvKIiIiIiIjs00hD0NnArcX1W4Fz9nSStXY5EBm4zxhjgA8Adw92vYiIiIiIyLtlpCGo3lq7rbi+HagfxrXVQI+1Nlvcfgto3tvJxphLjTErjDEr2tvb96+0IiIiIiJS8lyDnWCMeRho2MOhqwZuWGutMca+WwV7O2vtjcCNAAsXLjxg7yMiIiIiIge3QUOQtfaUvR0zxuwwxjRaa7cZYxqBtmG8dydQYYxxFVuDWoAtw7heRERERERk2EbaHe4+YHFxfTFw71AvtNZa4FHgY/tzvYiIiIiIyP4YaQi6DvigMeY14JTiNsaYhcaY3+w8yRjzJPBbYJEx5i1jzGnFQ98ArjDGrKfwjNBNIyyPiIiIiIjIPg3aHW5frLWdwKI97F8BfG7A9gl7uX4DcPRIyiAiIiIiIjIcI20JEhERERERmVAUgkREREREpKQoBImIiIiISElRCBIRERERkZKiECQiIiIi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\n", 231 | "text/plain": [ 232 | "
" 233 | ] 234 | }, 235 | "metadata": { 236 | "needs_background": "light" 237 | }, 238 | "output_type": "display_data" 239 | } 240 | ], 241 | "source": [ 242 | "# plot final airfoil with control points\n", 243 | "x0, y0=zip(*np.array(munge_ctlpts(res.x, 3, 3)))\n", 244 | "x1, y1 = zip(*initial_airfoil)\n", 245 | "\n", 246 | "\n", 247 | "fig, ax = plt.subplots(figsize=(14,5))\n", 248 | "plt.plot(x0, y0, color='#2c3e50', linewidth=1.5, linestyle='--', label='bezier segment')\n", 249 | "plt.plot(x1, y1, color='#2980b9', label='parametric naca0012', linewidth=2)\n", 250 | "plt.plot(x0, y0, 'o', mfc='none', mec='r', markersize=8, label='control pts')\n", 251 | "\n", 252 | "ax.set_aspect('equal')\n", 253 | "plt.ylim(-0.15, 0.15)\n", 254 | "plt.legend()\n", 255 | "\n", 256 | "plt.show()" 257 | ] 258 | }, 259 | { 260 | "cell_type": "code", 261 | "execution_count": 12, 262 | "metadata": {}, 263 | "outputs": [], 264 | "source": [ 265 | "def cost_function(x, x_coords=x_cos):\n", 266 | " airfoil_file = 'airfoil.txt'\n", 267 | " \n", 268 | " try:\n", 269 | " # munge x-vector into bezier format\n", 270 | " control_pts = munge_ctlpts(x, 3, 3)\n", 271 | "\n", 272 | " # generate new airfoil\n", 273 | " curve = bezier_airfoil(x_coords, control_pts)\n", 274 | "\n", 275 | " # output airfoil to csv\n", 276 | " with open(airfoil_file,'w') as out_file:\n", 277 | " out_file.write('x,y\\n')\n", 278 | " for item in curve:\n", 279 | " out_file.write(f'{item[0]},{item[1]}\\n')\n", 280 | "\n", 281 | " # run xfoil and collect results\n", 282 | " results_dict = run_xfoil()\n", 283 | " \n", 284 | " # determine cost\n", 285 | " cost = results_dict['cl'] / results_dict['cd']\n", 286 | " if results_dict['cl'] < 0: cost = 0.01\n", 287 | " \n", 288 | " except:\n", 289 | " cost = 0.01\n", 290 | " \n", 291 | " # remove airfoil file\n", 292 | " os.system(f'rm -rf {airfoil_file}')\n", 293 | "\n", 294 | " print(f'> cl/cd={cost:0.4f} -> cost_func={1000.0 / cost:0.4f}')\n", 295 | " \n", 296 | " return 1000.0 / cost" 297 | ] 298 | }, 299 | { 300 | "cell_type": "code", 301 | "execution_count": 18, 302 | "metadata": {}, 303 | "outputs": [ 304 | { 305 | "name": "stdout", 306 | "output_type": "stream", 307 | "text": [ 308 | "> cl/cd=0.4283 -> cost_func=2334.7826\n", 309 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 310 | "> cl/cd=3.3603 -> cost_func=297.5904\n", 311 | "> cl/cd=3.2727 -> cost_func=305.5556\n", 312 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 313 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 314 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 315 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 316 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 317 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 318 | "> cl/cd=5.8641 -> cost_func=170.5298\n", 319 | "> cl/cd=7.2593 -> cost_func=137.7551\n", 320 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 321 | "> cl/cd=1.3910 -> cost_func=718.9189\n", 322 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 323 | "> cl/cd=4.2266 -> cost_func=236.5942\n", 324 | "> cl/cd=3.5626 -> cost_func=280.6950\n", 325 | "> cl/cd=8.4861 -> cost_func=117.8392\n", 326 | "> cl/cd=3.8614 -> cost_func=258.9744\n", 327 | "> cl/cd=8.7107 -> cost_func=114.8014\n", 328 | "> cl/cd=0.3171 -> cost_func=3153.3333\n", 329 | "> cl/cd=7.6228 -> cost_func=131.1850\n", 330 | "> cl/cd=1.6777 -> cost_func=596.0396\n", 331 | "> cl/cd=3.9748 -> cost_func=251.5837\n", 332 | "> cl/cd=3.5513 -> cost_func=281.5900\n", 333 | "> cl/cd=1.7488 -> cost_func=571.8182\n", 334 | "> cl/cd=11.0714 -> cost_func=90.3226\n", 335 | "> cl/cd=16.5709 -> cost_func=60.3466\n", 336 | "> cl/cd=10.8094 -> cost_func=92.5125\n", 337 | "> cl/cd=15.9897 -> cost_func=62.5404\n", 338 | "> cl/cd=20.8302 -> cost_func=48.0072\n", 339 | "> cl/cd=16.2881 -> cost_func=61.3944\n", 340 | "> cl/cd=25.6322 -> cost_func=39.0135\n", 341 | "> cl/cd=28.1900 -> cost_func=35.4736\n", 342 | "> cl/cd=24.5841 -> cost_func=40.6767\n", 343 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 344 | "> cl/cd=23.8530 -> cost_func=41.9234\n", 345 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 346 | "> cl/cd=11.8305 -> cost_func=84.5275\n", 347 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 348 | "> cl/cd=21.0877 -> cost_func=47.4210\n", 349 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 350 | "> cl/cd=15.8838 -> cost_func=62.9572\n", 351 | "> cl/cd=20.8428 -> cost_func=47.9782\n", 352 | "> cl/cd=26.4904 -> cost_func=37.7495\n", 353 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 354 | "> cl/cd=13.0872 -> cost_func=76.4107\n", 355 | "> cl/cd=17.7437 -> cost_func=56.3582\n", 356 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 357 | "> cl/cd=23.3680 -> cost_func=42.7937\n", 358 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 359 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 360 | "> cl/cd=20.4515 -> cost_func=48.8962\n", 361 | "> cl/cd=26.7123 -> cost_func=37.4359\n", 362 | "> cl/cd=26.1754 -> cost_func=38.2038\n", 363 | "> cl/cd=22.8622 -> cost_func=43.7403\n", 364 | "> cl/cd=25.3734 -> cost_func=39.4114\n", 365 | "> cl/cd=27.1612 -> cost_func=36.8173\n", 366 | "> cl/cd=25.7563 -> cost_func=38.8254\n", 367 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 368 | "> cl/cd=19.1853 -> cost_func=52.1231\n", 369 | "> cl/cd=31.8582 -> cost_func=31.3891\n", 370 | "> cl/cd=21.9811 -> cost_func=45.4936\n", 371 | "> cl/cd=11.6745 -> cost_func=85.6570\n", 372 | "> cl/cd=14.0632 -> cost_func=71.1074\n", 373 | "> cl/cd=25.4862 -> cost_func=39.2369\n", 374 | "> cl/cd=31.8435 -> cost_func=31.4036\n", 375 | "> cl/cd=32.9390 -> cost_func=30.3591\n", 376 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 377 | "> cl/cd=32.4702 -> cost_func=30.7975\n", 378 | "> cl/cd=38.4393 -> cost_func=26.0150\n", 379 | "> cl/cd=39.0239 -> cost_func=25.6253\n", 380 | "> cl/cd=17.8956 -> cost_func=55.8798\n", 381 | "> cl/cd=41.5066 -> cost_func=24.0926\n", 382 | "> cl/cd=13.6223 -> cost_func=73.4093\n", 383 | "> cl/cd=11.8726 -> cost_func=84.2275\n", 384 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 385 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 386 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 387 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 388 | "> cl/cd=45.2688 -> cost_func=22.0903\n", 389 | "> cl/cd=14.3780 -> cost_func=69.5507\n", 390 | "> cl/cd=31.7508 -> cost_func=31.4952\n", 391 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 392 | "> cl/cd=43.6910 -> cost_func=22.8880\n", 393 | "> cl/cd=9.5961 -> cost_func=104.2093\n", 394 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 395 | "> cl/cd=36.1100 -> cost_func=27.6932\n", 396 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 397 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 398 | "> cl/cd=43.5331 -> cost_func=22.9710\n", 399 | "> cl/cd=9.2289 -> cost_func=108.3554\n", 400 | "> cl/cd=38.4979 -> cost_func=25.9754\n", 401 | "> cl/cd=33.3274 -> cost_func=30.0053\n", 402 | "> cl/cd=34.3447 -> cost_func=29.1166\n", 403 | "> cl/cd=9.3607 -> cost_func=106.8299\n", 404 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 405 | "> cl/cd=11.7468 -> cost_func=85.1297\n", 406 | "> cl/cd=39.5728 -> cost_func=25.2699\n", 407 | "> cl/cd=38.1836 -> cost_func=26.1893\n", 408 | "> cl/cd=11.4103 -> cost_func=87.6404\n", 409 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 410 | "> cl/cd=42.2835 -> cost_func=23.6499\n", 411 | "> cl/cd=12.6909 -> cost_func=78.7968\n", 412 | "> cl/cd=12.5381 -> cost_func=79.7571\n", 413 | "> cl/cd=44.8203 -> cost_func=22.3113\n", 414 | "> cl/cd=40.6729 -> cost_func=24.5864\n", 415 | "> cl/cd=8.0952 -> cost_func=123.5294\n", 416 | "> cl/cd=7.2525 -> cost_func=137.8840\n", 417 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 418 | "> cl/cd=42.2360 -> cost_func=23.6765\n", 419 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 420 | "> cl/cd=40.8240 -> cost_func=24.4954\n", 421 | "> cl/cd=34.7660 -> cost_func=28.7637\n", 422 | "> cl/cd=49.6976 -> cost_func=20.1217\n", 423 | "> cl/cd=46.7006 -> cost_func=21.4130\n", 424 | "> cl/cd=49.2927 -> cost_func=20.2870\n", 425 | "> cl/cd=53.7393 -> cost_func=18.6083\n", 426 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 427 | "> cl/cd=43.8833 -> cost_func=22.7877\n", 428 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 429 | "> cl/cd=50.0858 -> cost_func=19.9657\n", 430 | "> cl/cd=45.2756 -> cost_func=22.0870\n", 431 | "> cl/cd=49.8929 -> cost_func=20.0429\n", 432 | "> cl/cd=52.1719 -> cost_func=19.1674\n", 433 | "> cl/cd=34.5763 -> cost_func=28.9216\n", 434 | "> cl/cd=47.4775 -> cost_func=21.0626\n", 435 | "> cl/cd=44.8513 -> cost_func=22.2959\n", 436 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 437 | "> cl/cd=56.0137 -> cost_func=17.8528\n", 438 | "> cl/cd=44.9712 -> cost_func=22.2365\n", 439 | "> cl/cd=58.1030 -> cost_func=17.2108\n", 440 | "> cl/cd=55.2708 -> cost_func=18.0927\n", 441 | "> cl/cd=56.9330 -> cost_func=17.5645\n", 442 | "> cl/cd=67.2500 -> cost_func=14.8699\n", 443 | "> cl/cd=71.4189 -> cost_func=14.0019\n", 444 | "> cl/cd=65.7495 -> cost_func=15.2092\n", 445 | "> cl/cd=65.8758 -> cost_func=15.1801\n", 446 | "> cl/cd=70.5987 -> cost_func=14.1646\n", 447 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 448 | "> cl/cd=53.3442 -> cost_func=18.7462\n", 449 | "> cl/cd=64.5766 -> cost_func=15.4855\n", 450 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 451 | "> cl/cd=64.2127 -> cost_func=15.5732\n", 452 | "> cl/cd=51.4757 -> cost_func=19.4266\n", 453 | "> cl/cd=60.0425 -> cost_func=16.6549\n", 454 | "> cl/cd=60.1101 -> cost_func=16.6361\n", 455 | "> cl/cd=63.8444 -> cost_func=15.6631\n", 456 | "> cl/cd=22.3650 -> cost_func=44.7126\n", 457 | "> cl/cd=58.6775 -> cost_func=17.0423\n", 458 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 459 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 460 | "> cl/cd=63.1579 -> cost_func=15.8333\n", 461 | "> cl/cd=60.5285 -> cost_func=16.5211\n", 462 | "> cl/cd=60.5695 -> cost_func=16.5100\n", 463 | "> cl/cd=60.9843 -> cost_func=16.3977\n", 464 | "> cl/cd=57.7282 -> cost_func=17.3225\n", 465 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 466 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 467 | "> cl/cd=58.4154 -> cost_func=17.1188\n", 468 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 469 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 470 | "> cl/cd=63.6099 -> cost_func=15.7208\n", 471 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 472 | "> cl/cd=26.7807 -> cost_func=37.3403\n", 473 | "> cl/cd=56.8323 -> cost_func=17.5956\n", 474 | "> cl/cd=62.0490 -> cost_func=16.1163\n", 475 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 476 | "> cl/cd=62.4835 -> cost_func=16.0042\n", 477 | "> cl/cd=57.4324 -> cost_func=17.4118\n", 478 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 479 | "> cl/cd=59.5079 -> cost_func=16.8045\n", 480 | "> cl/cd=68.9641 -> cost_func=14.5003\n", 481 | "> cl/cd=69.0426 -> cost_func=14.4838\n", 482 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 483 | "> cl/cd=22.2079 -> cost_func=45.0290\n", 484 | "> cl/cd=56.6522 -> cost_func=17.6516\n", 485 | "> cl/cd=21.3007 -> cost_func=46.9467\n", 486 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 487 | "> cl/cd=67.4120 -> cost_func=14.8342\n", 488 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 489 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 490 | "> cl/cd=70.2292 -> cost_func=14.2391\n", 491 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 492 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 493 | "> cl/cd=17.1570 -> cost_func=58.2854\n", 494 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 495 | "> cl/cd=72.7181 -> cost_func=13.7517\n", 496 | "> cl/cd=63.3982 -> cost_func=15.7733\n", 497 | "> cl/cd=53.4748 -> cost_func=18.7004\n", 498 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 499 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 500 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 501 | "> cl/cd=17.6732 -> cost_func=56.5829\n", 502 | "> cl/cd=73.9062 -> cost_func=13.5307\n", 503 | "> cl/cd=71.8400 -> cost_func=13.9198\n", 504 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 505 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 506 | "> cl/cd=68.4144 -> cost_func=14.6168\n", 507 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 508 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 509 | "> cl/cd=69.0741 -> cost_func=14.4772\n", 510 | "> cl/cd=24.8874 -> cost_func=40.1809\n", 511 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 512 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 513 | "> cl/cd=20.7797 -> cost_func=48.1239\n", 514 | "> cl/cd=53.3241 -> cost_func=18.7532\n", 515 | "> cl/cd=22.0631 -> cost_func=45.3246\n", 516 | "> cl/cd=24.4324 -> cost_func=40.9292\n", 517 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 518 | "> cl/cd=19.8926 -> cost_func=50.2700\n", 519 | "> cl/cd=21.0550 -> cost_func=47.4947\n", 520 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 521 | "> cl/cd=21.8011 -> cost_func=45.8693\n", 522 | "> cl/cd=23.3576 -> cost_func=42.8126\n", 523 | "> cl/cd=53.9942 -> cost_func=18.5205\n", 524 | "> cl/cd=70.7721 -> cost_func=14.1299\n" 525 | ] 526 | }, 527 | { 528 | "name": "stdout", 529 | "output_type": "stream", 530 | "text": [ 531 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 532 | "> cl/cd=22.4611 -> cost_func=44.5214\n", 533 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 534 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 535 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 536 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 537 | "> cl/cd=74.1713 -> cost_func=13.4823\n", 538 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 539 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 540 | "> cl/cd=81.4800 -> cost_func=12.2730\n", 541 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 542 | "> cl/cd=73.2035 -> cost_func=13.6605\n", 543 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 544 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 545 | "> cl/cd=79.9064 -> cost_func=12.5146\n", 546 | "> cl/cd=62.6525 -> cost_func=15.9611\n", 547 | "> cl/cd=66.2982 -> cost_func=15.0834\n", 548 | "> cl/cd=71.7426 -> cost_func=13.9387\n", 549 | "> cl/cd=67.6848 -> cost_func=14.7744\n", 550 | "> cl/cd=70.4220 -> cost_func=14.2001\n", 551 | "> cl/cd=66.5045 -> cost_func=15.0366\n", 552 | "> cl/cd=71.4258 -> cost_func=14.0005\n", 553 | "> cl/cd=74.7495 -> cost_func=13.3780\n", 554 | "> cl/cd=71.8919 -> cost_func=13.9098\n", 555 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 556 | "> cl/cd=70.0743 -> cost_func=14.2706\n", 557 | "> cl/cd=65.0808 -> cost_func=15.3655\n", 558 | "> cl/cd=64.0933 -> cost_func=15.6023\n", 559 | "> cl/cd=70.3633 -> cost_func=14.2120\n", 560 | "> cl/cd=67.1750 -> cost_func=14.8865\n", 561 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 562 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 563 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 564 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 565 | "> cl/cd=73.0099 -> cost_func=13.6968\n", 566 | "> cl/cd=70.2467 -> cost_func=14.2355\n", 567 | "> cl/cd=68.5300 -> cost_func=14.5922\n", 568 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 569 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 570 | "> cl/cd=66.6488 -> cost_func=15.0040\n", 571 | "> cl/cd=71.1607 -> cost_func=14.0527\n", 572 | "> cl/cd=77.0932 -> cost_func=12.9713\n", 573 | "> cl/cd=71.3629 -> cost_func=14.0129\n", 574 | "> cl/cd=70.6723 -> cost_func=14.1498\n", 575 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 576 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 577 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 578 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 579 | "> cl/cd=74.3784 -> cost_func=13.4448\n", 580 | "> cl/cd=77.7046 -> cost_func=12.8692\n", 581 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 582 | "> cl/cd=81.0708 -> cost_func=12.3349\n", 583 | "> cl/cd=80.1449 -> cost_func=12.4774\n", 584 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 585 | "> cl/cd=82.7273 -> cost_func=12.0879\n", 586 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 587 | "> cl/cd=83.3458 -> cost_func=11.9982\n", 588 | "> cl/cd=86.0714 -> cost_func=11.6183\n", 589 | "> cl/cd=85.3578 -> cost_func=11.7154\n", 590 | "> cl/cd=82.6523 -> cost_func=12.0989\n", 591 | "> cl/cd=81.5963 -> cost_func=12.2555\n", 592 | "> cl/cd=81.2432 -> cost_func=12.3087\n", 593 | "> cl/cd=80.5115 -> cost_func=12.4206\n", 594 | "> cl/cd=80.7861 -> cost_func=12.3784\n", 595 | "> cl/cd=73.6471 -> cost_func=13.5783\n", 596 | "> cl/cd=66.2997 -> cost_func=15.0830\n", 597 | "> cl/cd=75.1207 -> cost_func=13.3119\n", 598 | "> cl/cd=74.5289 -> cost_func=13.4176\n", 599 | "> cl/cd=74.1437 -> cost_func=13.4873\n", 600 | "> cl/cd=76.4396 -> cost_func=13.0822\n", 601 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 602 | "> cl/cd=73.6589 -> cost_func=13.5761\n", 603 | "> cl/cd=76.3678 -> cost_func=13.0945\n", 604 | "> cl/cd=78.5015 -> cost_func=12.7386\n", 605 | "> cl/cd=78.8433 -> cost_func=12.6834\n", 606 | "> cl/cd=82.8179 -> cost_func=12.0747\n", 607 | "> cl/cd=88.7844 -> cost_func=11.2632\n", 608 | "> cl/cd=88.8174 -> cost_func=11.2591\n", 609 | "> cl/cd=86.3583 -> cost_func=11.5797\n", 610 | "> cl/cd=86.0637 -> cost_func=11.6193\n", 611 | "> cl/cd=83.3813 -> cost_func=11.9931\n", 612 | "> cl/cd=79.6208 -> cost_func=12.5595\n", 613 | "> cl/cd=85.8065 -> cost_func=11.6541\n", 614 | "> cl/cd=86.6715 -> cost_func=11.5378\n", 615 | "> cl/cd=87.0870 -> cost_func=11.4828\n", 616 | "> cl/cd=89.8841 -> cost_func=11.1254\n", 617 | "> cl/cd=87.0638 -> cost_func=11.4858\n", 618 | "> cl/cd=86.7045 -> cost_func=11.5334\n", 619 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 620 | "> cl/cd=88.3427 -> cost_func=11.3196\n", 621 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 622 | "> cl/cd=81.6757 -> cost_func=12.2435\n", 623 | "> cl/cd=94.3857 -> cost_func=10.5948\n", 624 | "> cl/cd=90.7891 -> cost_func=11.0145\n", 625 | "> cl/cd=96.0913 -> cost_func=10.4068\n", 626 | "> cl/cd=93.7356 -> cost_func=10.6683\n", 627 | "> cl/cd=95.2738 -> cost_func=10.4961\n", 628 | "> cl/cd=92.9412 -> cost_func=10.7595\n", 629 | "> cl/cd=89.2980 -> cost_func=11.1985\n", 630 | "> cl/cd=94.4832 -> cost_func=10.5839\n", 631 | "> cl/cd=92.4583 -> cost_func=10.8157\n", 632 | "> cl/cd=83.7120 -> cost_func=11.9457\n", 633 | "> cl/cd=86.1453 -> cost_func=11.6083\n", 634 | "> cl/cd=89.4811 -> cost_func=11.1755\n", 635 | "> cl/cd=89.7632 -> cost_func=11.1404\n", 636 | "> cl/cd=84.1168 -> cost_func=11.8882\n", 637 | "> cl/cd=93.4722 -> cost_func=10.6984\n", 638 | "> cl/cd=89.3956 -> cost_func=11.1862\n", 639 | "> cl/cd=95.1748 -> cost_func=10.5070\n", 640 | "> cl/cd=93.7660 -> cost_func=10.6648\n", 641 | "> cl/cd=93.7042 -> cost_func=10.6719\n", 642 | "> cl/cd=94.6014 -> cost_func=10.5707\n", 643 | "> cl/cd=90.6897 -> cost_func=11.0266\n", 644 | "> cl/cd=88.7940 -> cost_func=11.2620\n", 645 | "> cl/cd=82.6486 -> cost_func=12.0994\n", 646 | "> cl/cd=74.9513 -> cost_func=13.3420\n", 647 | "> cl/cd=92.3922 -> cost_func=10.8234\n", 648 | "> cl/cd=91.8637 -> cost_func=10.8857\n", 649 | "> cl/cd=97.8166 -> cost_func=10.2232\n", 650 | "> cl/cd=96.8304 -> cost_func=10.3273\n", 651 | "> cl/cd=100.9955 -> cost_func=9.9014\n", 652 | "> cl/cd=104.7440 -> cost_func=9.5471\n", 653 | "> cl/cd=103.7087 -> cost_func=9.6424\n", 654 | "> cl/cd=99.0634 -> cost_func=10.0945\n", 655 | "> cl/cd=102.1114 -> cost_func=9.7932\n", 656 | "> cl/cd=98.3241 -> cost_func=10.1704\n", 657 | "> cl/cd=96.4245 -> cost_func=10.3708\n", 658 | "> cl/cd=111.3125 -> cost_func=8.9837\n", 659 | "> cl/cd=113.6751 -> cost_func=8.7970\n", 660 | "> cl/cd=104.9625 -> cost_func=9.5272\n", 661 | "> cl/cd=105.0228 -> cost_func=9.5217\n", 662 | "> cl/cd=99.9534 -> cost_func=10.0047\n", 663 | "> cl/cd=104.8165 -> cost_func=9.5405\n", 664 | "> cl/cd=106.0784 -> cost_func=9.4270\n", 665 | "> cl/cd=100.8924 -> cost_func=9.9116\n", 666 | "> cl/cd=95.7768 -> cost_func=10.4409\n", 667 | "> cl/cd=100.9885 -> cost_func=9.9021\n", 668 | "> cl/cd=106.9747 -> cost_func=9.3480\n", 669 | "> cl/cd=111.6992 -> cost_func=8.9526\n", 670 | "> cl/cd=114.1843 -> cost_func=8.7578\n", 671 | "> cl/cd=109.8246 -> cost_func=9.1054\n", 672 | "> cl/cd=103.1653 -> cost_func=9.6932\n", 673 | "> cl/cd=97.4019 -> cost_func=10.2667\n", 674 | "> cl/cd=77.6598 -> cost_func=12.8767\n", 675 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 676 | "> cl/cd=92.0413 -> cost_func=10.8647\n", 677 | "> cl/cd=94.6879 -> cost_func=10.5610\n", 678 | "> cl/cd=98.3784 -> cost_func=10.1648\n", 679 | "> cl/cd=76.9104 -> cost_func=13.0021\n", 680 | "> cl/cd=93.7268 -> cost_func=10.6693\n", 681 | "> cl/cd=96.4993 -> cost_func=10.3628\n", 682 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 683 | "> cl/cd=93.4846 -> cost_func=10.6969\n", 684 | "> cl/cd=98.3569 -> cost_func=10.1671\n", 685 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 686 | "> cl/cd=95.0483 -> cost_func=10.5210\n", 687 | "> cl/cd=92.8740 -> cost_func=10.7673\n", 688 | "> cl/cd=91.8533 -> cost_func=10.8869\n", 689 | "> cl/cd=90.9821 -> cost_func=10.9912\n", 690 | "> cl/cd=88.4360 -> cost_func=11.3076\n", 691 | "> cl/cd=94.1885 -> cost_func=10.6170\n", 692 | "> cl/cd=98.6024 -> cost_func=10.1417\n", 693 | "> cl/cd=90.4956 -> cost_func=11.0503\n", 694 | "> cl/cd=84.9452 -> cost_func=11.7723\n", 695 | "> cl/cd=89.3211 -> cost_func=11.1956\n", 696 | "> cl/cd=98.9081 -> cost_func=10.1104\n", 697 | "> cl/cd=100.4314 -> cost_func=9.9570\n", 698 | "> cl/cd=105.9430 -> cost_func=9.4390\n", 699 | "> cl/cd=98.5459 -> cost_func=10.1476\n", 700 | "> cl/cd=100.7733 -> cost_func=9.9233\n", 701 | "> cl/cd=96.3753 -> cost_func=10.3761\n", 702 | "> cl/cd=89.1562 -> cost_func=11.2163\n", 703 | "> cl/cd=89.6255 -> cost_func=11.1575\n", 704 | "> cl/cd=92.6500 -> cost_func=10.7933\n", 705 | "> cl/cd=92.7150 -> cost_func=10.7857\n", 706 | "> cl/cd=89.5084 -> cost_func=11.1721\n", 707 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 708 | "> cl/cd=94.5926 -> cost_func=10.5717\n", 709 | "> cl/cd=95.5134 -> cost_func=10.4697\n", 710 | "> cl/cd=93.4390 -> cost_func=10.7022\n", 711 | "> cl/cd=91.3962 -> cost_func=10.9414\n", 712 | "> cl/cd=96.2324 -> cost_func=10.3915\n", 713 | "> cl/cd=89.2143 -> cost_func=11.2090\n", 714 | "> cl/cd=94.3086 -> cost_func=10.6035\n", 715 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 716 | "> cl/cd=91.4628 -> cost_func=10.9334\n", 717 | "> cl/cd=97.4256 -> cost_func=10.2642\n", 718 | "> cl/cd=98.7109 -> cost_func=10.1306\n", 719 | "> cl/cd=96.8205 -> cost_func=10.3284\n", 720 | "> cl/cd=91.7432 -> cost_func=10.9000\n", 721 | "> cl/cd=95.2430 -> cost_func=10.4995\n", 722 | "> cl/cd=96.6623 -> cost_func=10.3453\n", 723 | "> cl/cd=91.9024 -> cost_func=10.8811\n", 724 | "> cl/cd=89.0555 -> cost_func=11.2290\n", 725 | "> cl/cd=93.5409 -> cost_func=10.6905\n", 726 | "> cl/cd=98.7109 -> cost_func=10.1306\n", 727 | "> cl/cd=95.3208 -> cost_func=10.4909\n", 728 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 729 | "> cl/cd=93.2463 -> cost_func=10.7243\n", 730 | "> cl/cd=94.9233 -> cost_func=10.5348\n", 731 | "> cl/cd=91.7761 -> cost_func=10.8961\n", 732 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 733 | "> cl/cd=92.0957 -> cost_func=10.8583\n", 734 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 735 | "> cl/cd=89.3487 -> cost_func=11.1921\n", 736 | "> cl/cd=88.8990 -> cost_func=11.2487\n", 737 | "> cl/cd=90.9778 -> cost_func=10.9917\n", 738 | "> cl/cd=94.1339 -> cost_func=10.6232\n", 739 | "> cl/cd=97.4708 -> cost_func=10.2595\n", 740 | "> cl/cd=96.2321 -> cost_func=10.3915\n", 741 | "> cl/cd=103.9119 -> cost_func=9.6235\n", 742 | "> cl/cd=106.0881 -> cost_func=9.4261\n", 743 | "> cl/cd=111.5950 -> cost_func=8.9610\n", 744 | "> cl/cd=108.7397 -> cost_func=9.1963\n", 745 | "> cl/cd=109.9048 -> cost_func=9.0988\n", 746 | "> cl/cd=107.4933 -> cost_func=9.3029\n", 747 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 748 | "> cl/cd=117.7306 -> cost_func=8.4940\n", 749 | "> cl/cd=110.2235 -> cost_func=9.0725\n", 750 | "> cl/cd=121.5296 -> cost_func=8.2284\n" 751 | ] 752 | }, 753 | { 754 | "name": "stdout", 755 | "output_type": "stream", 756 | "text": [ 757 | "> cl/cd=113.1476 -> cost_func=8.8380\n", 758 | "> cl/cd=107.9424 -> cost_func=9.2642\n", 759 | "> cl/cd=113.0571 -> cost_func=8.8451\n", 760 | "> cl/cd=113.2068 -> cost_func=8.8334\n", 761 | "> cl/cd=112.4897 -> cost_func=8.8897\n", 762 | "> cl/cd=116.1898 -> cost_func=8.6066\n", 763 | "> cl/cd=111.9748 -> cost_func=8.9306\n", 764 | "> cl/cd=113.0670 -> cost_func=8.8443\n", 765 | "> cl/cd=116.3433 -> cost_func=8.5953\n", 766 | "> cl/cd=106.4416 -> cost_func=9.3948\n", 767 | "> cl/cd=125.6604 -> cost_func=7.9580\n", 768 | "> cl/cd=113.6479 -> cost_func=8.7991\n", 769 | "> cl/cd=126.5490 -> cost_func=7.9021\n", 770 | "> cl/cd=123.6645 -> cost_func=8.0864\n", 771 | "> cl/cd=117.1317 -> cost_func=8.5374\n", 772 | "> cl/cd=114.4231 -> cost_func=8.7395\n", 773 | "> cl/cd=124.5733 -> cost_func=8.0274\n", 774 | "> cl/cd=123.1040 -> cost_func=8.1232\n", 775 | "> cl/cd=111.9149 -> cost_func=8.9354\n", 776 | "> cl/cd=124.7702 -> cost_func=8.0147\n", 777 | "> cl/cd=127.3246 -> cost_func=7.8539\n", 778 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 779 | "> cl/cd=111.2206 -> cost_func=8.9911\n", 780 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 781 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 782 | "> cl/cd=130.5212 -> cost_func=7.6616\n", 783 | "> cl/cd=124.1390 -> cost_func=8.0555\n", 784 | "> cl/cd=125.7521 -> cost_func=7.9522\n", 785 | "> cl/cd=136.3497 -> cost_func=7.3341\n", 786 | "> cl/cd=124.4514 -> cost_func=8.0353\n", 787 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 788 | "> cl/cd=126.8770 -> cost_func=7.8817\n", 789 | "> cl/cd=126.3780 -> cost_func=7.9128\n", 790 | "> cl/cd=122.3053 -> cost_func=8.1763\n", 791 | "> cl/cd=118.5370 -> cost_func=8.4362\n", 792 | "> cl/cd=119.8565 -> cost_func=8.3433\n", 793 | "> cl/cd=118.9275 -> cost_func=8.4085\n", 794 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 795 | "> cl/cd=121.3251 -> cost_func=8.2423\n", 796 | "> cl/cd=128.5510 -> cost_func=7.7790\n", 797 | "> cl/cd=120.8533 -> cost_func=8.2745\n", 798 | "> cl/cd=119.7940 -> cost_func=8.3477\n", 799 | "> cl/cd=133.4483 -> cost_func=7.4935\n", 800 | "> cl/cd=132.0701 -> cost_func=7.5717\n", 801 | "> cl/cd=123.8654 -> cost_func=8.0733\n", 802 | "> cl/cd=133.6084 -> cost_func=7.4846\n", 803 | "> cl/cd=138.3418 -> cost_func=7.2285\n", 804 | "> cl/cd=121.2056 -> cost_func=8.2504\n", 805 | "> cl/cd=130.1621 -> cost_func=7.6827\n", 806 | "> cl/cd=0.0100 -> cost_func=100000.0000\n", 807 | "> cl/cd=136.0684 -> cost_func=7.3492\n", 808 | "> cl/cd=135.5719 -> cost_func=7.3762\n", 809 | "> cl/cd=133.5642 -> cost_func=7.4870\n", 810 | "> cl/cd=130.9106 -> cost_func=7.6388\n", 811 | "> cl/cd=134.4246 -> cost_func=7.4391\n", 812 | "> cl/cd=136.8114 -> cost_func=7.3093\n", 813 | "> cl/cd=131.8838 -> cost_func=7.5824\n", 814 | "> cl/cd=131.2460 -> cost_func=7.6193\n", 815 | "> cl/cd=133.7081 -> cost_func=7.4790\n", 816 | "> cl/cd=132.5164 -> cost_func=7.5462\n", 817 | "> cl/cd=129.3801 -> cost_func=7.7292\n", 818 | "> cl/cd=124.5663 -> cost_func=8.0279\n", 819 | "> cl/cd=133.6993 -> cost_func=7.4795\n" 820 | ] 821 | } 822 | ], 823 | "source": [ 824 | "opt = sa.minimize(cost_function, res.x, opt_mode = 'continuous', step_max=500, t_max=2.5, t_min=0, damping=0.01) " 825 | ] 826 | }, 827 | { 828 | "cell_type": "code", 829 | "execution_count": 19, 830 | "metadata": {}, 831 | "outputs": [ 832 | { 833 | "name": "stdout", 834 | "output_type": "stream", 835 | "text": [ 836 | "+------------------------ RESULTS -------------------------+\n", 837 | "\n", 838 | " opt.mode: continuous\n", 839 | "cooling sched.: linear additive cooling\n", 840 | " damping: 0.01\n", 841 | "\n", 842 | " initial temp: 2.5\n", 843 | " final temp: 0.005000\n", 844 | " max steps: 500\n", 845 | " final step: 500\n", 846 | "\n", 847 | " final energy: 7.228474\n", 848 | "\n", 849 | "+-------------------------- END ---------------------------+\n" 850 | ] 851 | } 852 | ], 853 | "source": [ 854 | "opt.results()" 855 | ] 856 | }, 857 | { 858 | "cell_type": "code", 859 | "execution_count": 20, 860 | "metadata": {}, 861 | "outputs": [ 862 | { 863 | "name": "stdout", 864 | "output_type": "stream", 865 | "text": [ 866 | "> cl/cd=0.4283 -> cost_func=2334.7826\n" 867 | ] 868 | }, 869 | { 870 | "data": { 871 | "text/plain": [ 872 | "2334.782608695652" 873 | ] 874 | }, 875 | "execution_count": 20, 876 | "metadata": {}, 877 | "output_type": "execute_result" 878 | } 879 | ], 880 | "source": [ 881 | "# initial\n", 882 | "# note that the initial airfoil did produce just the smallest bit of lift \n", 883 | "# which is why the cost function is greater than zero...\n", 884 | "cost_function(opt.x0)" 885 | ] 886 | }, 887 | { 888 | "cell_type": "code", 889 | "execution_count": 21, 890 | "metadata": {}, 891 | "outputs": [ 892 | { 893 | "name": "stdout", 894 | "output_type": "stream", 895 | "text": [ 896 | "> cl/cd=138.3418 -> cost_func=7.2285\n" 897 | ] 898 | }, 899 | { 900 | "data": { 901 | "text/plain": [ 902 | "7.228473581213308" 903 | ] 904 | }, 905 | "execution_count": 21, 906 | "metadata": {}, 907 | "output_type": "execute_result" 908 | } 909 | ], 910 | "source": [ 911 | "# final\n", 912 | "cost_function(opt.best_state)" 913 | ] 914 | }, 915 | { 916 | "cell_type": "code", 917 | "execution_count": 22, 918 | "metadata": {}, 919 | "outputs": [ 920 | { 921 | "data": { 922 | "image/png": "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\n", 923 | "text/plain": [ 924 | "
" 925 | ] 926 | }, 927 | "metadata": { 928 | "needs_background": "light" 929 | }, 930 | "output_type": "display_data" 931 | } 932 | ], 933 | "source": [ 934 | "airfoil_initial = bezier_airfoil(x_cos, munge_ctlpts(opt.x0, 3, 3))\n", 935 | "airfoil_final = bezier_airfoil(x_cos, munge_ctlpts(opt.best_state, 3, 3))\n", 936 | "\n", 937 | "fig, ax = plt.subplots(figsize=(14,5))\n", 938 | "\n", 939 | "x_initial, y_initial=zip(*airfoil_initial)\n", 940 | "x_final, y_final=zip(*airfoil_final)\n", 941 | "\n", 942 | "plt.plot(x_initial, y_initial, label='initial')\n", 943 | "plt.plot(x_final, y_final, label='final')\n", 944 | "plt.title('results')\n", 945 | "\n", 946 | "plt.legend()\n", 947 | "plt.ylim(-0.15, 0.15)\n", 948 | "ax.set_aspect('equal')\n", 949 | "plt.show()" 950 | ] 951 | }, 952 | { 953 | "cell_type": "code", 954 | "execution_count": null, 955 | "metadata": {}, 956 | "outputs": [], 957 | "source": [] 958 | } 959 | ], 960 | "metadata": { 961 | "kernelspec": { 962 | "display_name": "Python 3", 963 | "language": "python", 964 | "name": "python3" 965 | }, 966 | "language_info": { 967 | "codemirror_mode": { 968 | "name": "ipython", 969 | "version": 3 970 | }, 971 | "file_extension": ".py", 972 | "mimetype": "text/x-python", 973 | "name": "python", 974 | "nbconvert_exporter": "python", 975 | "pygments_lexer": "ipython3", 976 | "version": "3.6.9" 977 | } 978 | }, 979 | "nbformat": 4, 980 | "nbformat_minor": 4 981 | } 982 | --------------------------------------------------------------------------------