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]]