Thanks, it worked!
Em domingo, 4 de maio de 2014 19h06min47s UTC-3, Tony Kelman escreveu: > > On the lines where you initialize k and l to [0 0 0 0 0 0], that is an > array of integers by default. Then in the for loops where you try to assign > a floating-point result into that array, you get an InexactError because a > general floating-point number can't be exactly represented as an integer. > If you change those to float64([0 0 0 0 0 0]) or Float64[0 0 0 0 0 0] or > [0.0 0.0 0.0 0.0 0.0 0.0], and likewise with t0, v0, and w0, it should work. > > > On Sunday, May 4, 2014 2:40:17 PM UTC-7, Paulo Castro wrote: >> >> I was trying to port a function from a previous Python code of mine, and >> ended with this: >> >> # Rubge-Kutta-Fehlberg >> function RKF45(f, g, h, t0, tf, v0, w0) >> # Initial values >> t = t0 >> v5 = v4 = v = v0 >> w = w0 >> >> tolerance = 10^(-5.0) >> >> # Create list for future plots >> t_list = [t] >> v_list = [v] >> w_list = [w] >> >> # Values for a, b and c (as on Butcher's tableau) >> a = [ 0 0 0 0 0 0; >> 1/4 0 0 0 0 0; >> 3/32 9/32 0 0 0 0; >> 1932/2197 -7200/2197 7296/2197 0 0 0; >> 439/216 -8 3680/513 -845/4104 0 0; >> -8/27 2 -3544/2565 1859/4104 -11/40 0] >> >> b = [16/135 0 6656/12825 28561/56430 -9/50 2/55; >> 25/216 0 1408/2565 2197/4104 -1/5 0] >> >> c = [0 1/4 3/8 12/13 1 1/2] >> >> # Relative to y >> k = [0 0 0 0 0 0] >> >> # Relative to z >> l = [0 0 0 0 0 0] >> >> # Compute the next terms >> for i in t0:h:tf >> # Compute the next values of K and L >> for j in 1:6 >> k[j] = f(t + c[j] * h, v + (a[j,:] * k')[1], w + (a[j,:] * l' >> )[1])*h >> l[j] = g(t + c[j] * h, v + (a[j,:] * k')[1], w + (a[j,:] * l' >> )[1])*h >> end >> >> >> >> ############################################################################ >> # Compute the next value of V >> # >> # Here we implemented a tolerance test >> # >> >> ############################################################################ >> v4 = v + (b[2] * k')[1] >> # >> v5 = v + (b[1] * k')[1] >> # >> >> # >> error = abs(v5 - v4) >> # >> if error > tolerance >> # >> >> # >> h = 0.9 * h * ((tolerance/error) ^ (0.25)) >> # >> >> # >> for j in 1:6 >> # >> k[j] = f(t + c[j] * h, v + (a[j] * k')[1], w + (a[j] * l' >> )[1])*h # >> l[j] = g(t + c[j] * h, v + (a[j] * k')[1], w + (a[j] * l' >> )[1])*h # >> end >> # >> >> # >> v5 = v + (b[1,:] * k')[1] >> # >> end >> # >> >> # >> v = v5 >> # >> >> ############################################################################ >> >> # Compute T and W with the right values of H and L, obtained >> after the tolerance test >> t += h >> w += (b[1,:] * l')[1] >> >> # Append new values to the lists >> push!(t_list,t) >> push!(v_list,v) >> push!(w_list,w) >> end >> >> return t_list, v_list, w_list >> end >> >> After running this code, I got a mysterious error message: >> >> >> >> *ERROR: InexactError() in setindex! at array.jl:346while loading >> /home/paulo/Documents/Working/ex1.jl, in expression starting on line 28* >> >> ex1.jl is the file I used to test my function: >> >> include("rungekutta.jl") >> >> function f(t, v, w) >> return (v*(v-a)*(1-v) - w + I)/ε >> end >> >> function g(t, v, w) >> return (v - p*w - b) >> end >> >> ε = 0.005 >> a = 0.5 >> b = 0.15 >> p = 1.0 >> I = 0.0 >> h = 0.005 >> >> # Initial and final values of time >> t0 = 0 >> tf = 8 >> >> t, v, w = RKF45(f, g, h, t0, tf, 0, 0) # v0 = w0 = 0 >> >> Can someone help me with finding what's the problem? I tried a lot of >> things, but always end with this error. >> >> Thanks! >> >>