Matlab求解4阶多项式实根报错:赋值维度不兼容问题排查
赋值维度不兼容错误排查与修复
错误原因
- 你的方程是4阶多项式,
solve函数会返回所有根(包括复数根和负根),因此T2是一个包含多个元素的符号数组,而Tab(i)是单个元素的位置,两者维度不匹配,导致赋值失败。 - 绝热火焰温度的物理意义是正实数,所以大部分根都是无意义的,需要筛选出符合条件的根。
修复步骤
- 筛选
solve结果中的正实数根:使用isreal判断实数,再过滤大于0的数值; - 预定义
Tab数组:提前创建与Ti长度一致的数组,避免动态扩容的问题; - 将筛选后的根转换为数值类型(
vpa或double),再赋值给Tab(i)。
修正后的完整代码
clear clc syms tab2 Ti = (298:25:873); Tab = zeros(size(Ti)); % 预定义结果数组 %low temperature coefficients A_CO2l = [2.35677352e+00 8.98459677e-03 -7.12356269e-06 2.45919022e-09 -1.43699548e-13 -4.83719697E+04 9.90105222e+00]; A_H2Ol = [4.19864056e+00 -2.03643410e-03 6.52040211e-06 -5.48797062e-09 1.77197817e-12 -3.02937267e+04 -8.49032208e-01]; A_N2l = [0.02926640E+02 0.14879768E-02 -0.05684760E-05 0.10097038E-09 -0.06753351E-13 -0.09227977E+04 0.05980528E+02]; %high temperature coefficients A_CO2h = [3.85746029e+00 4.41437026e-03 -2.21481404e-06 5.23490188e-10 -4.72084164e-14 -4.87591660e+04 2.27163806e+00]; A_H2Oh = [3.03399249e+00 2.17691804e-03 -1.64072518e-07 -9.70419870e-11 1.68200992e-14 -3.00042971e+04 4.96677010e+00]; A_N2h = [0.02926640e+02 0.14879768e-02 -0.05684760e-05 0.10097038e-09 -0.06753351e-13 -0.09227977e+04 0.05980528e+02]; hfCO2 = -393520 ; hfH2O = -241820 ; hfN2 = 0 ; hfCH4 = -74850; RCO2 = 0.1889; % W RH2O = 0.4615; % X RN2 = 0.2968; % Y for i = 1:length(Ti) EQ = (1*(hfCO2+(RCO2*tab2*(A_CO2h(1) + A_CO2h(2)*tab2/2 +A_CO2h(3)*(tab2^2)/3 + A_CO2h(4)*(tab2^3)/4 + A_CO2h(5)*(tab2^4)/5 + A_CO2h(6)/tab2))-(RCO2*Ti(i)*(A_CO2l(1) + A_CO2l(2)*Ti(i)/2 +A_CO2l(3)*(Ti(i)^2)/3 + A_CO2l(4)*(Ti(i)^3)/4 + A_CO2l(5)*(Ti(i)^4)/5 + A_CO2l(6)/Ti(i))))... +2*(hfH2O+(RH2O*tab2*(A_H2Oh(1) + A_H2Oh(2)*tab2/2 +A_H2Oh(3)*(tab2^2)/3 + A_H2Oh(4)*(tab2^3)/4 + A_H2Oh(5)*(tab2^4)/5 + A_H2Oh(6)/tab2)-(RH2O*Ti(i)*(A_H2Ol(1) + A_H2Ol(2)*Ti(i)/2 +A_H2Ol(3)*(Ti(i)^2)/3 + A_H2Ol(4)*(Ti(i)^3)/4 + A_H2Ol(5)*(Ti(i)^4)/5 + A_H2Ol(6)/Ti(i))))... +7.52*(RN2*tab2*(A_N2h(1) + A_N2h(2)*tab2/2 +A_N2h(3)*(tab2^2)/3 + A_N2h(4)*(tab2^3)/4 + A_N2h(5)*(tab2^4)/5 + A_N2h(6)/tab2)-(RN2*Ti(i)*(A_N2l(1) + A_N2l(2)*Ti(i)/2 +A_N2l(3)*(Ti(i)^2)/3 + A_N2l(4)*(Ti(i)^3)/4 + A_N2l(5)*(Ti(i)^4)/5 + A_N2l(6)/Ti(i)))))... -hfCH4 == 0; T2 = solve(EQ,tab2); % 筛选正实数根 real_roots = double(T2(isreal(T2))); valid_root = real_roots(real_roots > 0); % 赋值(绝热火焰温度唯一,取该值) Tab(i) = valid_root; end % 可选:转换为高精度数值 Tab = vpa(Tab); disp(Tab);
关键修改说明
- 预定义
Tab = zeros(size(Ti)):提前分配内存,避免动态数组的维度问题; - 筛选根:
real_roots = double(T2(isreal(T2)))提取所有实数根,再通过real_roots > 0筛选正根; - 直接赋值有效根:由于绝热火焰温度的物理唯一性,筛选后只会得到一个有效根,直接赋值给
Tab(i)即可。
内容的提问来源于stack exchange,提问作者William Rhinehart
相关产品推荐
相关产品推荐

