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
相关产品推荐
相关产品推荐

