Credits
30
Tokens
145,045
import numpy as np
import matplotlib.pyplot as plt
# Visual: L/T vs N for each CL
N_arr = np.linspace(1, 10, 50)
AR = 10.0
fig, axes = plt.subplots(1, 2, figsize=(12, 4.5))
ax = axes[0]
for CL in [1, 2, 3]:
LT = 4*N_arr*CL/(np.pi*AR)
ax.plot(N_arr, LT, label=f'CL = {CL}', linewidth=2)
for N in [1, 5, 10]:
for CL in [1, 2, 3]:
ax.plot(N, 4*N*CL/(np.pi*AR), 'ko', markersize=5)
ax.axhline(1.0, color='gray', linestyle=':', alpha=0.7, label='L/T = 1 (hover-equivalent)')
ax.set_xlabel('Number of propellers N')
ax.set_ylabel('L/T')
ax.set_title('L/T vs N (slipstream-referenced, baseline model)')
ax.legend()
ax.grid(True, alpha=0.3)
# Disk loading and slipstream velocity vs N
ax = axes[1]
T = 100.0; rho = 1.225; S = 1.0; b = np.sqrt(AR*S)
DL = 4*T*N_arr/(np.pi*S*AR)
Vs = np.sqrt(2*DL/rho)
ax2 = ax.twinx()
l1, = ax.plot(N_arr, DL, 'b-', linewidth=2, label='Disk loading [Pa]')
l2, = ax2.plot(N_arr, Vs, 'r--', linewidth=2, label='Slipstream V_s [m/s]')
ax.set_xlabel('N'); ax.set_ylabel('Disk loading T/A_total [Pa]', color='b')
ax2.set_ylabel('Slipstream velocity V_s [m/s]', color='r')
ax.set_title(f'Disk loading & V_s vs N (T = {T} N reference)')
ax.legend(handles=[l1, l2], loc='upper left')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# Table summary
print("\n" + "="*70)
print("FINAL L/T TABLE β slipstream-referenced (V_s = 2 v_i)")
print("="*70)
print(f"{'N':>4} | {'CL=1':>10} | {'CL=2':>10} | {'CL=3':>10}")
print("-"*50)
for N in [1, 5, 10]:
vals = [4*N*CL/(np.pi*AR) for CL in [1,2,3]]
print(f"{N:>4} | {vals[0]:>10.4f} | {vals[1]:>10.4f} | {vals[2]:>10.4f}")
| Symbol | Definition | Units |
|---|---|---|
| \(S\) | ||
| \(AR\) | ||
| \(b\) | ||
| \(c\) | ||
| \(N\) | ||
| \(T\) | ||
| \(T_i\) | ||
| \(d\) | ||
| \(A_d\) | ||
| \(A_{total}\) | ||
| \(A_s\) | ||
| \(\rho\) | ||
| \(v_i\) | ||
| \(V_s\) | ||
| \(q_s\) | ||
| \(DL\) | ||
| \(C_L\) | ||
| \(L\) | ||
| \(L/T\) |
import math
S=1.0
AR=10.0
b=math.sqrt(AR*S)
rho=1.225
Ns=[1,5,10]
CLs=[1,2,3]
print('b',b,'c',b/AR)
for N in Ns:
d=b/N
Ad=math.pi*d*d/4
Atot=N*Ad
coeff=4*N*S/(math.pi*b*b)
print(N, 'd',d, 'Ad',Ad, 'Atot',Atot, 'L/T coeff per CL',coeff, 'DL/T coeff',1/Atot)
for CL in CLs:
print(' CL',CL,'L/T',CL*coeff)
b 3.1622776601683795 c 0.31622776601683794 1 d 3.1622776601683795 Ad 7.853981633974484 Atot 7.853981633974484 L/T coeff per CL 0.12732395447351627 DL/T coeff 0.12732395447351627 CL 1 L/T 0.12732395447351627 CL 2 L/T 0.25464790894703254 CL 3 L/T 0.3819718634205488 5 d 0.6324555320336759 Ad 0.31415926535897937 Atot 1.5707963267948968 L/T coeff per CL 0.6366197723675813 DL/T coeff 0.6366197723675813 CL 1 L/T 0.6366197723675813 CL 2 L/T 1.2732395447351625 CL 3 L/T 1.9098593171027438 10 d 0.31622776601683794 Ad 0.07853981633974484 Atot 0.7853981633974484 L/T coeff per CL 1.2732395447351625 DL/T coeff 1.2732395447351625 CL 1 L/T 1.2732395447351625 CL 2 L/T 2.546479089470325 CL 3 L/T 3.8197186342054876
| Symbol | Definition | Units |
|---|---|---|
| \(S\) | ||
| \(AR\) | ||
| \(b\) | ||
| \(c\) | ||
| \(N\) | ||
| \(T\) | ||
| \(T_i\) | ||
| \(d\) | ||
| \(A_d\) | ||
| \(A_{total}\) | ||
| \(V_\inf ty\) | ||
| \(v_i\) | ||
| \(V_s\) | ||
| \(\rho\) | ||
| \(q_s\) | ||
| \(q_{eff}\) | ||
| \(L\) | ||
| \(C_L\) | ||
| \(L/T\) | ||
| \(DL\) | ||
| \(S_{slip}\) |
import numpy as np
import matplotlib.pyplot as plt
# Visual: L/T vs N for each CL
N_arr = np.linspace(1, 10, 50)
AR = 10.0
fig, axes = plt.subplots(1, 2, figsize=(12, 4.5))
ax = axes[0]
for CL in [1, 2, 3]:
LT = 4*N_arr*CL/(np.pi*AR)
ax.plot(N_arr, LT, label=f'CL = {CL}', linewidth=2)
for N in [1, 5, 10]:
for CL in [1, 2, 3]:
ax.plot(N, 4*N*CL/(np.pi*AR), 'ko', markersize=5)
ax.axhline(1.0, color='gray', linestyle=':', alpha=0.7, label='L/T = 1 (hover-equivalent)')
ax.set_xlabel('Number of propellers N')
ax.set_ylabel('L/T')
ax.set_title('L/T vs N (slipstream-referenced, baseline model)')
ax.legend()
ax.grid(True, alpha=0.3)
# Disk loading and slipstream velocity vs N
ax = axes[1]
T = 100.0; rho = 1.225; S = 1.0; b = np.sqrt(AR*S)
DL = 4*T*N_arr/(np.pi*S*AR)
Vs = np.sqrt(2*DL/rho)
ax2 = ax.twinx()
l1, = ax.plot(N_arr, DL, 'b-', linewidth=2, label='Disk loading [Pa]')
l2, = ax2.plot(N_arr, Vs, 'r--', linewidth=2, label='Slipstream V_s [m/s]')
ax.set_xlabel('N'); ax.set_ylabel('Disk loading T/A_total [Pa]', color='b')
ax2.set_ylabel('Slipstream velocity V_s [m/s]', color='r')
ax.set_title(f'Disk loading & V_s vs N (T = {T} N reference)')
ax.legend(handles=[l1, l2], loc='upper left')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# Table summary
print("\n" + "="*70)
print("FINAL L/T TABLE β slipstream-referenced (V_s = 2 v_i)")
print("="*70)
print(f"{'N':>4} | {'CL=1':>10} | {'CL=2':>10} | {'CL=3':>10}")
print("-"*50)
for N in [1, 5, 10]:
vals = [4*N*CL/(np.pi*AR) for CL in [1,2,3]]
print(f"{N:>4} | {vals[0]:>10.4f} | {vals[1]:>10.4f} | {vals[2]:>10.4f}")
====================================================================== FINAL L/T TABLE β slipstream-referenced (V_s = 2 v_i) ====================================================================== N | CL=1 | CL=2 | CL=3 -------------------------------------------------- 1 | 0.1273 | 0.2546 | 0.3820 5 | 0.6366 | 1.2732 | 1.9099 10 | 1.2732 | 2.5465 | 3.8197
import numpy as np
import matplotlib.pyplot as plt
# Visual: L/T vs N for each CL
N_arr = np.linspace(1, 10, 50)
AR = 10.0
fig, axes = plt.subplots(1, 2, figsize=(12, 4.5))
ax = axes[0]
for CL in [1, 2, 3]:
LT = 4*N_arr*CL/(np.pi*AR)
ax.plot(N_arr, LT, label=f'CL = {CL}', linewidth=2)
for N in [1, 5, 10]:
for CL in [1, 2, 3]:
ax.plot(N, 4*N*CL/(np.pi*AR), 'ko', markersize=5)
ax.axhline(1.0, color='gray', linestyle=':', alpha=0.7, label='L/T = 1 (hover-equivalent)')
ax.set_xlabel('Number of propellers N')
ax.set_ylabel('L/T')
ax.set_title('L/T vs N (slipstream-referenced, baseline model)')
ax.legend()
ax.grid(True, alpha=0.3)
# Disk loading and slipstream velocity vs N
ax = axes[1]
T = 100.0; rho = 1.225; S = 1.0; b = np.sqrt(AR*S)
DL = 4*T*N_arr/(np.pi*S*AR)
Vs = np.sqrt(2*DL/rho)
ax2 = ax.twinx()
l1, = ax.plot(N_arr, DL, 'b-', linewidth=2, label='Disk loading [Pa]')
l2, = ax2.plot(N_arr, Vs, 'r--', linewidth=2, label='Slipstream V_s [m/s]')
ax.set_xlabel('N'); ax.set_ylabel('Disk loading T/A_total [Pa]', color='b')
ax2.set_ylabel('Slipstream velocity V_s [m/s]', color='r')
ax.set_title(f'Disk loading & V_s vs N (T = {T} N reference)')
ax.legend(handles=[l1, l2], loc='upper left')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# Table summary
print("\n" + "="*70)
print("FINAL L/T TABLE β slipstream-referenced (V_s = 2 v_i)")
print("="*70)
print(f"{'N':>4} | {'CL=1':>10} | {'CL=2':>10} | {'CL=3':>10}")
print("-"*50)
for N in [1, 5, 10]:
vals = [4*N*CL/(np.pi*AR) for CL in [1,2,3]]
print(f"{N:>4} | {vals[0]:>10.4f} | {vals[1]:>10.4f} | {vals[2]:>10.4f}")
====================================================================== FINAL L/T TABLE β slipstream-referenced (V_s = 2 v_i) ====================================================================== N | CL=1 | CL=2 | CL=3 -------------------------------------------------- 1 | 0.1273 | 0.2546 | 0.3820 5 | 0.6366 | 1.2732 | 1.9099 10 | 1.2732 | 2.5465 | 3.8197
import numpy as np
import pandas as pd
# Geometry
S = 1.0
AR = 10.0
b = np.sqrt(AR*S)
c = b/AR
rho = 1.225
print(f"Span b = {b:.4f} m, chord c = {c:.4f} m")
# Test parametrically for T = 100 N
T = 100.0 # arbitrary, will cancel in L/T
results = []
for N in [1, 5, 10]:
d = b/N
A_d = np.pi * d**2 / 4
A_total = N * A_d
DL = T / A_total # disk loading (N/m^2)
v_i = np.sqrt(T/(N) / (2*rho*A_d)) # induced velocity at disk plane
V_s = 2*v_i # far-wake slipstream velocity
q_s = 0.5*rho*V_s**2 # = DL (verify)
row = {'N': N, 'd [m]': d, 'A_d [m^2]': A_d, 'A_total [m^2]': A_total,
'DL [Pa]': DL, 'v_i [m/s]': v_i, 'V_s [m/s]': V_s, 'q_s [Pa]': q_s}
results.append(row)
df_geo = pd.DataFrame(results)
print("\nGeometry & flow per configuration (T = 100 N):")
print(df_geo.to_string(index=False))
# L/T table
print("\n\nL/T = 4*N*CL/(pi*AR)")
print("="*60)
LT_table = pd.DataFrame(index=[1,5,10], columns=[1,2,3], dtype=float)
LT_table.index.name = 'N \\ CL'
for N in [1,5,10]:
for CL in [1,2,3]:
LT = 4*N*CL/(np.pi*AR)
LT_table.loc[N, CL] = LT
print(LT_table.round(4))
# Verify by direct computation
print("\nDirect verification (L = q_s * S * CL, then L/T):")
for N in [1,5,10]:
A_total = np.pi * (b/N)**2 / 4 * N
q_s = T/A_total
for CL in [1,2,3]:
L = q_s * S * CL
print(f" N={N}, CL={CL}: L = {L:.3f} N, L/T = {L/T:.4f}")
# Sensitivity: if q referenced at disk plane (v_i) instead of far wake (V_s = 2 v_i)
# then q is reduced by factor 4
print("\nSensitivity check β q referenced at disk plane (v_i):")
print("L/T would be reduced by factor 4: L/T = N*CL/(pi*AR)")
for N in [1,5,10]:
for CL in [1,2,3]:
print(f" N={N}, CL={CL}: L/T_disk-ref = {N*CL/(np.pi*AR):.4f}")
Span b = 3.1623 m, chord c = 0.3162 m
Geometry & flow per configuration (T = 100 N):
N d [m] A_d [m^2] A_total [m^2] DL [Pa] v_i [m/s] V_s [m/s] q_s [Pa]
1 3.162278 7.853982 7.853982 12.732395 2.279670 4.559340 12.732395
5 0.632456 0.314159 1.570796 63.661977 5.097497 10.194995 63.661977
10 0.316228 0.078540 0.785398 127.323954 7.208950 14.417900 127.323954
L/T = 4*N*CL/(pi*AR)
============================================================
1 2 3
N \ CL
1 0.1273 0.2546 0.3820
5 0.6366 1.2732 1.9099
10 1.2732 2.5465 3.8197
Direct verification (L = q_s * S * CL, then L/T):
N=1, CL=1: L = 12.732 N, L/T = 0.1273
N=1, CL=2: L = 25.465 N, L/T = 0.2546
N=1, CL=3: L = 38.197 N, L/T = 0.3820
N=5, CL=1: L = 63.662 N, L/T = 0.6366
N=5, CL=2: L = 127.324 N, L/T = 1.2732
N=5, CL=3: L = 190.986 N, L/T = 1.9099
N=10, CL=1: L = 127.324 N, L/T = 1.2732
N=10, CL=2: L = 254.648 N, L/T = 2.5465
N=10, CL=3: L = 381.972 N, L/T = 3.8197
Sensitivity check β q referenced at disk plane (v_i):
L/T would be reduced by factor 4: L/T = N*CL/(pi*AR)
N=1, CL=1: L/T_disk-ref = 0.0318
N=1, CL=2: L/T_disk-ref = 0.0637
N=1, CL=3: L/T_disk-ref = 0.0955
N=5, CL=1: L/T_disk-ref = 0.1592
N=5, CL=2: L/T_disk-ref = 0.3183
N=5, CL=3: L/T_disk-ref = 0.4775
N=10, CL=1: L/T_disk-ref = 0.3183
N=10, CL=2: L/T_disk-ref = 0.6366
N=10, CL=3: L/T_disk-ref = 0.9549
| Symbol | Definition | Units |
|---|---|---|
| \(S\) | ||
| \(AR\) | ||
| \(b\) | ||
| \(c\) | ||
| \(N\) | ||
| \(T\) | ||
| \(T_i\) | ||
| \(d\) | ||
| \(A_d\) | ||
| \(A_{total}\) | ||
| \(\rho\) | ||
| \(v_i\) | ||
| \(V_s\) | ||
| \(q_s\) | ||
| \(DL\) | ||
| \(C_L\) | ||
| \(L\) | ||
| \(L/T\) |
import numpy as np
import pandas as pd
# Constants
S = 1.0 # m^2
AR = 10.0
b = np.sqrt(AR * S)
c = b / AR
rho = 1.225
results = []
for N in [1, 5, 10]:
d = b / N
A_total = N * np.pi * d**2 / 4
A_slip_contracted = A_total / 2
# Check coverage assuming slipstream covers full span, how much chord does it cover?
# Actually, slipstream diameter d_s = d / sqrt(2)
d_s = d / np.sqrt(2)
for CL in [1, 2, 3]:
# Based on L = CL * q_s * S
# q_s = T / A_total
# L = CL * (T / A_total) * S
# L/T = CL * S / A_total
# Since A_total = N * pi * (b/N)^2 / 4 = pi * b^2 / (4N) = pi * AR * S / (4N)
# L/T = CL * S / (pi * AR * S / (4N)) = 4 * N * CL / (pi * AR)
L_over_T = 4 * N * CL / (np.pi * AR)
results.append({
'N': N,
'CL': CL,
'Prop Dia (d)': round(d, 3),
'A_total': round(A_total, 3),
'A_slip_contracted': round(A_slip_contracted, 3),
'd_slip': round(d_s, 3),
'Wing Chord (c)': round(c, 3),
'L/T': round(L_over_T, 4)
})
df = pd.DataFrame(results)
print(df.to_string(index=False))
N CL Prop Dia (d) A_total A_slip_contracted d_slip Wing Chord (c) L/T 1 1 3.162 7.854 3.927 2.236 0.316 0.1273 1 2 3.162 7.854 3.927 2.236 0.316 0.2546 1 3 3.162 7.854 3.927 2.236 0.316 0.3820 5 1 0.632 1.571 0.785 0.447 0.316 0.6366 5 2 0.632 1.571 0.785 0.447 0.316 1.2732 5 3 0.632 1.571 0.785 0.447 0.316 1.9099 10 1 0.316 0.785 0.393 0.224 0.316 1.2732 10 2 0.316 0.785 0.393 0.224 0.316 2.5465 10 3 0.316 0.785 0.393 0.224 0.316 3.8197
| Symbol | Definition | Units |
|---|---|---|
| \(S\) | ||
| \(AR\) | ||
| \(b\) | ||
| \(c\) | ||
| \(N\) | ||
| \(T\) | ||
| \(T_i\) | ||
| \(d\) | ||
| \(A_d\) | ||
| \(A_{total}\) | ||
| \(A_s\) | ||
| \(d_s\) | ||
| \(V_\inf ty\) | ||
| \(V_s\) | ||
| \(\rho\) | ||
| \(q_s\) | ||
| \(q_{eff}\) | ||
| \(L\) | ||
| \(C_L\) | ||
| \(L/T\) | ||
| \(DL\) | ||
| \(S_{slip}\) | ||
| \(\alpha\) | ||
| \(a\) |