def ltfree(lK, Rg, alpha, beta, delta, omegat): ltx = np.cos(alpha) * np.cos(np.radians(omegat) + delta) + np.cos( beta) * lK - np.cos(np.radians(omegat)) * Rg lty = np.sin(np.radians(omegat) + delta) - np.sin(np.radians(omegat)) * Rg ltz = -np.sin(alpha) * np.cos(np.radians(omegat) + delta) + np.sin(beta) * lK return np.sqrt(ltx * ltx + lty * lty + ltz * ltz)
def Ftry(lK, Rg, alpha, betas, beta, delta, omegat, ot): cb = np.cos(beta) sb = np.sin(beta) ca = np.cos(alpha) sa = np.sin(alpha) cbs = np.cos(betas) sbs = np.sin(betas) cot = np.cos(np.radians(omegat) + ot) sot = np.sin(np.radians(omegat) + ot) cotd = np.cos(np.radians(omegat) + ot + delta) sotd = np.sin(np.radians(omegat) + ot + delta) # ekxx = ca * cbs ekxy = ca * sbs ekxz = -sa # ekyx = -sbs ekyy = cbs ekyz = 0 # ekzx = sa * cbs ekzy = sa * sbs ekzz = ca # ltx = ekxx * cotd + ekyx * sotd + cb * lK - cot * Rg lty = ekxy * cotd + ekyy * sotd - sot * Rg ltz = ekxz * cotd + sb * lK # return (ltx * ekyx + lty * ekyy + ltz * ekyz) / (ltx * ekzx + lty * ekzy + ltz * ekzz)
def Mgrz(lK, Rg, alpha, betas, beta, delta, omegat, ot): cb = np.cos(beta) sb = np.sin(beta) ca = np.cos(alpha) sa = np.sin(alpha) cbs = np.cos(betas) sbs = np.sin(betas) cot = np.cos(np.radians(omegat) + ot) sot = np.sin(np.radians(omegat) + ot) cotd = np.cos(np.radians(omegat) + ot + delta) sotd = np.sin(np.radians(omegat) + ot + delta) # ekxx = ca * cbs ekxy = ca * sbs ekxz = -sa # ekyx = -sbs ekyy = cbs ekyz = 0 # ekzx = sa * cbs ekzy = sa * sbs ekzz = ca # eaxx = ekxx * cotd + ekyx * sotd eaxy = ekxy * cotd + ekyy * sotd eaxz = ekxz * cotd # ltx = eaxx + cb * lK - cot * Rg lty = eaxy - sot * Rg ltz = eaxz + sb * lK # vcz = cot * lty - sot * ltx # return vcz / (ltx * ekzx + lty * ekzy + ltz * ekzz)
def rB(R, omegat): cot = np.cos(np.radians(omegat)) sot = np.sin(np.radians(omegat)) rBx = cot * R rBy = sot * R rBz = 0 return np.array([rBx, rBy, rBz])
def rA(lK, R, alpha, betas, beta, delta, omegat): cb = np.cos(beta) sb = np.sin(beta) ca = np.cos(alpha) sa = np.sin(alpha) cbs = np.cos(betas) sbs = np.sin(betas) cotd = np.cos(np.radians(omegat) + delta) sotd = np.sin(np.radians(omegat) + delta) rAx = (ca * cbs * cotd - sbs * sotd) * R + cb * lK rAy = (ca * sbs * cotd + cbs * sotd) * R rAz = (-sa * cotd) * R + sb * lK return np.array([rAx, rAy, rAz])
def arc(r0, R, e, n, phi0, phi): e1 = e / np.sqrt(np.sum(e * e)) # normalize en = n / np.sqrt(np.sum(n * n)) # normalize ip = np.argmax(phi > phi0) # find end index e2 = np.cross(en, e1) cp = np.cos(np.radians(phi[:ip])) sp = np.sin(np.radians(phi[:ip])) # r = cp*e1+sp*e2 r = np.zeros((3, ip)) r[0, :] = r0[0] + R * (cp * e1[0] + sp * e2[0]) r[1, :] = r0[1] + R * (cp * e1[1] + sp * e2[1]) r[2, :] = r0[2] + R * (cp * e1[2] + sp * e2[2]) return r
def cosgammag(lK, Rg, beta, delta, omegat): alpha = 0.5*np.pi-beta cb = np.cos(beta) sb = np.sin(beta) cot = np.cos(np.radians(omegat)) sot = np.sin(np.radians(omegat)) cotd = np.cos(np.radians(omegat)+delta) sotd = np.sin(np.radians(omegat)+delta) ltx = np.cos(alpha)*cotd + cb*lK - cot*Rg lty = sotd - sot*Rg ltz = -np.sin(alpha)*cotd + sb*lK Rwx = cot*Rg Rwy = sot*Rg Rwz = 0 lt = np.sqrt(ltx*ltx+lty*lty+ltz*ltz) return (Rwx*lty-Rwy*ltx)/(lt*Rg)
def vt(lK, Rg, beta, delta, omegat): alpha = 0.5*np.pi-beta cb = np.cos(beta) sb = np.sin(beta) ca = np.cos(alpha) sa = np.sin(alpha) cot = np.cos(np.radians(omegat)) sot = np.sin(np.radians(omegat)) cotd = np.cos(np.radians(omegat)+delta) sotd = np.sin(np.radians(omegat)+delta) ltx = ca*cotd + cb*lK - cot*Rg lty = sotd - sot*Rg ltz = -sa*cotd + sb*lK lt = np.sqrt(ltx*ltx+lty*lty+ltz*ltz) dltxdt = -ca*sotd + sot*Rg dltydt = cotd - cot*Rg dltzdt = sa*sotd return (ltx*dltxdt+lty*dltydt+ltz*dltzdt)/lt
def cosgammak(lK, Rg, beta, delta, omegat): alpha = 0.5*np.pi-beta cb = np.cos(beta) sb = np.sin(beta) ca = np.cos(alpha) sa = np.sin(alpha) cot = np.cos(np.radians(omegat)) sot = np.sin(np.radians(omegat)) cotd = np.cos(np.radians(omegat)+delta) sotd = np.sin(np.radians(omegat)+delta) Rax = ca*cotd Ray = sotd Raz = -sa*cotd ltx = Rax + cb*lK - cot*Rg lty = Ray - sot*Rg ltz = Raz + sb*lK lt = np.sqrt(ltx*ltx+lty*lty+ltz*ltz) return (sa*(Ray*ltz-Raz*lty) + ca*(Rax*lty-Ray*ltx))/lt
def Marz(lK, Rg, alpha, betas, beta, delta, omegat, ot): cb = np.cos(beta) sb = np.sin(beta) ca = np.cos(alpha) sa = np.sin(alpha) cbs = np.cos(betas) sbs = np.sin(betas) cot = np.cos(np.radians(omegat) + ot) sot = np.sin(np.radians(omegat) + ot) cotd = np.cos(np.radians(omegat) + ot + delta) sotd = np.sin(np.radians(omegat) + ot + delta) # ekxx = ca * cbs ekxy = ca * sbs ekxz = -sa # ekyx = -sbs ekyy = cbs ekyz = 0 # ekzx = sa * cbs ekzy = sa * sbs ekzz = ca # eaxx = ekxx * cotd + ekyx * sotd eaxy = ekxy * cotd + ekyy * sotd eaxz = ekxz * cotd # ltx = eaxx + cb * lK - cot * Rg lty = eaxy - sot * Rg ltz = eaxz + sb * lK # vcx = eaxy * ltz - eaxz * lty vcy = eaxz * ltx - eaxx * ltz vcz = eaxx * lty - eaxy * ltx # d = ltx * ekzx + lty * ekzy + ltz * ekzz # return np.where(d > dmin, (vcx * ekzx + vcy * ekzy + vcz * ekzz) / d, 0.0)
def gammak2(lK, Rg, beta, delta, omegat): alpha = 0.5 * np.pi - beta cb = np.cos(beta) sb = np.sin(beta) cot = np.cos(np.radians(omegat)) sot = np.sin(np.radians(omegat)) cotd = np.cos(np.radians(omegat) + delta) sotd = np.sin(np.radians(omegat) + delta) cotdt = np.cos(np.radians(omegat + 90) + delta) sotdt = np.sin(np.radians(omegat + 90) + delta) ltx = np.cos(alpha) * cotd + cb * lK - cot * Rg lty = sotd - sot * Rg ltz = -np.sin(alpha) * cotd + sb * lK eyrx = np.cos(alpha) * cotdt eyry = sotdt eyrz = -np.sin(alpha) * cotdt lt = np.sqrt(ltx * ltx + lty * lty + ltz * ltz) return np.degrees(np.arccos((eyrx * ltx + eyry * lty + eyrz * ltz) / lt))
cot = np.cos(np.radians(omegat)) sot = np.sin(np.radians(omegat)) cotd = np.cos(np.radians(omegat)+delta) sotd = np.sin(np.radians(omegat)+delta) ltx = ca*cotd + cb*lK - cot*Rg lty = sotd - sot*Rg ltz = -sa*cotd + sb*lK lt = np.sqrt(ltx*ltx+lty*lty+ltz*ltz) dltxdt = -ca*sotd + sot*Rg dltydt = cotd - cot*Rg dltzdt = sa*sotd return (ltx*dltxdt+lty*dltydt+ltz*dltzdt)/lt f, (ax1, ax2) = plt.subplots(1, 2) beta = np.radians(30) delta = np.radians(0) lK = 2 Rg = 1 omegat = np.arange(0, 360, 1) ax1.plot(omegat, cosgammak(lK, Rg, beta, delta, omegat), 'r') # gammak ax1.plot(omegat, Rg*cosgammag(lK, Rg, beta, delta, omegat), 'b') # Rg*gammag ax1.plot(omegat, vt(lK, Rg, beta, delta, omegat), 'g') ax1.plot(omegat, cosgammak(lK, Rg, beta, delta, omegat) - Rg*cosgammag(lK, Rg, beta, delta, omegat) - vt(lK, Rg, beta, delta, omegat), 'k--') ax1.set_xlim(0,360) ax1.set_ylim(-1,1) ax1.set_xticks(np.arange(0,361,90)) ax1.set_yticks(np.arange(-1,1.1,0.5))
def ea(alpha, betas, delta, omegat): cotd = np.cos(np.radians(omegat) + delta) sotd = np.sin(np.radians(omegat) + delta) T = ek(alpha, betas) e = np.array([[cotd, -sotd, 0], [sotd, cotd, 0], [0, 0, 1]]) return T.dot(e)
# mean aerodynamic moment over one cycle def Marzmean(lK, Rg, alpha, betas, beta, delta): pos = np.array([0, 0.5 * np.pi, np.pi, 1.5 * np.pi]) omegat = np.arange(0, 360, 1) alpha, betas = orientation(lK, Rg, alpha, betas, beta, delta, omegat, pos) return alpha, np.mean( Marzsum(lK, Rg, alpha, betas, beta, delta, omegat, pos)), Ftrminmax(lK, Rg, alpha, betas, beta, delta, omegat, pos) vMarzmean = np.vectorize(Marzmean) #f, (ax1, ax2) = plt.subplots(1, 2) alpha = np.radians(60) beta = np.radians(30) betas = np.radians(0) delta = np.radians(45) N = 4 lK = np.arange(1.0, 5.2, 0.02) # 0.02 is for print quality Rg = np.arange(0.0, 3.2, 0.02) # 0.02 is for print quality x, y = np.meshgrid(lK, Rg) a, z, f = vMarzmean(x, y, alpha, betas, beta, delta) h = np.sin(beta) * lK - np.sin(a) h1 = np.sin(beta) * lK - np.sin(a) * 1.5 h2 = np.sin(beta) * lK - np.sin(a) * 2.0 h3 = np.sin(beta) * lK - np.sin(a) * 2.5
# max tether length over cycle def ltmax(lK, Rg, beta, delta): omegat = np.arange(0, 360, 1) return np.amax(lt(lK, Rg, beta, delta, omegat)) vltfreemin = np.vectorize(ltfreemin) vltfreemax = np.vectorize(ltfreemax) vltmin = np.vectorize(ltmin) vltmax = np.vectorize(ltmax) f, (ax1, ax2) = plt.subplots(1, 2) lK = 2 Rg = 1 beta = np.radians(np.arange(0, 91, 1)) delta = np.radians(0) ax1.plot(np.degrees(beta), vltmax(lK, Rg, beta, delta), 'r') ax1.plot(np.degrees(beta), vltmin(lK, Rg, beta, delta), 'b') #print 'ltmin & ltmax ', ltmin(lK, Rg, np.radians(30), delta), ltmax(lK, Rg, np.radians(30), delta) delta = np.radians(30) ax1.plot(np.degrees(beta), vltmax(lK, Rg, beta, delta), 'r') ax1.plot(np.degrees(beta), vltmin(lK, Rg, beta, delta), 'b') delta = np.radians(60) ax1.plot(np.degrees(beta), vltmax(lK, Rg, beta, delta), 'r') ax1.plot(np.degrees(beta), vltmin(lK, Rg, beta, delta), 'b') delta = np.radians(90) ax1.plot(np.degrees(beta), vltmax(lK, Rg, beta, delta), 'r') ax1.plot(np.degrees(beta), vltmin(lK, Rg, beta, delta), 'b') delta = np.radians(120) #ax1.plot(np.degrees(beta), vltmax(lK, Rg, beta, delta), 'r')
return alpha, betas, Ma, Mg def Marzmean0(lK, Rg, alpha, betas, beta, delta): pos = np.array([0, 0.5 * np.pi, np.pi, 1.5 * np.pi]) omegat = np.arange(0, 360, 1) return np.mean(Marzsum(lK, Rg, alpha, betas, beta, delta, omegat, pos)) vw = 12. Rg = 25. Rk = 20. Rko = 35. N = 4 lK = 100. beta = np.radians(30) omega = 2.05 delta = np.radians(45) Pnom = 1.4e6 rho = 1.225 lKRk = lK / Rk RgRk = Rg / Rk vtip = omega * Rko lam = omega * Rko / vw Ma = Pnom / omega S = np.pi * (Rko * Rko - Rk * Rk) alpha = np.radians(60) # Initial value betas = np.radians(0) # Initial value a, b, c, d = Marzmean(lKRk, RgRk, alpha, betas, beta, delta)
def eb(omegat): cot = np.cos(np.radians(omegat)) sot = np.sin(np.radians(omegat)) return np.array([[cot, -sot, 0], [sot, cot, 0], [0, 0, 1]])
Mg = np.mean(Marzsum(lK, Rg, a, b, beta, delta, omegat, pos)) return alpha, betas, Ma, Mg def Marzmean0(lK, Rg, alpha, betas, beta, delta): pos = np.array([0, 0.5 * np.pi, np.pi, 1.5 * np.pi]) omegat = np.arange(0, 360, 1) return np.mean(Marzsum(lK, Rg, alpha, betas, beta, delta, omegat, pos)) vMarzmean = np.vectorize(Marzmean) vMarzmean0 = np.vectorize(Marzmean0) f, (ax1, ax2) = plt.subplots(1, 2) alpha = np.radians(60) # 90 - beta | 62.3608549873 betas = np.radians(0) # 4.38381787735 lK = 2 Rg = 1 N = 4 delta = np.arange(0, 181, 1) beta = np.radians(30) a, b, Ma, Mg = vMarzmean(lK, Rg, alpha, betas, beta, np.radians(delta)) ax1.plot(delta, np.degrees(a), 'r', label=r"\$\alpha\$") ax1.plot(delta, np.degrees(b), 'b', label=r"\$\betas\$") ax2.plot(delta, Ma, 'r', label=r"\$\Mamean/(\Rk\Fakz)\$") #ax2.plot(delta, vMarzmean0(lK, Rg, alpha, betas, beta, np.radians(delta)), 'b--') beta = np.radians(45)
d = np.amax(Ftrysum(lK, Rg, alpha, betas, beta, delta, omegat, pos)) return (np.abs(b-a)+np.abs(d-c)+np.abs(a+b)+np.abs(c+d)) def fopt(f, lK, Rg, alpha, betas, beta, delta, omegat, pos): def foptfixed(p): return f(lK, Rg, p[0], p[1], beta, delta, omegat, pos) return foptfixed def orientation(lK, Rg, alpha, betas, beta, delta, omegat, pos): guess = [ alpha, betas ] return fmin(fopt(Ftrminmax, lK, Rg, alpha, betas, beta, delta, omegat, pos), guess, xtol=0.00001, ftol=0.00001, maxiter=100) f, (ax1, ax2) = plt.subplots(1, 2) beta = np.radians(30) alpha = np.radians(60) # 90 - beta | 62.3608549873 betas = np.radians(0) # 4.38381787735 delta = np.radians(30) # 30 lK = 2 Rg = 1 N = 4 pos = np.array([ 0, 0.5*np.pi, np.pi, 1.5*np.pi ]) omegat = np.arange(0, 360, 1) a, b = orientation(lK, Rg, alpha, betas, beta, delta, omegat, pos) print "alpha = ", np.degrees(a), " betas = ",np.degrees(b) alpha = a betas = b ax1.plot(omegat, Ftrxsum(lK, Rg, alpha, betas, beta, delta, omegat, pos), 'r', label=r"\$\Fakx/\Fakz\$")
sotdt = np.sin(np.radians(omegat + 90) + delta) ltx = np.cos(alpha) * cotd + cb * lK - cot * Rg lty = sotd - sot * Rg ltz = -np.sin(alpha) * cotd + sb * lK eyrx = np.cos(alpha) * cotdt eyry = sotdt eyrz = -np.sin(alpha) * cotdt lt = np.sqrt(ltx * ltx + lty * lty + ltz * ltz) return np.degrees(np.arccos((eyrx * ltx + eyry * lty + eyrz * ltz) / lt)) f, (ax1, ax2) = plt.subplots(1, 2) lK = 2 Rg = 1 beta = np.radians(30) omegat = np.arange(0, 360, 1) delta = np.radians(0) ax1.plot(omegat, gammag(lK, Rg, beta, delta, omegat), 'r') #ax1.plot(omegat, gammak(lK, Rg, beta, delta, omegat), 'b--') #print "gammag @ 90deg = ", gammag(lK, Rg, beta, delta, 90) #print "gammag @ 270deg = ", gammag(lK, Rg, beta, delta, 270) #print "gammag_max = ", np.max(gammag(lK, Rg, beta, delta, omegat)) #print "gammag_min = ", np.min(gammag(lK, Rg, beta, delta, omegat)) #print "max @ = ", omegat[np.argmax(gammag(lK, Rg, beta, delta, omegat))] #print "min @ = ", omegat[np.argmin(gammag(lK, Rg, beta, delta, omegat))] #print "gammag_max = ", gammag(lK, Rg, beta, delta, omegat[np.argmax(gammag(lK, Rg, beta, delta, omegat))]) #print "gammag_min = ", gammag(lK, Rg, beta, delta, omegat[np.argmin(gammag(lK, Rg, beta, delta, omegat))]) delta = np.radians(30) ax1.plot(omegat, gammag(lK, Rg, beta, delta, omegat), 'r')
# # This is important for font substitution mpl.rcParams['svg.fonttype'] = 'none' def orthogonal_proj(zfront, zback): a = (zfront + zback) / (zfront - zback) b = -2 * (zfront * zback) / (zfront - zback) # -0.0001 added for numerical stability as suggested in: # http://stackoverflow.com/questions/23840756 return np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, a, b], [0, 0, -0.0001, zback]]) # Propblem parameters beta = np.radians(30) alpha = np.radians(60) # 90 - beta betas = np.radians(10) delta = np.radians(30) lK = 100 Rg = 25 Rk = 20 Rko = 35 le = 40 N = 4 ot0 = 40 # offset ot = np.array([0, 90, 180, 270]) # Derived trigonometric data omegat = np.arange(0, 361, 1)