MATLAB使用fzero求解循环交点报错,需获取曲线交点根
问题分析与解决方案
错误原因
你调用fzero时触发的错误,核心是函数返回值类型不匹配:
- 你定义的
fun引用了rho、cd、T这些数组变量,当fzero传入标量V时,函数会返回数组结果 fzero内部逻辑判断使用了||运算符,该运算符仅接受标量逻辑值,数组无法满足要求,因此报错
另外你的代码逻辑存在疏漏:循环计算每个高度h的曲线后,rho、cd、T仅保留最后一次h的数组数据,无法对应所有高度的交点求解需求。
修正思路与代码
由于每个高度h下,推力T是固定常数,阻力D可通过升力平衡条件推导为关于V的解析函数,无需依赖alpha循环。我们可以针对每个h单独定义函数,用fzero求解交点:
clear all; close all W = 10000; %[N] S = 40; %[m^2] AR = 7; cd0 = 0.01; k = 1 / pi / AR; Tsl=800; figure(1);hold on; xlabel('V');ylabel('D/T') grid on for h=0:1:8 rho = 1.2*exp(-h/10.4); % 同一高度下rho为常数 T = Tsl*(rho/1.2)^0.75; % 同一高度下推力T为常数 % 定义D(V)-T的标量函数:输入标量V,输出标量值 fun = @(V) 0.5*rho*S*cd0*V.^2 + (2*k*W^2)/(rho*S*V.^2) - T; % 先验证函数在合理速度范围的符号变化,确保fzero能找到根 V_test = linspace(5,50,100); f_test = fun(V_test); sign_change_idx = find(diff(sign(f_test)) ~= 0); if ~isempty(sign_change_idx) V_start = V_test(sign_change_idx(1)); V_root = fzero(fun, V_start); fprintf('高度h=%d时,交点速度V=%.2f m/s\n', h, V_root); % 绘制当前高度的阻力曲线、推力直线及交点 V_plot = linspace(5,50,200); D_plot = 0.5*rho*S*cd0*V_plot.^2 + (2*k*W^2)/(rho*S*V_plot.^2); plot(V_plot, D_plot, 'DisplayName', sprintf('h=%d 阻力',h)); plot([min(V_plot), max(V_plot)], [T,T], '--', 'DisplayName', sprintf('h=%d 推力',h)); plot(V_root, T, 'ro', 'DisplayName', sprintf('交点h=%d',h)); else fprintf('高度h=%d时,未找到阻力与推力的交点\n', h); end end legend;
关键修正点
- 函数标量化:通过升力平衡推导阻力D(V)的解析表达式,让函数输入输出均为标量,符合
fzero的要求 - 分高度处理:将交点求解逻辑嵌入h的循环,每个高度单独计算rho、T并找根
- 根的有效性验证:先检测函数在合理速度范围的符号变化,确保
fzero能收敛到有效根
内容的提问来源于stack exchange,提问作者Alina Abdikadyr
相关产品推荐
相关产品推荐

