Re: Exit a loop
- To: mathgroup at smc.vnet.net
- Subject: [mg122641] Re: Exit a loop
- From: David Reiss <dbreiss at gmail.com>
- Date: Fri, 4 Nov 2011 06:00:58 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <j8tk7n$eoa$1@smc.vnet.net>
Generally in Mathematica (or in any other programming language!) you do not want to use a Goto statement. Take a look at the documentation for the functions Throw and Catch. Hope this helps, David On Nov 3, 4:43 am, Mary R <mathematica... at gmail.com> wrote: > Hi to everyone, > i try to exit a loop when this criterion is satisfied: > If[( (matriceP[[i - 1, 1]] - matriceP[[i - 1, -1]])/matriceP[[i - 1, 1]])^2 > < ( (matriceP[[i, 1]] - matriceP[[i, -1]])/matriceP[[i, 1]])^2 > i try with Goto[thispoint]-Label[thispoint], and it works, but have this > error: > Goto::nolabel: Label thispoint not found. > I try again with Catch and Throw (as you can see in comment), but the > calculations goes on without stopping. > Have any idea? > The part of algoritm interesting is signed by (*THIS PART*) near the end of > the notebook. > Thanks in advance > M. > ---------------------------------------------- > Timing[indicek = 1; > matriceP = {}; > valorek = {}; > differencep = {}; > mfugv1 = {{}}; > mfugl1 = {{}}; > mfugv2 = {{}}; > mfugl2 = {{}}; > my1 = {{}}; > my2 = {{}}; > vettore = {}; > Do[\[Omega] = {0.1521, 0.32684}; > x = {0.0991, 1 - 0.0991}; > Tc = {369.89, 374.21}; > Subscript[P, c] = {42.512, 40.593}; > R = 83.14; > T = 273.15; > tollerancep = 10^-8; > tollerancey = 10^-8; > incrP = 0.8; > decremento = 0; > incremento = 0; > ris = {}; > passo = 1; > label = {"step", "P", "\!\(\*SubscriptBox[\(y\), \(1 n\)]\)", > "\!\(\*SubscriptBox[\(y\), \(2 n\)]\)", > "\!\(\*SubscriptBox[\(f\), \(1 l\)]\)", > "\!\(\*SubscriptBox[\(f\), \(2 l\)]\)", > "\!\(\*SubscriptBox[\(f\), \(1 v\)]\)", > "\!\(\*SubscriptBox[\(f\), \(2 v\)]\)", "\[CapitalDelta]"}; > Subscript[T, r] = Table[T/Tc[[i]], {i, 2}]; > alfa = > Table[(1 + (0.37464 + 1.54226 \[Omega][[i]] - > 0.26993 (\[Omega][[i]])^2 ) (1 - Sqrt[ > Subscript[T, r][[i]]]))^2, {i, 2}]; > a = Table[(0.45723553 alfa[[i]] R^2 (Tc^2)[[i]])/ > Subscript[P, c][[i]] , {i, 2}]; > b = Table[(0.07779607 R Tc[[i]] )/Subscript[P, c][[i]], {i, 2}]; > P = {2.8}; > Subscript[y, 1] = {0.3596}; > Subscript[y, 1 n] = {0.3596}; > Subscript[y, 2] = {1 - 0.3596}; > Subscript[y, 2 n] = {1 - 0.3596}; > numy = 1; > nump = 1; > Subscript[f, 1 l] = {}; > Subscript[f, 2 l] = {}; > Subscript[f, 1 v] = {}; > Subscript[f, 2 v] = {}; > A = Table[(a[[i]] P[[nump]])/(R^2 T^2), {i, 2}]; > B = Table[(b[[i]] P[[nump]])/(R T), {i, 2}]; > Subscript[A, 12] = Sqrt[A[[1]]*A[[2]]]*(1 - k); > > Subscript[A, liq] = > x[[1]]^2 A[[1]] + 2*(x[[1]]*x[[2]])* Subscript[A, 12] + > x[[2]]^2 A[[2]]; > Subscript[B, liq] = x[[1]]*B[[1]] + x[[2]]*B[[2]]; > solzl = > NSolve[Z - 1/(1 - Subscript[B, liq]/Z) + > Subscript[A, liq]/Subscript[B, liq]*Subscript[B, liq]/Z/( > 1 + 2 *Subscript[B, liq]/Z - (Subscript[B, liq]/Z)^2) == 0, Z]; > soll = Z /. {solzl[[1]], solzl[[3]]}; > Subscript[ln\[Phi], 1 l] = > B[[1]]/Subscript[B, liq] (soll[[2]] - 1) - > Log[soll[[2]] - Subscript[B, liq]] - > Subscript[A, liq]/(Subscript[B, liq] Sqrt[8]) > Log[(soll[[2]] + (1 + Sqrt[2]) Subscript[B, liq])/( > soll[[2]] + (1 - Sqrt[2]) Subscript[B, liq])] (1/Subscript[A, > liq] 2 (x[[1]] A[[1]] + x[[2]] Subscript[A, 12]) - B[[1]]/ > Subscript[B, liq]); > Subscript[ln\[Phi], 2 l] = > B[[2]]/Subscript[B, liq] (soll[[2]] - 1) - > Log[soll[[2]] - Subscript[B, liq]] - > Subscript[A, liq]/(Subscript[B, liq] Sqrt[8]) > Log[(soll[[2]] + (1 + Sqrt[2]) Subscript[B, liq])/( > soll[[2]] + (1 - Sqrt[2]) Subscript[B, liq])] (1/Subscript[A, > liq] 2 (x[[1]] Subscript[A, 12] + x[[2]] A[[2]]) - B[[2]]/ > Subscript[B, liq]); > Subscript[\[Phi], 1 l] = Exp[Subscript[ln\[Phi], 1 l]]; > Subscript[\[Phi], 2 l] = Exp[Subscript[ln\[Phi], 2 l]]; > Subscript[f, 1 l] = > Append[Subscript[f, 1 l], Subscript[\[Phi], 1 l]*x[[1]]]; > Subscript[f, 2 l] = > Append[Subscript[f, 2 l], Subscript[\[Phi], 2 l]*x[[2]]]; > Subscript[B, vap] = > Subscript[y, 1][[numy]]*B[[1]] + Subscript[y, 2][[numy]]*B[[2]]; > Subscript[A, vap] = > Subscript[y, 1][[numy]]^2 A[[1]] + > 2 Subscript[y, 1][[numy]] Subscript[y, 2][[numy]] Subscript[A, > 12] + Subscript[y, 2][[numy]]^2 A[[2]]; > solzv = > NSolve[Z - 1/(1 - Subscript[B, vap]/Z) + > Subscript[A, vap]/Subscript[B, vap]*Subscript[B, vap]/Z/( > 1 + 2 *Subscript[B, vap]/Z - (Subscript[B, vap]/Z)^2) == 0, Z]; > solv = Z /. {solzv[[1]], solzv[[3]]}; > Subscript[ln\[Phi], 1 v] = > B[[1]]/Subscript[B, vap] (solv[[1]] - 1) - > Log[solv[[1]] - Subscript[B, vap]] - > Subscript[A, vap]/(Subscript[B, vap] Sqrt[8]) > Log[(solv[[1]] + (1 + Sqrt[2]) Subscript[B, vap])/( > solv[[1]] + (1 - Sqrt[2]) Subscript[B, vap])] (1/Subscript= [A, > vap] 2 (Subscript[y, 1][[numy]] A[[1]] + > Subscript[y, 2][[numy]] Subscript[A, 12]) - B[[1]]= / > Subscript[B, vap]); > Subscript[ln\[Phi], 2 v] = > B[[2]]/Subscript[B, vap] (solv[[1]] - 1) - > Log[solv[[1]] - Subscript[B, vap]] - > Subscript[A, vap]/(Subscript[B, vap] Sqrt[8]) > Log[(solv[[1]] + (1 + Sqrt[2]) Subscript[B, vap])/( > solv[[1]] + (1 - Sqrt[2]) Subscript[B, vap])] (1/Subscript= [A, > vap] 2 (Subscript[y, 1][[numy]] Subscript[A, 12] + > Subscript[y, 2][[numy]] A[[2]]) - B[[2]]/Subscript= [B, vap]); > Subscript[\[Phi], 1 v] = Exp[Subscript[ln\[Phi], 1 v]]; > Subscript[\[Phi], 2 v] = Exp[Subscript[ln\[Phi], 2 v]]; > Subscript[f, 1 v] = > Append[Subscript[f, 1 v], > Subscript[\[Phi], 1 v]*Subscript[y, 1][[numy]]]; > Subscript[f, 2 v] = > Append[Subscript[f, 2 v], > Subscript[\[Phi], 2 v]*Subscript[y, 2][[numy]]]; > > While[Abs[Subscript[f, 1 l][[nump]] - Subscript[f, 1 v][[numy]]] + > Abs[Subscript[f, 2 l][[nump]] - Subscript[f, 2 v][[numy]]] > > tollerancep, > numy = numy + 1; > Subscript[k, 1] = Subscript[\[Phi], 1 l]/Subscript[\[Phi], 1 v]= ; > Subscript[k, 2] = Subscript[\[Phi], 2 l]/Subscript[\[Phi], 2 v]= ; > Subscript[y, 1] = > Append[Subscript[y, 1], (x[[1]]*Subscript[k, 1])]; > Subscript[y, 2] = > Append[Subscript[y, 2], (x[[2]]*Subscript[k, 2])]; > Subscript[y, 1 n] = > Append[Subscript[y, > 1 n], (x[[1]]*Subscript[k, 1])/(x[[1]]*Subscript[k, 1] + > x[[2]]*Subscript[k, 2])]; > Subscript[y, 2 n] = > Append[Subscript[y, > 2 n], (x[[2]]*Subscript[k, 2])/(x[[1]]*Subscript[k, 1] + > x[[2]]*Subscript[k, 2])]; > Subscript[B, vap] = > Subscript[y, 1 n][[numy]]*B[[1]] + > Subscript[y, 2 n][[numy]]*B[[2]]; > Subscript[A, vap] = > Subscript[y, 1 n][[numy]]^2 A[[1]] + > 2 Subscript[y, 1 n][[numy]] Subscript[y, 2 n][[numy]] Subscri= pt[ > A, 12] + Subscript[y, 2 n][[numy]]^2 A[[2]]; > solzv = > NSolve[Z - 1/(1 - Subscript[B, vap]/Z) + > Subscript[A, vap]/Subscript[B, vap]*Subscript[B, vap]/Z/( > 1 + 2 *Subscript[B, vap]/Z - (Subscript[B, vap]/Z)^2) = == 0, > Z]; > solv = Z /. {solzv[[1]], solzv[[3]]}; > Subscript[ln\[Phi], 1 v] = > B[[1]]/Subscript[B, vap] (solv[[1]] - 1) - > Log[solv[[1]] - Subscript[B, vap]] - > Subscript[A, vap]/(Subscript[B, vap] Sqrt[8]) > Log[(solv[[1]] + (1 + Sqrt[2]) Subscript[B, vap])/( > solv[[1]] + (1 - Sqrt[2]) Subscript[B, vap])] (1/Subscrip= t[A, > vap] 2 (Subscript[y, 1 n][[numy]] A[[1]] + > Subscript[y, 2 n][[numy]] Subscript[A, 12]) - B[[= 1]]/ > Subscript[B, vap]); > Subscript[ln\[Phi], 2 v] = > B[[2]]/Subscript[B, vap] (solv[[1]] - 1) - > Log[solv[[1]] - Subscript[B, vap]] - > Subscript[A, vap]/(Subscript[B, vap] Sqrt[8]) > Log[(solv[[1]] + (1 + Sqrt[2]) Subscript[B, vap])/( > solv[[1]] + (1 - Sqrt[2]) Subscript[B, vap])] (1/Subscrip= t[A, > vap] 2 (Subscript[y, 1 n][[numy]] Subscript[A, 12] + > Subscript[y, 2 n][[numy]] A[[2]]) - B[[2]]/Subscr= ipt[B, > vap]); > Subscript[\[Phi], 1 v] = Exp[Subscript[ln\[Phi], 1 v]]; > Subscript[\[Phi], 2 v] = Exp[Subscript[ln\[Phi], 2 v]]; > Subscript[f, 1 v] = > Append[Subscript[f, 1 v], > Subscript[\[Phi], 1 v]*Subscript[y, 1 n][[numy]]]; > Subscript[f, 2 v] = > Append[Subscript[f, 2 v], > Subscript[\[Phi], 2 v]*Subscript[y, 2 n][[numy]]]; > Abs[Subscript[f, 1 v][[numy]] - Subscript[f, 1 v][[numy - 1]]] + > Abs[Subscript[f, 2 v][[numy]] - Subscript[f, 2 v][[numy - 1]]]= ; > Abs[Subscript[f, 1 l][[nump]] - Subscript[f, 1 v][[numy]]] + > Abs[Subscript[f, 2 l][[nump]] - Subscript[f, 2 v][[numy]]]; > While[ > Abs[Subscript[f, 1 v][[numy]] - Subscript[f, 1 v][[numy - 1]]= ] + > Abs[Subscript[f, 2 v][[numy]] - > Subscript[f, 2 v][[numy - 1]]] > > tollerancey,(*inizio while su y*) > numy = numy + 1; > Subscript[k, 1] = Subscript[\[Phi], 1 l]/Subscript[\[Phi], = 1 v]; > Subscript[k, 2] = Subscript[\[Phi], 2 l]/Subscript[\[Phi], = 2 v]; > Subscript[y, 1] = > Append[Subscript[y, 1], (x[[1]]*Subscript[k, 1])]; > Subscript[y, 2] = > Append[Subscript[y, 2], (x[[2]]*Subscript[k, 2])]; > Subscript[y, 1 n] = > Append[Subscript[y, > 1 n], (x[[1]]*Subscript[k, 1])/(x[[1]]*Subscript[k, 1] + > x[[2]]*Subscript[k, 2])]; > Subscript[y, 2 n] = > Append[Subscript[y, > 2 n], (x[[2]]*Subscript[k, 2])/(x[[1]]*Subscript[k, 1] + > x[[2]]*Subscript[k, 2])]; > Subscript[B, vap] = > Subscript[y, 1 n][[numy]]*B[[1]] + > Subscript[y, 2 n][[numy]]*B[[2]]; > Subscript[A, vap] = > Subscript[y, 1 n][[numy]]^2 A[[1]] + > 2 Subscript[y, 1 n][[numy]] Subscript[y, 2 n][[ > numy]] Subscript[A, 12] + Subscript[y, 2 n][[numy]]^2= A[[2]]; > solzv = > NSolve[Z - 1/(1 - Subscript[B, vap]/Z) + > Subscript[A, vap]/Subscript[B, vap]*Subscript[B, vap]= /Z/( > 1 + 2 *Subscript[B, vap]/Z - (Subscript[B, vap]/Z)= ^2) == 0, > Z]; > solv = Z /. {solzv[[1]], solzv[[3]]}; > Subscript[ln\[Phi], 1 v] = > B[[1]]/Subscript[B, vap] (solv[[1]] - 1) - > Log[solv[[1]] - Subscript[B, vap]] - > Subscript[A, vap]/(Subscript[B, vap] Sqrt[8]) > Log[(solv[[1]] + (1 + Sqrt[2]) Subscript[B, vap])/(so= lv[[ > 1]] + (1 - Sqrt[2]) Subscript[B, vap])] (1/Su= bscript[A, > vap] 2 (Subscript[y, 1][[numy]] A[[1]] + > Subscript[y, 2][[numy]] Subscript[A, 12]) - B= [[1]]/ > Subscript[B, vap]); > Subscript[ln\[Phi], 2 v] = > B[[2]]/Subscript[B, vap] (solv[[1]] - 1) - > Log[solv[[1]] - Subscript[B, vap]] - > Subscript[A, vap]/(Subscript[B, vap] Sqrt[8]) > Log[(solv[[1]] + (1 + Sqrt[2]) Subscript[B, vap])/(so= lv[[ > 1]] + (1 - Sqrt[2]) Subscript[B, vap])] (1/Su= bscript[A, > vap] 2 (Subscript[y, 1][[numy]] Subscript[A, 12] = + > Subscript[y, 2][[numy]] A[[2]]) - B[[2]]/Subs= cript[B, > vap]); > Subscript[\[Phi], 1 v] = Exp[Subscript[ln\[Phi], 1 v]]; > Subscript[\[Phi], 2 v] = Exp[Subscript[ln\[Phi], 2 v]]; > Subscript[f, 1 v] = > Append[Subscript[f, 1 v], > Subscript[\[Phi], 1 v]*Subscript[y, 1 n][[numy]]]; > Subscript[f, 2 v] = > Append[Subscript[f, 2 v], > Subscript[\[Phi], 2 v]*Subscript[y, 2 n][[numy]]];] > If > [Abs[Subscript[f, 1 l][[nump]] - Subscript[f, 1 v][[numy]]] + > Abs[Subscript[f, 2 l][[nump]] - Subscript[f, 2 v][[numy]]= ] > > tollerancep, > > ris = > Append[{ris}, > Join[{P[[nump]]}, {Subscript[y, 1 n]}, {Subscript[y, > 2 n]}, {Subscript[f, 1 l][[nump]]}, {Subscript[f, = 2 l][[ > nump]]}, {Subscript[f, 1 v]}, {Subscript[f, > 2 v]}, {Abs[ > Subscript[f, 1 l][[nump]] - Subscript[f, 1 v][= [numy]]] + > Abs[Subscript[f, 2 l][[nump]] - > Subscript[f, 2 v][[numy]]]}]] // MatrixForm; > If > [ > Abs[P[[nump - 2]] - P[[nump - 1]]] == > Abs[P[[nump - 1]] - P[[nump]]], > incrP = incrP/2; > > incrP > ]; > > nump = nump + 1; > P = > Append[P, > If[Subscript[y, 1][[numy]] + Subscript[y, 2][[numy]] > 1, > P[[nump - 1]] + incrP, P[[nump - 1]] - incrP]]; > A = Table[(a[[i]] P[[nump]])/(R^2 T^2), {i, 2}]; > B = Table[(b[[i]] P[[nump]])/(R T), {i, 2}]; > Subscript[A, 12] = Sqrt[A[[1]]*A[[2]]]*(1 - k); > Subscript[A, liq] = > x[[1]]^2 A[[1]] + 2*(x[[1]]*x[[2]])* Subscript[A, 12] + > x[[2]]^2 A[[2]]; > Subscript[B, liq] = x[[1]]*B[[1]] + x[[2]]*B[[2]]; > solzl = > NSolve[Z - 1/(1 - Subscript[B, liq]/Z) + > Subscript[A, liq]/Subscript[B, liq]*Subscript[B, liq]= /Z/( > 1 + 2 *Subscript[B, liq]/Z - (Subscript[B, liq]/Z)= ^2) == 0, > Z]; > soll = Z /. {solzl[[1]], solzl[[3]]}; > Subscript[ln\[Phi], 1 l] = > B[[1]]/Subscript[B, liq] (soll[[2]] - 1) - > Log[soll[[2]] - Subscript[B, liq]] - > Subscript[A, liq]/(Subscript[B, liq] Sqrt[8]) > Log[(soll[[2]] + (1 + Sqrt[2]) Subscript[B, liq])/(so= ll[[ > 2]] + (1 - Sqrt[2]) Subscript[B, liq])] (1/Su= bscript[A, > liq] 2 (x[[1]] A[[1]] + x[[2]] Subscript[A, 12]) = - B[[1]]/ > Subscript[B, liq]); > Subscript[ln\[Phi], 2 l] = > B[[2]]/Subscript[B, liq] (soll[[2]] - 1) - > Log[soll[[2]] - Subscript[B, liq]] - > Subscript[A, liq]/(Subscript[B, liq] Sqrt[8]) > Log[(soll[[2]] + (1 + Sqrt[2]) Subscript[B, liq])/(so= ll[[ > 2]] + (1 - Sqrt[2]) Subscript[B, liq])] (1/Su= bscript[A, > liq] 2 (x[[1]] Subscript[A, 12] + x[[2]] A[[2]]) = - B[[2]]/ > Subscript[B, liq]); > Subscript[\[Phi], 1 l] = Exp[Subscript[ln\[Phi], 1 l]]; > Subscript[\[Phi], 2 l] = Exp[Subscript[ln\[Phi], 2 l]]; > Subscript[f, 1 l] = > Append[Subscript[f, 1 l], Subscript[\[Phi], 1 l]*x[[1]]]; > Subscript[f, 2 l] = > Append[Subscript[f, 2 l], Subscript[\[Phi], 2 l]*x[[2]]]; > Subscript[y, 1 n] = {Subscript[y, 1 n][[numy]]}; > Subscript[y, 2 n] = {Subscript[y, 2 n][[numy]]}; > Subscript[y, 1] = {Subscript[y, 1][[numy]]}; > Subscript[y, 2] = {Subscript[y, 2][[numy]]}; > Subscript[f, 1 v] = {Subscript[f, 1 v][[numy]]}; > Subscript[f, 2 v] = {Subscript[f, 2 v][[numy]]}; > numy = 1; > passo = passo + 1; > ] > ]; > matriceP = Append[matriceP, P]; > mfugv1 = {{}}; > mfugl1 = {{}}; > mfugv2 = {{}}; > mfugl2 = {{}}; > my1 = {{}}; > my2 = {{}}; > indicek = indicek + 1; > valorek = Append[valorek, k]; > > (*--------------------------------------------------------THIS > PART------------------------------------------------------------------*) > \ > > (**Catch*[Do[If[( (matriceP[[i-1,1]]-matriceP[[i-1,-1]])/ > matriceP[[i-1,1]])^2>( (matriceP[[i,1]]-matriceP[[i,-1]])/ > matriceP[[i,1]])^2,Throw[i+1]],{i,2,Length[valorek]}]]*) > Do[If[( (matriceP[[i - 1, 1]] - matriceP[[i - 1, -1]])/ > matriceP[[i - 1, 1]])^2 < ( ( > matriceP[[i, 1]] - matriceP[[i, -1]])/matriceP[[i, 1]])^2= , > * Goto[thispoint]*], {i, 2, Length[valorek]}]; > , {k, -0.2, 0.2, 0.1} > ] > * Label[thispoint]*; > ris = Append[{ris}, > Join[{P[[nump]]}, {Subscript[y, 1 n]}, {Subscript[y, > 2 n]}, {Subscript[f, 1 l][[nump]]}, {Subscript[f, 2 l][[ > nump]]}, {Subscript[f, 1 v]}, {Subscript[f, > 2 v]}, {Abs[ > Subscript[f, 1 l][[nump]] - Subscript[f, 1 v][[numy]]] + > Abs[Subscript[f, 2 l][[nump]] - Subscript[f, 2 v][[numy]]]= }]] // > MatrixForm; > DiscretePlot[P[[i]], {i, 1, Length[P]}]; > > Do[Print["k12: ", valorek[[i]], " Arrive pressure: ", > matriceP[[i, -1]], > " Deviation: ", ( (matriceP[[i, 1]] - matriceP[[i, -1]])/ > matriceP[[i, 1]])^2], {i, Length[valorek]}] ] > matriceAAD = > Table[( (matriceP[[i, 1]] - matriceP[[i, -1]])/ > matriceP[[i, 1]])^2, {i, > Length[valorek]}](*Tabella di tutte le deviazioni *) > Print["k12 -> ", > valorek[[Flatten[ > Position[matriceAAD, Min[matriceAAD]]]]], " AAD -> ", > Min[matriceAAD]]