You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

关键修正点

  1. 函数标量化:通过升力平衡推导阻力D(V)的解析表达式,让函数输入输出均为标量,符合fzero的要求
  2. 分高度处理:将交点求解逻辑嵌入h的循环,每个高度单独计算rho、T并找根
  3. 根的有效性验证:先检测函数在合理速度范围的符号变化,确保fzero能收敛到有效根

内容的提问来源于stack exchange,提问作者Alina Abdikadyr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:10:13