We propose a systematic determination of all azeotropes for the following pentanary mixture composed of Ethanol, Benzene, Chloroform, Acetone and Methanol at 1 atm using the Wilson model. Ethanol, Benzene, Chloroform, Acetone and Methanol: are components 1 through 5 in the code below.
This problem was first treated by Fidkowski, Malone and Doherty (Ref.1) and their results are reproduced below:
Finally, this problem was also solved by the late Prof. Floudas and co-workers using GAMS: see Chapter14 at: http://titan.princeton.edu/TestProblems/
We benchmark our results, summarized in the Table below, against data generated by a Matlab bifurcation code written by several people at the CHE department of MIT including the late Prof. Swan.
Results of the bifurcation analysis
Results of the bifurcation analysis
This system has 9 azeotropes (6 binary azeotropes + 2 ternary azeotropes + 1 quaternary azeotrope).
# | x1 | x2 | x3 | x4 | x5 | T[°C]
────────────────────────────────
pure components:
1 | 0.000 | 0.000 | 0.000 | 1.000 | 0.000 | 56.101
2 | 0.000 | 0.000 | 1.000 | 0.000 | 0.000 | 61.673
3 | 0.000 | 0.000 | 0.000 | 0.000 | 1.000 | 64.548
4 | 1.000 | 0.000 | 0.000 | 0.000 | 0.000 | 78.298
5 | 0.000 | 1.000 | 0.000 | 0.000 | 0.000 | 80.100
# | x1 | x2 | x3 | x4 | x5 | T[°C]
────────────────────────────────
pure components:
1 | 0.000 | 0.000 | 0.000 | 1.000 | 0.000 | 56.101
2 | 0.000 | 0.000 | 1.000 | 0.000 | 0.000 | 61.673
3 | 0.000 | 0.000 | 0.000 | 0.000 | 1.000 | 64.548
4 | 1.000 | 0.000 | 0.000 | 0.000 | 0.000 | 78.298
5 | 0.000 | 1.000 | 0.000 | 0.000 | 0.000 | 80.100
azeotropes:
6 | 0.000 | 0.000 | 0.655 | 0.000 | 0.345 | 53.896
7 | 0.000 | 0.000 | 0.000 | 0.792 | 0.208 | 55.394
8 | 0.000 | 0.050 | 0.205 | 0.295 | 0.450 | 57.361
9 | 0.000 | 0.000 | 0.225 | 0.338 | 0.437 | 57.368
10 | 0.000 | 0.377 | 0.000 | 0.000 | 0.623 | 58.288
11 | 0.142 | 0.000 | 0.858 | 0.000 | 0.000 | 59.712
12 | 0.179 | 0.000 | 0.482 | 0.340 | 0.000 | 63.285
13 | 0.000 | 0.000 | 0.663 | 0.337 | 0.000 | 64.553
14 | 0.463 | 0.537 | 0.000 | 0.000 | 0.000 | 68.211
6 | 0.000 | 0.000 | 0.655 | 0.000 | 0.345 | 53.896
7 | 0.000 | 0.000 | 0.000 | 0.792 | 0.208 | 55.394
8 | 0.000 | 0.050 | 0.205 | 0.295 | 0.450 | 57.361
9 | 0.000 | 0.000 | 0.225 | 0.338 | 0.437 | 57.368
10 | 0.000 | 0.377 | 0.000 | 0.000 | 0.623 | 58.288
11 | 0.142 | 0.000 | 0.858 | 0.000 | 0.000 | 59.712
12 | 0.179 | 0.000 | 0.482 | 0.340 | 0.000 | 63.285
13 | 0.000 | 0.000 | 0.663 | 0.337 | 0.000 | 64.553
14 | 0.463 | 0.537 | 0.000 | 0.000 | 0.000 | 68.211
Bifurcation Diagram
Bifurcation Diagram
Doherty’s Homotopy Method (see Ref. 1)
ClearAll["Global`*"];
CONSTANTS
Total pressure
Ptot=760.0;
Universal gas constant
Rcal=1.9872041;
components={"Ethanol","Benzene","Chloroform","Acetone","Methanol"};abbrev={"Eth","Ben","Chl","Ace","Met"};
Antoine Equation
antoineParams={{8.11220,1592.864,226.184},{6.90565,1211.033,220.790},{6.93790,1171.173,227.000},{7.11714,1210.595,229.664},{8.08097,1582.271,239.726}};antoine[T_]:=Module[{Tc},Tc=T-273.15;10^(antoineParams[[All,1]]-antoineParams[[All,2]]/(antoineParams[[All,3]]+Tc))];
Wilson Model
V={58.68,89.41,80.67,73.93,40.73};AWilson={{0.0000,1239.9838,1559.2691,204.3217,-52.1274},{243.6327,0.0000,-3.1540,-429.2086,199.4167},{-352.7970,-96.5034,0.0000,-409.2236,-374.6921},{332.6937,5321.0769,6.1954,0.0000,-121.2515},{-52.3690,1629.3018,1818.2748,547.6712,0.0000}};lambdaWilson[T_]:=Table[If[i==j,1.0,(V[[j]]/V[[i]])*Exp[-AWilson[[i,j]]/(Rcal*T)]],{i,5},{j,5}];wilsonGamma[x_,T_]:=Module[{lam,S,lng},lam=lambdaWilson[T];S=lam.x;lng=Table[-Log[S[[k]]]+1-Sum[x[[i]]*lam[[i,k]]/S[[i]],{i,5}],{k,5}];Exp[lng]];
Pure components boiling temperatures
findTbp[i_]:=T/.FindRoot[antoine[T][[i]]-Ptot==0,{T,330}];Tbps=Table[findTbp[i],{i,5}];TbpsC=Tbps-273.15;
Homotopy Equations
doherty[v_,la_]:=Module[{x4,x5,x,T,psat,gam,K,f},x4=v[[1;;4]];x5=Max[1-Total[x4],10^-12];x=Join[x4,{x5}];x=x/Total[x];T=v[[5]];If[T<300||T>430,Return[ConstantArray[10^6,5]]];psat=antoine[T];gam=wilsonGamma[x,T];(*Correctthermodynamichomotopy*)K=(gam^la)*psat/Ptot;f=ConstantArray[0,5];Do[f[[i]]=x[[i]]*(K[[i]]-1),{i,4}];f[[5]]=K.x-1;f];
Initial guesses
initialGuesses={{0.463,0.537,0.000,0.000,341.4},{0.000,0.000,0.655,0.000,327.0},{0.000,0.000,0.663,0.337,337.7},{0.142,0.000,0.858,0.000,333.0},{0.000,0.000,0.000,0.792,328.5},{0.000,0.377,0.000,0.000,331.4},{0.000,0.000,0.230,0.330,330.5},{0.179,0.000,0.482,0.340,336.4},{0.001,0.050,0.204,0.294,330.5}};
Azeotropes
azeotropes={};Do[sol=Quiet@FindRoot[doherty[{x1,x2,x3,x4,T},1]=={0,0,0,0,0},{{x1,ig[[1]]},{x2,ig[[2]]},{x3,ig[[3]]},{x4,ig[[4]]},{T,ig[[5]]}},MaxIterations->500];xs={x1,x2,x3,x4}/.sol;x5=Max[1-Total[xs],0];xx=Join[xs,{x5}];xx=xx/Total[xx];temp=T/.sol;If[Max[xx]<0.99,AppendTo[azeotropes,<|"x"->xx,"T"->temp-273.15,"v"->({x1,x2,x3,x4,T}/.sol)|>]],{ig,initialGuesses}];azeotropes=DeleteDuplicates[azeotropes,Norm[#1["x"]-#2["x"]]<10^-3&];
Continuation
branches={};lambdaValues=N@Join[Range[0,0.8,0.02],Range[0.8,0.95,0.005],Range[0.95,1,0.001]];Do[v=az["v"];curve={};Do[sol=Quiet@FindRoot[doherty[{x1,x2,x3,x4,T},la]=={0,0,0,0,0},{{x1,v[[1]]},{x2,v[[2]]},{x3,v[[3]]},{x4,v[[4]]},{T,v[[5]]}},MaxIterations->300];v=({x1,x2,x3,x4,T}/.sol);AppendTo[curve,{la,v[[5]]-273.15}],{la,Reverse@lambdaValues}];active=Flatten@Position[az["x"],_?(#>0.04&)];AppendTo[branches,<|"curve"->curve,"active"->active,"n"->Length[active],"T1"->az["T"]|>],{az,azeotropes}];
Colors
pureColors=Table[Darker@Hue[i/12],{i,2,6}];branchColors=Table[Darker@Hue[i/12],{i,2,11}];
Pure lines
pureLines=Table[{pureColors[[k]],Thick,Line[{{0,TbpsC[[k]]},{1,TbpsC[[k]]}}]},{k,5}];
Branch graphics
branchGraphics=Table[Module[{curve,col,style,n},curve=br["curve"];n=br["n"];col=branchColors[[Mod[i-1,Length[branchColors]]+1]];style=Which[n==2,Directive[col,Dashed,Thick],n==3,Directive[col,Dashed,Thick],n>=4,Directive[col,Dashed,Thick]];{style,Line[curve]}],{i,Length[branches]},{br,{branches[[i]]}}];
Pure component labels
pureLabels=Table[Text[Style[components[[k]]<>" "<>ToString@NumberForm[TbpsC[[k]],{4,1}]<>" °C",10,Black,Background->White],{0.12,TbpsC[[k]]+.35}],{k,5}];
Pure components lines
p=Show[Graphics[{pureLines,pureLabels}],Frame->True,FrameLabel->{Style["Paramètre homotopique λ",12],Style["Température (°C)",12]},LabelStyle->Directive[14],PlotRange->{{0.0,1.},{50,82}},GridLines->Automatic,ImageSize->420,AspectRatio->1,PlotLabel->Style["Pure components\n",12,Bold]]
Out[]=
References
References
[1] Z.T. Fidkowski, M.F. Malone, M.F. Doherty, Computing azeotropes in multicomponent mixtures, Computers & Chemical Engineering, Volume 17, Issue 12, 1993, Pages 1141-1155, https://doi.org/10.1016/0098-1354(93)80095-5
CITE THIS NOTEBOOK
CITE THIS NOTEBOOK
Systematic determination of the azeotropes of a pentanary system by bifurcation
by Samar Jebali, Oumaima ben saad, Ons Zarraa, Eya kefi, Yassmine ben hamouda, Housam Binous, and Ahmed Bellagi
Wolfram Community, STAFF PICKS, May 24, 2026
https://community.wolfram.com/groups/-/m/t/3721524
by Samar Jebali, Oumaima ben saad, Ons Zarraa, Eya kefi, Yassmine ben hamouda, Housam Binous, and Ahmed Bellagi
Wolfram Community, STAFF PICKS, May 24, 2026
https://community.wolfram.com/groups/-/m/t/3721524