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

基于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);

关键修正点

  1. 单组参数专属方程组:匿名函数solve_single_case针对每组参数单独构建方程,确保每组参数对应正确的物理模型。
  2. 正解约束:调用vpasolve时添加v > 0, t > 0,过滤掉不符合下落过程的负解。
  3. 多参数同步遍历:arrayfun同时传入A、m、Cd三个向量,自动按索引一一对应处理每组参数。
  4. 结果提取:用cellfun将cell数组中的结构解提取为数值矩阵,方便后续分析。

补充说明

在MATLAB中,arrayfun与for循环的性能差异极小,该写法兼顾了代码简洁性与效率。如果需要进一步优化,可预分配结果数组,但当前写法已足够高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 10:50:24