cancel
Showing results for 
Search instead for 
Did you mean: 

Runge-Kutta

Super User
458 Views
Super User
Super User

Runge-Kutta

The deeper I dig into @Phil_Seamark's fantastic new book, Beginning DAX with Power BI: The SQL Pro’s Guide to Better Business Intelligence, the more cool stuff I find. This time it is Nested VAR statements. Who knew? Well, the cool part about finding this particular nugget of wisdom is that it finally allowed me to more elegantly solve another rather vexing problem that I blogged about in my article Runge-Kutta and the Limits of DAX

 

Because of the localization of variables but with the ability to intelligently reference variables at higher levels in the nesting, I was finally able to come up with a much more elegant single measure solution to Runge-Kutta that allows me to keep my variable names consistent throughout the calculation. 

 

The calculation below takes a table of time intervals, 0, .5, 1, 1.5, 2 (h=0.5) and the following two definitions:

y' = y−t^2 + 1

y(0) = 0.5

 

 

m_w = 
VAR tCurrent = MAX(RK4[t])
VAR t=0
VAR w = 0.5
VAR h = 0.5
VAR step1 = IF(
                tCurrent=0,
                w,
                VAR k1t = t
                VAR t = t+h
                VAR k1w = w
                VAR k1 = h*(k1w - k1t^2 + 1)
                VAR k2t = k1t + h/2
                VAR k2w = k1w + k1/2
                VAR k2 = h*(k2w - k2t^2 + 1)
                VAR k3t = k1t + h/2
                VAR k3w = k1w + k2/2
                VAR k3 = h*(k3w - k3t^2 + 1)
                VAR k4t = k1t + h
                VAR k4w = k1w + k3
                VAR k4 = h*(k4w - k4t^2 + 1)
                VAR w = k1w + (k1 + 2*k2 + 2*k3 + k4)/6

                VAR step2 = IF(
                                tCurrent=h,
                                w,
                                VAR k1t = t
                                VAR t = t+h
                                VAR k1w = w
                                VAR k1 = h*(k1w - k1t^2 + 1)
                                VAR k2t = k1t + h/2
                                VAR k2w = k1w + k1/2
                                VAR k2 = h*(k2w - k2t^2 + 1)
                                VAR k3t = k1t + h/2
                                VAR k3w = k1w + k2/2
                                VAR k3 = h*(k3w - k3t^2 + 1)
                                VAR k4t = k1t + h
                                VAR k4w = k1w + k3
                                VAR k4 = h*(k4w - k4t^2 + 1)
                                VAR w = k1w + (k1 + 2*k2 + 2*k3 + k4)/6

                                VAR step3 = IF(
                                                tCurrent=2*h,
                                                w,
                                                VAR k1t = t
                                                VAR t = t+h
                                                VAR k1w = w
                                                VAR k1 = h*(k1w - k1t^2 + 1)
                                                VAR k2t = k1t + h/2
                                                VAR k2w = k1w + k1/2
                                                VAR k2 = h*(k2w - k2t^2 + 1)
                                                VAR k3t = k1t + h/2
                                                VAR k3w = k1w + k2/2
                                                VAR k3 = h*(k3w - k3t^2 + 1)
                                                VAR k4t = k1t + h
                                                VAR k4w = k1w + k3
                                                VAR k4 = h*(k4w - k4t^2 + 1)
                                                VAR w = k1w + (k1 + 2*k2 + 2*k3 + k4)/6

                                                VAR step4 = IF(
                                                                tCurrent=3*h,
                                                                w,
                                                                VAR k1t = t
                                                                VAR t = t+h
                                                                VAR k1w = w
                                                                VAR k1 = h*(k1w - k1t^2 + 1)
                                                                VAR k2t = k1t + h/2
                                                                VAR k2w = k1w + k1/2
                                                                VAR k2 = h*(k2w - k2t^2 + 1)
                                                                VAR k3t = k1t + h/2
                                                                VAR k3w = k1w + k2/2
                                                                VAR k3 = h*(k3w - k3t^2 + 1)
                                                                VAR k4t = k1t + h
                                                                VAR k4w = k1w + k3
                                                                VAR k4 = h*(k4w - k4t^2 + 1)
                                                                VAR w = k1w + (k1 + 2*k2 + 2*k3 + k4)/6
                                                                RETURN w
                                                            )
                                                RETURN step4
                                            )
                                RETURN step3
                            )
            RETURN step2
        )
RETURN step1

 

 

Thanks again @Phil_Seamark!!

 

 

 

 


Did I answer your question? Mark my post as a solution!

Proud to be a Datanaut!