我试图做使用fsolve或fzero以下算法:fsolve/fzero:没有找到解决办法,定期出现
K5=8.37e-2
P=1
Choose an A
S2=(4*K5/A)^(2/3)
S6=3*S2
S8=4*S2
SO2 = (5*P)/149 - (101*S2)/149 - (293*S6)/149 - (389*S8)/149
H2O = (40*P)/149 + (556*S2)/447 + (636*S6)/149 + (2584*S8)/447
H2S = 2*SO2
newA = (H2O)^2/(SO2)^3
Repeat until newA=oldA
最主要解决的是K5=1/4 * A * S2^3/2
。正是从这个S2
计算在第一位。
所以这是我在Matlab做:
function MultipleNLEexample
clear, clc, format short g, format compact
Aguess = 300000; % initial guess
options = optimoptions('fsolve','Display','iter','TolFun',[1e-9],'TolX',[1e-9]); % Option to display output
xsolv=fsolve(@MNLEfun,Aguess,options);
[~,ans]=MNLEfun(xsolv)
%- - - - - - - - - - - - - - - - - - - - - -
function varargout = MNLEfun(A);
K5 = 8.37e-2;
S2 = (4*K5/A)^(2/3);
S6 = 3*S2;
S8 = 4*S2;
P=1; %atm
SO2 = (5*P)/149 - (101*S2)/149 - (293*S6)/149 - (389*S8)/149;
H2O = (40*P)/149 + (556*S2)/447 + (636*S6)/149 + (2584*S8)/447;
newA=H2O^2/SO2^3;
fx=1/4*newA*S2^(3/2)-K5;
varargout{1} = fx;
if nargout>1
H2S = 2*SO2;
varargout{2} = ((2*S2+6*S6+8*S8)/(2*S2+6*S6+8*S8+H2S+SO2)*100);
end
我不能让我的代码运行,我得到以下错误: 没有找到解决方案。
fsolve停止,因为问题看起来是规则的,如梯度 所测量的那样,但函数值的向量不接近零,如通过函数容差的所选值所测量的。
我曾尝试将公差设置为低至1e-20
,但这并未改变任何内容。
谢谢!我会试试这个。 K5的价值实际上也在变化。即我将在当前点获得K5,使用算法找到H2S,然后继续进行所有其他工作。下一次,我会再次有一个新的K5。正因为如此,包围可能需要改变,因为K5 = f(T),它对T非常敏感,T越大。我会很快检查K5的域名 – Mierzen
似乎可以肯定地说K5会在0.012893和0.27503之间变化 – Mierzen
我已经更新了我的回答,以回应您的推荐以及在更详细地查看您的系统之后。 – pragmatist1