Re: Problem with If statement in a Do or a While loop
- To: mathgroup at smc.vnet.net
- Subject: [mg39495] Re: Problem with If statement in a Do or a While loop
- From: Omega Consulting <info at omegaconsultinggroup.com>
- Date: Wed, 19 Feb 2003 04:43:17 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
Replace
If[ ( (y > (c10 - (c10*tol) ) || y < (c10 + (c10*tol)) ) && t10 == 0 ) ,
( t10 = \[Theta]; Print["t10 found"]; Continue[] ) ,
(Print["t10 not found"]; Continue[])
]
with
If[ ( (y > (c10 - (c10*tol) ) || y < (c10 + (c10*tol)) ) && t10 == 0 ) ,
( t10 = \[Theta]; Print["t10 found"]; Continue[] ) ,
(Print["t10 not found"]; Continue[]),
Print[((y>(c10-(c10*tol)) || y<(c10+(c10*tol))) && t10==0)]; Abort[]
]
In[5]:= n=1; Fig[n]=Diffusion2[1,0.5+n/10,n/4,130,1,0.1,0.9]
{0.001}>{{0.036}}||{0.001}<{{0.044}}
Out[5]=$Aborted
The test doesn't evaluate to True or False because < and > can't compare lists.
At 03:33 AM 2/17/2003, A.Reinstaller at MERIT.unimaas.nl wrote:
>Hi,
>
>thanks and sorry for providing incomplete information. I have checked your
>example on the file and it must indeed be the case that the statement cannot
>be checked, BUT simplifying the condition in the IF statement afterwards
>does not help. A simple y>c10, where y is the result of the interpolating
>function and c10 is another value extracted from there does not "fire", even
>though I have checked with a Print[y],Print[c10] in the loop whether the
>values are correctly assigned which is the case.
>
>I'm just puzzled... I don't get it where I have it wrong - on such a trivial
>issue. The problem suggests that the parameter values correctly assigned
>beforehand, are not taken over into the If evaluation, but I can't believe
>that that's the case.
>
>
>
>\!\(\(Diffusion2[\[Omega]_, q1_, cvet_, \ Tmax_, \ rate_, \ low_, \ high_]
>:=
> \[IndentingNewLine]Module[{D, C, q2, x1, x2, y1, y2, w1, w2, u1, u2, px,
>
> py, cy, e, \[Alpha], \ S, \ t10, t90, \ c10, c90, y, tol, \
> \[CapitalDelta]t, stept, \ \[Theta]},
> \[IndentingNewLine]\[IndentingNewLine]D = {{\(-1\), 1}, {1, \(-1\)}};
> \[IndentingNewLine]C\ = {{1, \(-1\)}, {\(-1\), 1}};
> \[IndentingNewLine]\n\n\t\t\n\t\tw1 = {\@\(1 - px\), \@\(1 - py[t]\)};
>
> \[IndentingNewLine]w2 = {\@\(2 - px\), \@\(2 - py[t]\)}; \n\n\t\t
> \[IndentingNewLine]q2 = 1 - q1;
> \[IndentingNewLine]\[Alpha] = 2 \[Omega] - 1;
> \[IndentingNewLine]\[IndentingNewLine]\n\t\t
> \[IndentingNewLine]u1 =
> q1*\[Alpha]*C . {x1[t], y1[t]} + q2*C . {x2[t], y2[t]} + w1;
> \[IndentingNewLine]u2 =
> q1*D . {x1[t], y1[t]} + q2*\[Alpha]*C . {x2[t], y2[t]} + w2;
> \[IndentingNewLine]\[IndentingNewLine]veblen07 =
> \[IndentingNewLine]{
> \[IndentingNewLine]\(x1'\)[t] \[Equal]
> x1[t]*{1 - x1[t], \(-y1[t]\)} . u1,
> \[IndentingNewLine]\(y1'\)[t] \[Equal]
> y1[t]*{\(-x1[t]\), 1 - y1[t]} . u1,
> \[IndentingNewLine]\[IndentingNewLine]\(x2'\)[t] \[Equal]
> x2[t]*{1 - x2[t], \(-y2[t]\)} . u2,
> \[IndentingNewLine]\(y2'\)[t] \[Equal]
> y2[t]*{\(-x2[t]\), 1 - y2[t]} . u2,
> \[IndentingNewLine]\[IndentingNewLine]\(py'\)[t] \[Equal]
> \(-rate\)*\((py[t] - cy)\)*
> \((y1[t] + y2[t])\)\[IndentingNewLine]};
> \[IndentingNewLine]\[IndentingNewLine] (*\ Tmax = 25; \ *)
> \[IndentingNewLine]px = 0.5; cy = 0.9; \[IndentingNewLine]e = 0.001;
>
> \[IndentingNewLine]\[IndentingNewLine]IvaluesIncome = {
> \[IndentingNewLine]x1[0] \[Equal] 1 - e, y1[0] \[Equal] e,
> \[IndentingNewLine]x2[0] \[Equal] 1 - e, y2[0] \[Equal] e, \
> \[IndentingNewLine]py[0] \[Equal] 1};
> \[IndentingNewLine]\[IndentingNewLine]solutionIncome =
> NDSolve[Join[veblen07, IvaluesIncome], {x1, x2, y1, y2, py}, {t, 0,
> Tmax}]; \[IndentingNewLine]\n\t\t
> S = {\(\((q1*y1[t] + q2*y2[t])\) /. solutionIncome\) /. t -> Tmax}; \n
> \t\ty = {\(\((q1*y1[t] + q2*y2[t])\) /. solutionIncome\) /. t -> 0};
>\n
> \t\tc10 = S*low; \ c90 = S*high; \n\t\tt10 = 0; t90 = 0; \n\t\t
> \[CapitalDelta]t = 0; \n\t\ttol = 0.1; \n\t\n\t\ \ stept =
>Tmax*0.0001;
> \ \n\t\n\t\n\ \ \t
> Do[\ \n\t\t\t{
> y = \(\((q1*y1[t] + q2*y2[t])\) /. solutionIncome\) /.
> t -> \[Theta]; \ \ \n\t\t\t\t\n\t\t\t\t
> If[\ \((\ \ \
> \((y > \((c10 - \((c10*tol)\)\ )\) || \
> y < \((c10 + \((c10*tol)\))\)\ )\)\ && \ t10\ == 0\ \
>)
> \)\ , \((\ t10 = \[Theta]; \ Print["\<t10 found\>"]; \
> Continue[]\ )\)\ , \
> \((Print["\<t10 not found\>"]; \ Continue[])\)\ \ \ ];
>\n\t\t\t\t
> \n\t\t\t\t
> If[\ \((\ \ \
> \((\ y > \((c90 - \((c90*tol)\))\)\ || \
> y < \((c90 + \((c90*tol)\))\)\ )\)\ && \
> t90\ == 0\ \ \ )\)\ ,
> \((\ \ t90 = \[Theta]; \ Print["\<t90 found\>"]; \
>Continue[])\),
> \ \((\ Print["\<t90 not found\>"]; \ Continue[])\)\ \ ]; \n
> \t\t\t\t\n\t\t\t\t
> If[\ \((t10 > 0)\)\ && \ \((t90 > 0)\),
> \((\[CapitalDelta]t = t90 - t10; \ Continue[])\)\ ]; },
>\n\t\t\t\n
> \t\t\t{\[Theta], 0, Tmax, stept}]; \t\n\t\t\n\t\t\n\t\t
> \[IndentingNewLine]Plot[{
> Evaluate[\((q1*y1[t] + q2*y2[t])\) /. solutionIncome]}, {t, 0,
> Tmax}, \ Frame \[Rule] True,
> PlotLabel \[Rule] "\<Diffusion path \>", PlotRange \[Rule] All,
> PlotStyle \[Rule] {style1[cvet]}]\n\t\t\t\t\n\t\t
> Print["\<q2 \>", \ \ q2, "\< omega = \>"\ , \ \[Omega]]; \n\t\t
> Print["\<Saturationlevel = \>", \ S]; \ \n\t\t
> Print["\<Time elapsed to reach t10 = \>", \ t10]; \n\t\t
> Print["\<Time elapsed to reach t90 = \>", \ t90]; \n\t\t
> Print["\<Diffusion speed \[CapitalDelta]t = \>", \ \[CapitalDelta]t];
>\t
> \n\n\t\t\n\t\t\n\[IndentingNewLine]]\n\n\n\t\t\)\)
>
> Do[{Fig[n]=Diffusion2[1,0.5+n/10,n/4,130,1,0.1,0.9]},{n,1,4,1}];
>
>
>
>-----Original Message-----
>From: Andrzej Kozlowski [mailto:akoz at mimuw.edu.pl]
To: mathgroup at smc.vnet.net
>To: mathgroup at smc.vnet.net
>Subject: [mg39495] Problem with If statement in a
>Do or a
>While loop
>
>
>
>Because you do not provide the values needed to run your program it is
>impossible to answer your question without very detailed examination of
>your code. Perhaps somebody will have the time to do that. However, let
>me point out that If may produce no output when Mathematica can't
>verify whether a statement is true or untrue for example:
>
>
>If[x>2,Print[3],Print[4]]
>
>If[x>2,Print[3],Print[4]]
>
>Since Mathematica does not know the value of x it just returns the
>input. In such cases you cna use If with an extra argument:
>
>
>If[x>2,Print[3],Print[4],Print[5]]
>
>
>5
>
>This may or may not apply to your case.
>
>Andrzej Kozlowski
>Yokohama, Japan
>http://www.mimuw.edu.pl/~akoz/
>http://platon.c.u-tokyo.ac.jp/andrzej/
>
>
>On Saturday, February 15, 2003, at 03:42 PM,
>A.Reinstaller at MERIT.unimaas.nl wrote:
>
> > There is a problem I continue to have, perhaps one knows what's wrong.
> > I
> > try to check the values generated by an interpolating function. I do
> > so by
> > using a Do loop in which I ask whether the function has reached some
> > value
> > within a small intervall and if so to write the time tag of the first
> > hit
> > out. Now, when running the program it does not step into the IF
> > evaluations.
> > I have added an else branch to be sure that even if the condition was
> > not
> > true something would be written out. I have also checked whether the
> > values
> > of the interpolating function are correctly extracted as well as
> > whether
> > they were really lying in the intervall asked for in the IF statement.
> > In
> > top of that I varied the stepsize to a minimal and increased the
> > margins of
> > the intervall. I used also a While instead of a Do loop. But in any
> > case
> > neither the THEN nor the ELSE branch "fired", telling me that the IF
> > statement is not checked. WHY????
> >
> >> Is there some restriction for the use of IF clauses in loops in
> >> Mathematica? Otherwise I could not explain why nothing happens. I
> >> checked
> >> in the manual but nothing was mentioned.
> >>
> >> Thanks for your forthcoming help. Andreas
> >>
> >> Here is the code:
> >>
> >> solutionIncome=
> >> NDSolve[Join[veblen07,IvaluesIncome],{x1,x2,y1,y2,py},{t,0,Tmax}];
> >>
> >> S={(q1*y1[t]+q2*y2[t])/.solutionIncome/.t->Tmax};
> >> c10=S*0.01; c90=S*0.9;
> >> t10=0;t90=0; \[CapitalDelta]t=0;
> >> tol=0.1; stept=Tmax*0.0001;
> >>
> >> Do[ {
> >> y=(q1*y1[t]+q2*y2[t])/.solutionIncome/.t->\[Theta];
> >> If[ ( (y>(c10-(c10*tol) )|| y<(c10+(c10*tol)) ) && t10 ==0
> >> ) ,( t10=\[Theta]; Print["t10 found"]; Continue[] ) , (Print["t10 not
> >> found"]; Continue[]) ];
> >> If[ ( ( y>(c90-(c90*tol)) || y<(c90+(c90*tol)) ) && t90
> >> ==0 ) ,(t90=\[Theta]; Print["t90 found"]; Continue[]), (Print["t90
> >> not
> >> found"]; Continue[]) ];
> >> If[ (t10>0) && (t90>0),(\[CapitalDelta]t=t90-t10;
> >> Continue[]) ];
> >> },
> >> {\[Theta],0,Tmax,stept}];
> >>
> >>
> >>
> >
> >
> >
--------------------------------------------------------------
Omega Consulting
"The final answer to your Mathematica needs"
http://omegaconsultinggroup.com