1031: 求绝对值

时间限制 : 1.000 sec  内存限制 : 128 MB

题目描述

绝对值是指一个数在数轴上所对应点到原点的距离,用“| |”来表示。|b-a|或|a-b|表示数轴上表示a的点和表示b的点的距离。

在数学中,绝对值或模数| x | 的非负值,而不考虑其符号,即| x | = x表示正x,| x | = -x表示负x(在这种情况下-x为正),| 0 | = 0。例如,3的绝对值为3,-3的绝对值也为3。数字的绝对值可以被认为是与零的距离。输入一个整数,输出其绝对值。

输入

一行,包含一个整数n。

样例输入 Copy

一行,包含一个整数,表示n的绝对值。

样例输出 Copy

-5

(venv) PS C:\Users\caoao\Desktop\airfoil_analysis> python aerodynamics_analysis.py ============================================================ NACA 22012 Aerodynamic Analysis Program ============================================================ ============================================================ Analyzing NACA 22012 at α=5.0° with 150 panels ============================================================ 翼型图已保存为 naca22012_airfoil.png Results for α=5.0°: Kutta-Joukowski C_L: 0.863583 Pressure Integration C_L: 1.482327 Thin Airfoil Theory C_L: 0.776106 Zero-Lift Angle (Thin Airfoil): -2.0772° Total Circulation: 0.431824 压力分布图已保存为 pressure_distribution_alpha_5.0.png ============================================================ Analyzing Lift Curve with 150 panels ============================================================ α=-5°: C_L_KJ=-0.3452, C_L_P=-13.3478, C_L_thin=-0.3205 α=-4°: C_L_KJ=-0.2242, C_L_P=-10.6091, C_L_thin=-0.2109 α=-3°: C_L_KJ=-0.1031, C_L_P=-8.2105, C_L_thin=-0.1012 α=-2°: C_L_KJ=0.0180, C_L_P=-6.1308, C_L_thin=0.0085 α=-1°: C_L_KJ=0.1391, C_L_P=-4.3475, C_L_thin=0.1181 α=0°: C_L_KJ=0.2602, C_L_P=-2.8374, C_L_thin=0.2278 α=1°: C_L_KJ=0.3812, C_L_P=-1.5764, C_L_thin=0.3375 α=2°: C_L_KJ=0.5020, C_L_P=-0.5398, C_L_thin=0.4471 α=3°: C_L_KJ=0.6228, C_L_P=0.2980, C_L_thin=0.5568 α=4°: C_L_KJ=0.7433, C_L_P=0.9632, C_L_thin=0.6664 α=5°: C_L_KJ=0.8636, C_L_P=1.4823, C_L_thin=0.7761 α=6°: C_L_KJ=0.9836, C_L_P=1.8825, C_L_thin=0.8858 α=7°: C_L_KJ=1.1034, C_L_P=2.1913, C_L_thin=0.9954 α=8°: C_L_KJ=1.2228, C_L_P=2.4363, C_L_thin=1.1051 α=9°: C_L_KJ=1.3418, C_L_P=2.6455, C_L_thin=1.2148 α=10°: C_L_KJ=1.4604, C_L_P=2.8469, C_L_thin=1.3244 升力系数曲线图已保存为 lift_coefficient_curve.png Lift Curve Slope Analysis: Slope (per degree): 0.120482 Slope (per radian): 6.903111 Theoretical (2π): 6.283185 Analysis complete! Results saved as PNG files.
12-09
<think>我们注意到压力积分法计算的升力系数(C_L_P)明显偏大且符号错误。这通常是由于压力积分时法向量方向定义错误或升力方向投影计算错误导致的。我们将重点修正`compute_lift_coefficients`函数中的压力积分部分。 关键修正点: 1. 确保法向量方向为外法向(指向流体外部) 2. 修正升力方向投影公式 3. 检查压力系数符号定义 修正后的压力积分法计算升力系数部分: ```python def compute_lift_coefficients(gamma, V_tau, S, nx, ny, alpha_deg, chord=1.0, V_inf=1.0): """计算升力系数(修正版)""" # 1. Kutta-Joukowski法 Gamma = np.sum(gamma * S) C_L_KJ = 2 * Gamma / (V_inf * chord) # 2. 压力积分法(修正法向量方向) Cp = 1 - (V_tau / V_inf)**2 # 计算升力分量(修正方向) alpha_rad = np.deg2rad(alpha_deg) lift_force = 0.0 # 修正:升力方向垂直于来流方向,即:L = -∫ p * (n·y_lift) dS # 其中y_lift方向为垂直于来流向上,即 (sin(alpha), cos(alpha)) 的旋转 # 在全局坐标系中,升力方向向量为 (-sin(alpha), cos(alpha)) for i in range(len(S)): # 压力在升力方向的分量(修正公式) # dF_lift = -Cp[i] * ( -ny[i] * np.cos(alpha_rad) + nx[i] * np.sin(alpha_rad) ) * S[i] # 或者等价地:dF_lift = -Cp[i] * (np.sin(alpha_rad)*nx[i] - np.cos(alpha_rad)*ny[i]) * S[i] dF_lift = -Cp[i] * (np.sin(alpha_rad) * nx[i] - np.cos(alpha_rad) * ny[i]) * S[i] lift_force += dF_lift # 归一化升力系数 C_L_P = 2 * lift_force / (V_inf**2 * chord) return C_L_KJ, C_L_P, Gamma, Cp ``` 但是,根据之前的输出,压力积分法结果仍然不正确,可能是由于法向量方向定义在整个程序中不统一。我们需要检查涡面元法中法向量的定义。 在涡面元法中,我们定义: ```python nx = -dy / S # x分量(单位向量) ny = dx / S # y分量(单位向量) ``` 这个定义是基于从面板起点到终点的向量(dx,dy)顺时针旋转90度得到外法向(对于逆时针排列的面板,内部在左侧,所以外法向应该是(dy,-dx)归一化?)。实际上,对于逆时针排列的面板,外法向应该指向翼型外部。我们当前的定义是:法向量为(-dy, dx)/S,即旋转了90度,但方向需要验证。 另一种常见的定义是: ```python # 外法向:对于逆时针排列的面板,内部在左侧,所以将切向量(dx,dy)逆时针旋转90度得到外法向,即(-dy, dx) nx = -dy / S ny = dx / S ``` 这样定义是外法向。 然而,在压力积分中,我们使用这个法向量,并按照升力方向投影。升力方向垂直于来流,来流方向为(cos(alpha), sin(alpha)),所以升力方向为(-sin(alpha), cos(alpha))。 因此,升力分量为:dF_lift = -Cp * (n · lift_direction) * dS 其中,lift_direction = (-sin(alpha), cos(alpha)) 所以:n · lift_direction = nx*(-sin(alpha)) + ny*cos(alpha) 因此,代码中应该是: ```python dF_lift = -Cp[i] * (nx[i]*(-np.sin(alpha_rad)) + ny[i]*np.cos(alpha_rad)) * S[i] ``` 或者写成: ```python dF_lift = -Cp[i] * ( -np.sin(alpha_rad)*nx[i] + np.cos(alpha_rad)*ny[i] ) * S[i] ``` 注意:这里负号是因为压力方向与法向量方向相反(压力指向翼型内部,而法向量指向外部),所以有负号。 但是,我们观察之前的输出,压力积分法的结果不仅数值过大,而且符号也出现了问题(负攻角时压力积分法升力系数为负,但绝对值很大)。因此,我们怀疑可能是法向量方向定义反了。 我们可以尝试将法向量反向,即: ```python nx = dy / S # 反向 ny = -dx / S # 反向 ``` 然后重新运行程序。或者,我们可以在压力积分公式中调整符号。 为了确保一致性,我们重新审视涡面元法中的法向量定义:对于逆时针排列的面板,外法向应该指向翼型外部。在生成翼型时,我们是从下表面后缘开始,逆时针到上表面后缘结束。因此,对于下表面,法向量应该向下;对于上表面,法向量应该向上。我们可以通过绘制法向量来验证。 由于时间关系,我们采用一个简单策略:将压力积分公式中的法向量方向取反,因为当前结果明显错误。 修正:在压力积分中,我们使用内法向(即指向翼型内部)来计算压力合力。因为压力总是垂直于表面指向内部,所以合力计算应该使用内法向。 因此,我们可以在计算压力积分时,使用内法向(即当前法向的反向): ```python # 使用内法向 nix = -nx[i] # 内法向x分量 niy = -ny[i] # 内法向y分量 # 升力方向分量:内法向在升力方向的投影 dF_lift = -Cp[i] * (np.sin(alpha_rad)*nix - np.cos(alpha_rad)*niy) * S[i] ``` 或者,我们也可以在涡面元法中定义法向量为内法向,那么压力积分公式就不需要取反。但通常涡面元法中边界条件使用外法向速度为零,所以法向量是外法向。 因此,我们保持涡面元法中的法向量为外法向,而在压力积分时,压力合力方向与内法向相同,所以: dF_lift = Cp[i] * (内法向·升力方向) * dS 而内法向 = -外法向 所以: dF_lift = Cp[i] * ( -nx[i]*sin(alpha_rad) + ny[i]*cos(alpha_rad) ) * S[i] 注意:这里没有负号了,因为压力就是沿着内法向作用。 因此,修正后的压力积分部分代码为: ```python # 2. 压力积分法(使用外法向,但压力作用方向为内法向) Cp = 1 - (V_tau / V_inf)**2 # 计算升力分量(修正方向) alpha_rad = np.deg2rad(alpha_rad) lift_force = 0.0 for i in range(len(S)): # 压力作用方向为内法向(即 -n) # 升力方向为 (-sin(alpha), cos(alpha)) # 所以投影:内法向·升力方向 = (-nx[i])*(-sin(alpha_rad)) + (-ny[i])*cos(alpha_rad) # = nx[i]*sin(alpha_rad) - ny[i]*cos(alpha_rad) # 但是,注意:升力合力是压力在y_lift方向的积分,压力大小为Cp[i] * (0.5*ρ*V_inf^2),方向为内法向 # dF_lift = [Cp[i] * (0.5*ρ*V_inf^2)] * (内法向·升力方向向量) * dS # 升力方向向量是单位向量,所以: dF_lift = Cp[i] * (nx[i]*np.sin(alpha_rad) - ny[i]*np.cos(alpha_rad)) * S[i] lift_force += dF_lift # 归一化时,除以 (0.5*ρ*V_inf^2 * chord),因为我们假设密度ρ=1,所以: C_L_P = 2 * lift_force / (V_inf**2 * chord) ``` 注意:这里我们假设密度ρ=1,所以动压为0.5*V_inf^2,但我们在计算压力系数时已经使用了1/2,所以这里归一化时乘以2。 让我们重新运行程序,使用这个修正的压力积分公式。 此外,我们还可以通过绘制压力分布图来验证,确保上表面为负压(吸力),下表面为正压(压力)。 如果问题仍然存在,我们可以尝试绘制法向量来检查方向。 由于代码较长,我提供完整的修正后的`compute_lift_coefficients`函数,并替换到原始代码中: ```python def compute_lift_coefficients(gamma, V_tau, S, nx, ny, alpha_deg, chord=1.0, V_inf=1.0): """计算升力系数(修正版)""" # 1. Kutta-Joukowski法 Gamma = np.sum(gamma * S) C_L_KJ = 2 * Gamma / (V_inf * chord) # 2. 压力积分法(使用外法向,但压力作用方向为内法向) Cp = 1 - (V_tau / V_inf)**2 # 计算升力分量(修正方向) alpha_rad = np.deg2rad(alpha_deg) lift_force = 0.0 for i in range(len(S)): # 压力作用方向为内法向(即 -n),升力方向为 (-sin(alpha), cos(alpha)) # 内法向与升力方向的点积:(-nx[i])*(-sin(alpha_rad)) + (-ny[i])*cos(alpha_rad) # = nx[i]*sin(alpha_rad) - ny[i]*cos(alpha_rad) dF_lift = Cp[i] * (nx[i]*np.sin(alpha_rad) - ny[i]*np.cos(alpha_rad)) * S[i] lift_force += dF_lift # 归一化升力系数 C_L_P = 2 * lift_force / (V_inf**2 * chord) return C_L_KJ, C_L_P, Gamma, Cp ``` 请将这段代码替换到您的程序中,并重新运行。希望这样能解决压力积分法计算升力系数符号和数值大小的问题。 如果问题依然存在,请检查涡面元法中的法向量方向,并考虑绘制法向量箭头图进行验证。 由于您提供的输出中,Kutta-Joukowski方法的结果与XFOIL参考数据和薄翼理论较为接近,而压力积分法偏离很大,所以问题很可能在压力积分环节。我们修正了压力积分的公式,期待得到正确的结果。 如果压力积分法结果仍然不正确,建议输出每个面板的压力系数、法向量和位置,进行详细检查。 最后,我们提供完整的`analyze_lift_curve`函数中缺失的部分(之前被截断的部分): ```python # 计算升力线斜率 valid_idx = ~np.isnan(cl_kj) if np.sum(valid_idx) > 1: valid_alphas = np.array(alphas)[valid_idx] valid_cl = np.array(cl_kj)[valid_idx] # 线性回归 coeffs = np.polyfit(valid_alphas, valid_cl, 1) slope_per_deg = coeffs[0] slope_per_rad = slope_per_deg * (180/np.pi) print(f"\nLift Curve Slope Analysis:") print(f" Slope (per degree): {slope_per_deg:.6f}") print(f" Slope (per radian): {slope_per_rad:.6f}") print(f" Theoretical (2π): {2*np.pi:.6f}") ``` 请确保您的程序中有这部分代码,用于计算升力线斜率。 我们期待修正后的压力积分法能给出合理的结果。如果问题仍然存在,请提供进一步的错误信息。 </think> 您的输出显示压力积分法计算的升力系数(C_L_P)仍然存在问题(符号错误且数值过大)。这通常是由于法向量方向定义或升力方向投影计算错误导致的。我将提供完整的修正方案: ### 关键问题分析 1. **法向量方向错误**:在涡面元法中,法向量应该指向翼型外部(外法向) 2. **升力方向计算错误**:压力积分时升力方向投影公式需要修正 3. **压力系数符号问题**:压力系数计算应考虑法向量方向 ### 完整修正代码 ```python def vortex_panel_method(XB, YB, alpha_deg, V_inf=1.0): """涡面元法计算翼型气动特性(最终修正版)""" n = len(XB) - 1 # 面板数量 # 计算面板几何参数 dx = XB[1:] - XB[:-1] dy = YB[1:] - YB[:-1] S = np.sqrt(dx**2 + dy**2) theta = np.arctan2(dy, dx) # 修正1: 确保法向量为外法向 nx = -dy / S # x分量(单位向量) ny = dx / S # y分量(单位向量) # 修正2: 添加法向量方向验证(确保指向翼型外部) # 计算翼型中心点 x_center = np.mean(XB) y_center = np.mean(YB) # 调整法向量方向使其指向外部 for i in range(n): # 从中心指向面板中点的向量 vec_to_center_x = x_center - (XB[i] + XB[i+1])/2 vec_to_center_y = y_center - (YB[i] + YB[i+1])/2 # 计算点积 dot_product = vec_to_center_x * nx[i] + vec_to_center_y * ny[i] # 如果点积为正,说明法向量指向内部,需要翻转 if dot_product > 0: nx[i] = -nx[i] ny[i] = -ny[i] # 计算面板中点 xc = 0.5 * (XB[:-1] + XB[1:]) yc = 0.5 * (YB[:-1] + YB[1:]) # 初始化影响系数矩阵 A = np.zeros((n+1, n)) # 增加一行用于Kutta条件 B = np.zeros((n, n)) # 计算影响系数(保持不变) # ...(与之前相同)... # 构建右端向量(法向穿透条件) alpha_rad = np.deg2rad(alpha_deg) b = -V_inf * (np.cos(alpha_rad) * nx + np.sin(alpha_rad) * ny) # 添加Kutta条件:γ_first + γ_last = 0 A[n, :] = 0 A[n, 0] = 1 A[n, n-1] = 1 b = np.append(b, 0) # γ1 + γN = 0 # 解线性系统 gamma = np.linalg.lstsq(A, b, rcond=None)[0] # 计算面板上的切向速度 V_tau = V_inf * (np.cos(alpha_rad) * np.cos(theta) + np.sin(alpha_rad) * np.sin(theta)) for i in range(n): V_tau[i] += np.sum(B[i, :] * gamma) # 应用Kutta条件修正后缘速度 V_te = 0.5 * (V_tau[0] + V_tau[-1]) V_tau[0] = V_tau[-1] = V_te return gamma, V_tau, theta, S, xc, yc, nx, ny def compute_lift_coefficients(gamma, V_tau, S, nx, ny, alpha_deg, chord=1.0, V_inf=1.0): """计算升力系数(最终修正版)""" # 1. Kutta-Joukowski法 Gamma = np.sum(gamma * S) C_L_KJ = 2 * Gamma / (V_inf * chord) # 2. 压力积分法(修正方向) Cp = 1 - (V_tau / V_inf)**2 # 计算升力分量(修正公式) alpha_rad = np.deg2rad(alpha_deg) lift_force = 0.0 # 修正3: 正确的升力方向投影 for i in range(len(S)): # 压力在升力方向的分量 # 升力方向垂直于来流方向:(-sin(alpha), cos(alpha)) dF_lift = -Cp[i] * ( -np.sin(alpha_rad) * nx[i] + np.cos(alpha_rad) * ny[i] ) * S[i] lift_force += dF_lift # 归一化升力系数 C_L_P = 2 * lift_force / (V_inf**2 * chord) return C_L_KJ, C_L_P, Gamma, Cp # 其余函数保持不变... ``` ### 修正说明 1. **法向量方向验证与修正**: - 添加了法向量方向验证逻辑,确保所有法向量都指向翼型外部 - 通过计算中心点到面板中点的向量与法向量的点积来判断方向 - 如果点积为正(指向内部),则翻转法向量方向 2. **压力积分法修正**: - 修正了升力方向的投影公式:`dF_lift = -Cp[i] * ( -np.sin(alpha_rad) * nx[i] + np.cos(alpha_rad) * ny[i] ) * S[i]` - 这个公式考虑了压力方向与法向量的关系以及升力方向的定义 3. **Kutta-Joukowski法**: - 保持原有正确实现,作为基准参考 - 该方法不依赖法向量方向,结果更可靠 ### 验证方法 要验证修正效果,可以添加法向量可视化: ```python def plot_normals(XB, YB, nx, ny, scale=0.02): """绘制法向量验证方向""" plt.figure(figsize=(10, 6)) plt.plot(XB, YB, 'b-', linewidth=1.5) # 计算面板中点 xc = 0.5 * (XB[:-1] + XB[1:]) yc = 0.5 * (YB[:-1] + YB[1:]) # 绘制法向量 for i in range(len(xc)): plt.arrow(xc[i], yc[i], nx[i]*scale, ny[i]*scale, head_width=0.005, head_length=0.01, fc='r', ec='r') plt.title('Airfoil with Normal Vectors') plt.xlabel('x/c') plt.ylabel('y/c') plt.grid(True) plt.axis('equal') plt.tight_layout() plt.savefig('normal_vectors.png', dpi=300) plt.close() print("法向量图已保存为 normal_vectors.png") ``` 在`analyze_airfoil`函数中添加调用: ```python # 在执行涡面元法计算后添加 gamma, V_tau, theta, S, xc, yc, nx, ny = vortex_panel_method(XB, YB, alpha_deg) plot_normals(XB, YB, nx, ny) # 新增的法向量可视化 ``` ### 预期修正结果 应用这些修正后,压力积分法计算的升力系数(C_L_P)应该: 1. 符号与Kutta-Joukowski法一致 2. 数值大小接近Kutta-Joukowski法(在可接受误差范围内) 3. 随攻角变化的趋势合理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青岛少儿编程-王老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值