2
$\begingroup$
yy[x_, t_] := Which[x == 0, yy[0, t] = 0, x == 1, yy[1, t] = 0, t == 0,yy[x, 0] = Exp[-1000 (x - .3)^2]]; 


N[Flatten[Table[yy[x, t + .00002] = yy[x + .01, t] + yy[x - .01, t], {t, 0, 
0.00002, 0.00002}, {x, .01, .99, .01}], 1], 5]

As can be seen below, I get several Null values which shouldn't be there. This is due to Mathematica making .02 into 0.019999999999999997`. Can anyone tell me how to get Mathematica to stop doing this?

{8.93949*10^-35, 2.18745*10^-32, 4.3823*10^-30, 7.188*10^-28, 9.65289*10^-26, 1.06133*10^-23, 9.55413*10^-22,7.04172*10^-20,4.24931*10^-18,2.0995*10^-16,8.49329*10^-15,2.81328*10^-13,7.63035*10^-12,1.69471*10^-10,3.0825*10^-9,4.59226*10^-8,5.60465*10^-7,5.60527*10^-6,0.0000459573,0.000309099,0.00170696,0.00775012,0.0289853,0.0895316,0.22922,0.488655,0.872217,1.31141,1.67032,1.80967,1.67032,1.31141,0.872217,0.488655,0.22922,0.0895316,0.0289853,0.00775012,0.00170696,0.000309099,0.0000459573,5.60527*10^-6,5.60465*10^-7,4.59226*10^-8,3.0825*10^-9,1.69471*10^-10,7.63035*10^-12,2.81328*10^-13,8.49329*10^-15,2.0995*10^-16,4.24931*10^-18,7.04172*10^-20,9.55413*10^-22,1.06133*10^-23,9.65289*10^-26,7.188*10^-28,4.3823*10^-30,2.18745*10^-32,8.93957*10^-35,2.99114*10^-37,8.19405*10^-40,1.83781*10^-42,3.37478*10^-45,5.07378*10^-48,6.24537*10^-51,6.29399*10^-54,5.1932*10^-57,3.50821*10^-60,1.94034*10^-63,8.78637*10^-67,3.25749*10^-70,9.88775*10^-74,2.45727*10^-77,4.99977*10^-81,8.32891*10^-85,1.13597*10^-88,1.26849*10^-92,1.15971*10^-96,8.68063*10^-101,5.31979*10^-105,2.66919*10^-109,1.09649*10^-113,3.68784*10^-118,1.0155*10^-122,2.28944*10^-127,4.2259*10^-132,6.38632*10^-137,7.90174*10^-142,8.00454*10^-147,6.63882*10^-152,4.50803*10^-157,2.50624*10^-162,1.14078*10^-167,4.25128*10^-173,1.29712*10^-178,3.24027*10^-184,6.6271*10^-190,1.1097*10^-195,1.52136*10^-201,2.18745*10^-32,4.38239*10^-30,
 7.188*10^-28 + Null, 9.65333*10^-26, 1.0614*10^-23, 9.55509*10^-22, 2. Null, 4.25026*10^-18,2.1002*10^-16,4.24931*10^-18+Null,2.81538*10^-13,7.63885*10^-12,1.69471*10^-10+Null,3.09013*10^-9,4.6092*10^-8,5.63548*10^-7,5.65119*10^-6,5.60465*10^-7+Null,0.000309099 +Null,0.00175291,0.00805922,0.0306922,0.0972817,0.258206,0.488655 +Null,1.10144,1.80006,2.54254,3.12108,3.34064,3.12108,2.54254,1.80006,1.10144,0.578186,0.22922 +Null,0.00775012 +Null,0.0306922,0.00805922,0.00175291,0.000314704,0.0000465178,5.65119*10^-6,5.63548*10^-7,4.6092*10^-8,3.09013*10^-9,1.69752*10^-10,7.63035*10^-12+Null,2.0995*10^-16+Null,8.49754*10^-15,2.1002*10^-16,4.25026*10^-18,7.04278*10^-20,9.55509*10^-22,1.0614*10^-23,9.65333*10^-26,7.18822*10^-28,4.38239*10^-30,2.18748*10^-32,8.93965*10^-35,2.99116*10^-37,8.19408*10^-40,1.83782*10^-42,3.37479*10^-45,5.07378*10^-48,6.24538*10^-51,6.294*10^-54,5.19321*10^-57,3.50821*10^-60,1.94034*10^-63,8.78637*10^-67+Null,2.45727*10^-77+Null,9.88775*10^-74,2.45727*10^-77,4.99977*10^-81,8.32891*10^-85,1.13597*10^-88,1.26849*10^-92,1.15971*10^-96,8.68063*10^-101,5.31979*10^-105,2.66919*10^-109,1.09649*10^-113,3.68784*10^-118,1.0155*10^-122,2.28944*10^-127,4.2259*10^-132,6.38632*10^-137,7.90174*10^-142,8.00454*10^-147,6.63882*10^-152,4.50803*10^-157,2.50624*10^-162,1.14078*10^-167,4.25128*10^-173,1.29712*10^-178+Null,1.1097*10^-195+Null,6.6271*10^-190,1.1097*10^-195}
$\endgroup$
  • 3
    $\begingroup$ Try this. yy[x_, t_] := Which[x == 0, yy[0, t] = 0, x == 1, yy[1, t] = 0, t == 0, yy[x, 0] = Exp[-1000 (x - .3)^2], True, "Doh!"]; Then read the friggin documentation, I'm sure you can figure it out from there. $\endgroup$ – ciao Apr 6 '15 at 5:52
  • 2
    $\begingroup$ If you want exact numerics, use exact numbers: 2/1000 instead of 0.002 and avoid N. $\endgroup$ – István Zachar Apr 6 '15 at 8:15
  • 3
    $\begingroup$ Note that 0.01 + 0.01 equals 0.02` , while 0.03 - 0.01 equals 019999999999999997` . This is due to numerical round-off error consistent with IEEE 754 binary64 floating-point numbers. Note that 0.02 - (0.03 - 0.01) equals 2^(-58), a one-bit loss of precision. The problem with your code is subtler, though, since 0.019999999999999997` == 0.02` returns True, but as patterns, 0.019999999999999997` does not match 0.02` . $\endgroup$ – Michael E2 Apr 6 '15 at 10:30
  • 2
    $\begingroup$ The methods here (1072) might help you construct a solution to this problem. $\endgroup$ – Michael E2 Apr 6 '15 at 12:35
  • 2
    $\begingroup$ @MichaelE2 Perhaps a duplicate of this: The difference between 0. and 0? It has a lot of good answers patternmatching-wise. $\endgroup$ – István Zachar Apr 7 '15 at 9:54
6
$\begingroup$

What you experience is not Mathematica not dealing with 0.02 correctly, but your yy[...] being called with arguments, for which it is not defined.

The following modification will show you the reason:

yy[x_, t_]:=
  Which[x == 0, yy[0, t] = 0, x == 1, yy[1, t] = 0, t == 0, 
    yy[x, 0] = Exp[-1000 (x - .3)^2],
    True, Print["x==", x, " t==", t];"yy[" <> ToString@x <> "," <>
     ToString@t <> "] not defined!"]

The problem is t==0.00002, since the case is not covered by your specification of yy. If you fix this, you should experience no further issues.

Besides:

Regarding numerical calculations in Mathematica, you might find interest in the reference documentation on Precision and Accuracy.


Extension/Working Solution

Defining yz in a way, that allows for function pattern matching, you will be successful:

yz[0 | 1, _] = 0; yz[x_, 0] := Exp[-1000. (x - .3)^2];
yz[x_, .00002] := yz[x + 1/100, 0] + yz[x - 1/100, 0];

And now:

Flatten@Table[yz[x, t], {t, {0, .00002}}, {x, 1/100, 99/100, 1/100}]

calls no undefined functions anymore (just copy the whole next expression into your notebook and execute):

Uncompress@"1:eJxdk3tYTHkYx4fB2FXLFt00XVXDTEZJ03SZU0q6sdkorcImMbFt3rKkMTOyWZVQEom\
onmdH2xJSbbdZhdRuY9imclu5JWl2C0mbae2ZM+d3dp+dP+aP85zz+73v9/P9WMd8/\
XlcC41GS5qE/4UIk5JhisMMhhFEukFP5rJ3PZd/d4PBhuJ9b2Kj+\
FCyLiMtwa2LD0FDTR3+KSHukLZKUPNNT6M7qC/ZMJ6cnesBiwI4f5+\
elusB8min4us3hj0g2KwwMPdYmCco66+\
bcrDznmBmZ9tawKR7Qds5Rez81jAvKPqIl1HXfMYLQhNq2F3efV4Q6McS1QvnCSDAPIsXc\
nizAKKH4mNeV5YI4E2HfnTqim4ByEWxVSkKBgYZ6YryzGcLMcja+\
22GIX8NBsLnZurlUjEGmy/4/vXzWCEGjsN5V9LpVRjYLH8vl3e3YcBOmHrFc/\
I9DN4lwhTfpF4M+OzOgq+G1RjQiN/\
Qf570o3cM0Fc0dA51MnVXMLp9A5pnC5pwC5qZ2oLayxhtOhPtbo3ScEf5UIlRGVKpjpuSO\
cej5NuWkiwsEB3lSpJX3CBJcGgtyfS3RpIyxZ1qQvycs4dC79zmQdtpF/YksR8PHlWlP/\
fyq3SFS/pcy+AypiucnMnaKrmYtghmTd6zWBr01AW8O3LSj4R4u4BVhCu95UD+QvB5zX/\
4MrPfGc6Ud2ZaXeA5w6fnMJsNmj1O0Dg72LIoqmUB/\
BR938bj6pQF8DqmvTxpdDEXNJr65O1PU+\
aD6dEX3XfUPzpC6EJF9OXt9zgQ3j1TZXebzoHe76WinGUsNpyHUvXjuIB5YLvJwiJseuxc\
qFYqIktoqSwIVIkmRTRnO8D+0l1823sn7GHbjKrVgV2ldmCZkygy+\
SCbA6tcSrnW12S28Cr2gWfSklIbeBRv1yTOL7CGXWOj+iO3sqxg6ZgZ/\
UnTTksIZx2UxX4cYwFDn3y2o3bfEiZ4Gx62yWDYmUOg3taKwdu02aBy9z+\
XwugyhYbVK8fsT8tMICzpyJrehmRj4D0z56iUXkZwtw67ycuaMOvf5D9crRnV24izGAoX8\
g5o6WSPnz0l0fKSrRs9rtQSHJ4gUIeV4Uzn2zFExno4ZVW+\
z4vcVpz7jPET9MrjeBPeP04xuO6Dd2P36q11elZ4W6TPQ4NGfsX7s8mgbHDPDbxRDp39i+\
uC8I6FpV50Fe/CW1fdUa2fLcN7WGzSx4y6iTeT81L0tjAN76qE9ac40GQqBncbfApu+\
bhgsE3GjZC8wxveLO/OPyaXYFA8et9pxflTGOSVhFdkDlRjwL1mKzeKUGDgWu64wMK/\
BwOpn1O1c/8ABg4X1Zr098MYiNz4e4trx5BxGgyS0RNr9I4QfcVE5+\
ijk3PRXUXo9hI0jz+\
asB7NzEFbsNFe1KbpaHcmSmNUReZDR4lRGVKpUjk3acjkpYhF8xySjj3iNbyWJFimIZkKE\
OUn10ju35kVKV9pm3DG08DfSuvgtKKa9au0DlbQ1z5iaB3cWFrl6a11cKKRZP8yrYNvQ14\
lSrUOchf1jRAO1oobBwgHg++OfEk4+IuYbT+\
gdbCn72AN4aDLi4l8wkHhIV9nwkEwUXAJB1kFjErCQcP4yFTCwYMPHzwgHJT2dq0nHNy+\
pLCTcND4ZNNuwsGmHal/EA5KEo/\
qHPR1439BOJjg2K5zsLb4B52Duap2nYO5XXt1DuZ9qNA5yI18qnMwspCtc9Bw97jOQYtyp\
s5B5c5DOgenm4fqHBRdJR1siScdbM0mHYzKIx0U5v/PwX8ArqJBfw=="
| improve this answer | |
$\endgroup$
  • $\begingroup$ I'm still confused. yy[x,t] is the boundary and initial conditions of a wave on a string. N[Flatten[Table[yy[x, t + .00002] = yy[x + .01, t] + yy[x - .01, t], {t, 0, 0.00002, 0.00002}, {x, .01, .99, .01}], 1], 5] evaluates yy at t=0 to find y at t+.00002. Because the value of y[x,.00002] is stored according to my table function I don't see why it's returning this null message. $\endgroup$ – Daniel Berkowitz Apr 6 '15 at 23:19
  • $\begingroup$ @DanielBerkowitz: You just don't actually do that in all cases, i.e.: For pattern matching, 0 e.g. does not equal 0.0. I'll extend the answer to provide a working solution. $\endgroup$ – Jinxed Apr 7 '15 at 6:36

Not the answer you're looking for? Browse other questions tagged or ask your own question.