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

Matlab使用solve、fsolve求解二元方程组报错无法得到解,求解决方案

错误原因分析

1. vpasolve报错原因

  • 你定义的E1、E2同时包含符号变量x1和T,调用vpasolve(E1==E2,T,0.5)时仅指定求解T,未对x1赋值或同步求解,残留的符号参数x1无法代入非多项式形式的方程计算,触发报错。
  • 你仅传入了E1==E2一个方程,却要解两个未知量,本身是欠定问题,无法得到唯一解。如果要继续用vpasolve求解,修正写法为S = vpasolve([E1==0, E2==0], [x1, T], [0.5, 50]),指定两个待求变量和两个方程即可解决符号参数报错。

2. fsolve报错原因

  • 核心错误是安托因方程的语法写错:原正确形式是exp(常数项 - 系数/温度项),你错误地把减法括进了分子,写成了exp((常数项 - 系数)/温度项),方程逻辑完全错误,自然找不到解。
  • 初始猜测值[0.1,10]可能不在解的邻域内,也会影响求解收敛性。
修正方案

你要解的是二元体系共沸点问题,两个方程E1=0、E2=0同时成立,两个未知量是摩尔分数x1和温度T,修正后的fsolve求解代码如下:

omega12=100.7919; omega21=872.6804;
R=8.314; 
P=13.3; 

% 修正安托因方程逻辑错误的目标函数
f = @(x) [
    exp(-R*x(2)*(log(x(1) + omega12*(1-x(1))) + x(1)*((1-x(1)-(1-x(1))*omega12)/(x(1)+omega12*(1-x(1)))) + (1-x(1))*((-1*(1-x(1))+omega21*(1-x(1)))/(1-x(1)+omega21*x(1)))))) ...
    * exp(16.6578 - 3674.49 / ((x(2)+ 273.15) + 226.45)) - P;
    exp(-R*x(2)*(log((1-x(1))+omega12*x(1))+(1-x(1))*((1-(1-x(1))-x(1)*omega12)/((1-x(1))+omega12*x(1))) + x(1)*((-x(1)+omega21*x(1))/(x(1)+omega21*(1-x(1)))))) ...
    * exp(16.262 - 3799.89 / ((x(2) + 273.15) + 226.35)) - P
];

% 调整更合理的初始值,x1范围在0~1,T可先试常温区间,可选配求解参数
options = optimoptions('fsolve','Display','iter','FunctionTolerance',1e-6);
[x,fval] = fsolve(f,[0.5,50],options)
额外调试建议
  • 可以先单独测试不同x1、T取值下的函数值,确认解的大致区间后再设置初始值,收敛概率更高。
  • 如果仍然不收敛,可以添加0<x1<1、T>0的变量约束,改用lsqnonlin求解最小二乘解,验证是否存在满足容差的可行解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:18:00