Я пытаюсь сделать следующий алгоритм, использующий 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
Я не могу получить код для запуска, я получаю следующее сообщение об ошибке: решение Не найдено ни одного.
Я пробовал устанавливать допуски всего 1e-20
, но это ничего не меняло.
Спасибо! Я попробую это. Значение K5 также меняется. То естьЯ буду получать K5 в текущей точке, используйте алгоритм для поиска H2S, а затем продолжайте со всеми другими вещами, которые нужно сделать. На следующем запуске у меня будет новый K5. Из-за этого брекетинг может потребоваться изменить, так как K5 = f (T), и он довольно чувствителен к T, тем больше T получает. Я быстро проверю домен K5 – Mierzen
Кажется безопасным сказать, что K5 будет варьироваться между 0,012893 и 0,27503 – Mierzen
. Я обновил свой ответ в ответ на ваши комментарии и посмотрел на вашу систему чуть более подробно. – pragmatist1