Re: DSolve Issues
- To: mathgroup at smc.vnet.net
- Subject: [mg88356] Re: DSolve Issues
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Sat, 3 May 2008 06:13:47 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <fveguc$5ed$1@smc.vnet.net>
donkorgi12 wrote: > I am solving the following Differential Equation > > Phi''[r]+2*r^(-1)Phi'[r]+0.104479*Phi[r]==0 and Phi[0]==K (some > constant) ; kinda has a cos/sin solution > > 2.71828^(-0.323232 \[ImaginaryI] r) ((0.+ > 0. \[ImaginaryI]) + (0.+ 0. \[ImaginaryI]) 2.71828^( > 0.646465 \[ImaginaryI] r) + (0.+ 1.54687 \[ImaginaryI]) K - (0.+ > 1.54687 \[ImaginaryI]) 2.71828^(0.646465 \[ImaginaryI] r) K) > > all divided by r. > > My problem is that Mathematica is not treating those "zeros".... as > well zeros. Thus, the solution cannot really be used. In fact, if I > manually reproduce the solution and remove those "zeros", then the > solution is fine. Say your solution is called sol. You can get ride of the spurious zeros yield by numerical impression thanks to the command *Chop[]*. For instance, In[1]:= sol = 2.71828^(-0.323232 I r) ((0. + 0. I) + (0. + 0. I) 2.71828^(0.646465 I r) + (0. + 1.54687 I) K - (0. + 1.54687 I) 2.71828^(0.646465 I r) K) // Chop Out[1]= 0.646465 I r 1.54687 I K - 1.54687 I 2.71828 K --------------------------------------------- 0.323232 I r 2.71828 It would be better to use exact arithmetic as early as possible, either by entering exact numbers (e.g. 1.0 is not the same thing as 1 from a computational point of view since the underlaying computer representation is not the same at all) or using the built-in function *Rationalize[]*. Moreover, one can convert exponential function thanks to the function *ExpToTrig[]*. For instance, In[2]:= ode = Rationalize[Phi''[r] + 2*r^(-1) Phi'[r] + 0.104479*Phi[r], 0]; sol = DSolve[{ode == 0, Phi[0] == K}, Phi, r] Phi[r] /. sol[[1]] // ExpToTrig Out[3]= 1/500 I Sqrt[104479] r 500 I (-1 + E ) K {{Phi -> Function[{r}, -(-----------------------------------------)]}} (I Sqrt[104479] r)/1000 E (Sqrt[104479] r) Out[4]= 1 Sqrt[104479] r Sqrt[104479] r -(-------------- (500 I K (Cos[--------------] - I Sin[--------------]) Sqrt[104479] r 1000 1000 Sqrt[104479] r Sqrt[104479] r (-1 + Cos[--------------] + I Sin[--------------]))) 500 500 [snip] > Yet, Mathematica treats those "zeros" as something else. No. It treats them as *inexact* numbers, which is fine since you are using inexact (aka *machine-size*) arithmetic. The following multimedia demo illustrates strikingly the difference between floating-point arithmetic and arbitrary/exact arithmetic. http://www.wolfram.com/technology/guide/precisiontracking.html Best regards, -- Jean-Marc