基于MatLab的arrayfun结合vpasolve求解方程组问题
高效求解多参数组下的方程组问题
问题根源
你的代码存在两个核心问题:
- 直接用向量参数构建符号方程,生成的是4组独立的单个方程(4个eqn1 + 4个eqn2),而非每组参数对应的方程组对,
arrayfun遍历的是单个方程而非每组的方程组组合,导致求解逻辑错误。 - 未指定解的物理约束,
vpasolve默认可能返回不符合实际的负t解(因cosh是偶函数,方程在t正负区间均有解)。
修正方案
利用arrayfun对每组参数单独构建方程组,同时添加正解约束,确保结果符合物理意义。以下是修正后的代码:
clc clear all close all % 标量参数 g = 9.807; % 重力加速度, m/s² d = 1.225; % 空气密度, kg/m³ x = 1000; % 下落高度, m % 多组参数(列向量) A = [1.2; 1.7; 1.8; 0.3]; % 迎风面积, m² m = [82; 84; 90; 25]; % 质量, kg Cd = [0.3; 1.14; 0.29; 0.045]; % 拖拽系数 % 定义单组参数的求解函数:输入A/m/Cd单值,返回对应v和t的正解 solve_single_case = @(A_val, m_val, Cd_val) ... vpasolve(... % 针对单组参数构建方程组 2*m_val/(A_val*Cd_val*d)*log(cosh(t*sqrt(A_val*Cd_val*d*g/(2*m_val)))) == x, ... (2*g*m_val/(d*A_val*Cd_val))*tanh(t*sqrt((g*d*Cd_val*A_val)/(2*m_val))) - v == 0, ... % 指定变量及正解约束 v, t, ... v > 0, t > 0); % 遍历所有参数组求解,返回cell数组存储每组结果 results = arrayfun(solve_single_case, A, m, Cd, 'UniformOutput', false); % 提取结果为数值矩阵 v_values = cellfun(@(res) double(res.v), results); t_values = cellfun(@(res) double(res.t), results); % 输出结果 disp('各组最终速度v (m/s):'); disp(v_values); disp('各组下落时间t (s):'); disp(t_values);
关键修正点
- 单组参数专属方程组:匿名函数
solve_single_case针对每组参数单独构建方程,确保每组参数对应正确的物理模型。 - 正解约束:调用
vpasolve时添加v > 0, t > 0,过滤掉不符合下落过程的负解。 - 多参数同步遍历:
arrayfun同时传入A、m、Cd三个向量,自动按索引一一对应处理每组参数。 - 结果提取:用
cellfun将cell数组中的结构解提取为数值矩阵,方便后续分析。
补充说明
在MATLAB中,arrayfun与for循环的性能差异极小,该写法兼顾了代码简洁性与效率。如果需要进一步优化,可预分配结果数组,但当前写法已足够高效。
内容的提问来源于stack exchange,提问作者chemida
相关产品推荐
相关产品推荐

