physics/smooth.html 2020-10-31
Smooth steps and minimal jerk
scaled to 0,0 - 1,1: x = 10 * t**3 - 15 * t**4 + 6 * t**5 v = 30 * t**2 - 60 * t**3 + 30 * t**4 a = 60 * t - 180 * t**2 + 120 * t**3 j = 60 * (1 - 6 * t + 6 * t**2) to get physics units: t /= duration D x *= amplitude A v */ A/D a */ A/D^2 zero jerk: t = p(x):= 10 * x**3 - 15 * x**4 + 6 * x**5; v(x):= 30 * x**2 - 60 * x**3 + 30 * x**4; a(x):= 60 * x - 180 * x**2 + 120 * x**3; j(x):= 60 * (1 - 6 * x + 6 * x**2); solve(j(x), x); 3 +/-sqrt(3) x = - ----------- 6 peak velocity: v(0.5) = 1.875 A/D peak acceleration: a((3-sqrt(3))/6) = 10/sqrt(3) A/D^2 \approx 5.77 A/D^2 peak jerk: j(0) = 60 A/D^3 j(0.5) = -30 A/D^3 j(1) = 60 A/D^3 lowest order polynomial with finite jerk (sometimes called minimum jerk) x(t) := a + b*t + c*t**2 + d*t**3 + e*t**4 + f*t**5; define (v(t), (diff(x(t), t))); define (a(t), (diff(v(t), t))); define (j(t), (diff(a(t), t))); solve([x(0)=0, x(1)=1, v(0)=0, v(1)=0, a(0)=0, a(1)=0], [a, b, c, d, e, f]); /* [[a = 0, b = 0, c = 0, d = 10, e = - 15, f = 6]] */ p(x) = 10*x**3 + -15*x**4 + 6*x**5 lowest order polynomial with finite jerk, more general case with non-zero v0 and a0 x(t) := a + b*t + c*t**2 + d*t**3 + e*t**4 + f*t**5; define (v(t), (diff(x(t), t))); define (a(t), (diff(v(t), t))); define (j(t), (diff(a(t), t))); solve([x(0)=0, x(1)=1, v(0)=v0, v(1)=0, a(0)=a0, a(1)=0], [a, b, c, d, e, f]); /* [[a = 0, b = v0, c = a0/2, d = - 6 v0 -3/2 a0 + 10), e = 8 v0 + 3/2 a0 - 15), f = -3 v0 - 1/2 a0 + 6)]] */ p(x, v0, a0) = v0*x + 0.5*a0*x**2 - (6*v0+1.5*a0-10)*x**3 + (8*v0+1.5*a0-15)*x**4 - (3*v0+0.5*a0-6)*x**5 v(x, v0, a0) = v0 + a0*x - (18*v0+4.5*a0-30)*x**2 + (32*v0+6*a0-60)*x**3 - (15*v0+2.5*a0-30)*x**4 a(x, v0, a0) = a0 - (36*v0+9*a0-60)*x + (96*v0+18*a0-180)*x**2 - (60*v0+10*a0-120)*x**3 j(x, v0, a0) = -36*v0-9*a0+60 + (192*v0+36*a0-360)*x - (180*v0+30*a0-360)*x**2 lowest order polynomial with finite jerk, general case with non-zero v0, v1, a0 and a1 x(t) := a + b*t + c*t**2 + d*t**3 + e*t**4 + f*t**5; define (v(t), (diff(x(t), t))); define (a(t), (diff(v(t), t))); define (j(t), (diff(a(t), t))); solve([x(0)=0, x(1)=1, v(0)=v0, v(1)=v1, a(0)=a0, a(1)=a1], [a, b, c, d, e, f]); p=v0*x + 0.5*a0*x**2 - (4*v1+6*v0-0.5*a1+1.5*a0-10)*x**3 + (7*v1+8*v0-a1+1.5*a0-15)x**4 - (3*v1+3*v0-0.5*a1+0.5*a0-6)*x**5 (t,v0,a0,v1,a1) = x = (t^4*(14*v1+16*v0-2*a1+3*a0-30))/2-(t^3*(8*v1+12*v0-a1+3*a0-20))/2 -(t^5*(6*v1+6*v0-a1+a0-12))/2+t*v0 + (a0*t^2)/2 v = 2*t^3*(14*v1+16*v0-2*a1+3*a0-30)-(3*t^2*(8*v1+12*v0-a1+3*a0-20))/2 -(5*t^4*(6*v1+6*v0-a1+a0-12))/2+v0+a0*t a = 6*t^2*(14*v1+16*v0-2*a1+3*a0-30)-3*t*(8*v1+12*v0-a1+3*a0-20) -10*t^3*(6*v1+6*v0-a1+a0-12)+a0 j = 12*t*(14*v1+16*v0-2*a1+3*a0-30)-3*(8*v1+12*v0-a1+3*a0-20) -30*t^2*(6*v1+6*v0-a1+a0-12) lowest order polynomial with finite acceleration step for start and finite jerk for finish (ease out) x(t) := a + b*t + c*t**2 + d*t**3 + e*t**4; define (v(t), (diff(x(t), t))); define (a(t), (diff(v(t), t))); define (j(t), (diff(a(t), t))); solve([x(0)=0, x(1)=1, v(0)=v0, v(1)=v1, a(1)=a1], [a, b, c, d, e]); x(t) = t*v0 + (-(t^2*(6*v1+6*v0-a1-12))/2)+t^3*(5*v1+3*v0-a1-8)-(t^4*(4*v1+2*v0-a1-6))/2 v(t) = (-t*(6*v1+6*v0-a1-12))+3*t^2*(5*v1+3*v0-a1-8)-2*t^3*(4*v1+2*v0-a1-6)+v0 a(t) = 6*t*(5*v1+3*v0-a1-8)-6*t^2*(4*v1+2*v0-a1-6)-6*v1-6*v0+a1+12 j(t) = 6*(5*v1+3*v0-a1-8)-12*t*(4*v1+2*v0-a1-6) lowest order polynomial with finite acceleration steps (linear) x(t) := a + b*t + c*t**2 + d*t**3; define (v(t), (diff(x(t), t))); define (a(t), (diff(v(t), t))); define (j(t), (diff(a(t), t))); solve([x(0)=0, x(1)=1, v(0)=v0, v(1)=v1], [a, b, c, d]); x(t) = t*v0 + t^2*(-v1-2*v0+3) + t^3*(v1+v0-2) v(t) = 3*t^2*(v1+v0-2)+2*t*((-v1)-2*v0+3)+v0 a(t) = 6*t*(v1+v0-2) + 2*(-v1-2*v0+3) j(t) = 6*(v1+v0-2) attempt to find higher order polynomial with peak jerk less than 'minimum jerk' x(t) := a + b*t + c*t**2 + d*t**3 + e*t**4 + f*t**5 + g*t**6; define (v(t), (diff(x(t), t))); define (a(t), (diff(v(t), t))); define (j(t), (diff(a(t), t))); solve([x(0)=0, x(1)=1, v(0)=0, v(1)=0, a(0)=0, a(1)=0], [a, b, c, d, e, f, g]); /* [a = 0, b = 0, c = 0, d = 10 - g, e = 3 g - 15, f = 6 - 3 g ]] there is no value for g that reduces the maximum jerk: j(x, g) = 120*g*x**3 + 60*(6-3*g)*x**2 + 24*(3*g-15) * x + 6*(10-g), j(0,g) = 60-6*g, j(1, g) = 60 + 6*g */ even higher order polynomial with peak jerk less than 'minimum jerk' x(t) := a + b*t + c*t**2 + d*t**3 + e*t**4 + f*t**5 + g*t**6 + h*t**7; define (v(t), (diff(x(t), t))); define (a(t), (diff(v(t), t))); define (j(t), (diff(a(t), t))); solve([x(0)=0, x(1)=1, v(0)=0, v(1)=0, a(0)=0, a(1)=0], [a, b, c, d, e, f, g, h]); [[a = 0, b = 0, c = 0, d = (- g) - 3 h + 10, e = 3 g + 8 h - 15, f = (- 3 g) - 6 h + 6]] p(x, g, h) = (- g - 3*h + 10)*x**3 + (3*g + 8*h - 15)*x**4 + (- 3*g - 6*h + 6)*x**5 + g*x**6 + h*x**7 j(x, g, h) = 210*h*x**4 + 120*g*x**3 + 60*(-6*h - 3*g + 6)*x**2 + 24*(15*h + 3*g - 15) * x + 6*(- 10*h - g + 10) j(0, g , h) = 60 - 60*h - 6*g # 10h + g > 0 j(1, g , h) = 60 + (150)*h +6*g # 25h+g < 0 # at t=0 and t=1 this is met by: -10 h < g < -25 h # for instance g=5, h=-.27 has a peak abs(jerk) < 50 A/D^3 in the entire domain making it less jerky than 'minimum jerk' #gnuplot v0=1 a0=1 v1=0 a1=0 set key top left set yrange [-4:6] set multiplot layout 2,2 rowsfirst set label 1 'infinite jerk' at graph 0.8,0.9 font ',8' p1(x) = x*v0 + x**2*(-v1-2*v0+3) + x**3*(v1+v0-2) v1(x) = 3*x**2*(v1+v0-2)+2*x*((-v1)-2*v0+3)+v0 a1(x) = 6*x*(v1+v0-2) + 2*(-v1-2*v0+3) j1(x) = 6*(v1+v0-2) plot [0:1] p1(x) lw 2, v1(x), a1(x) set label 1 'ease out' at graph 0.8,0.9 font ',8' p2(x) = x*v0 + (-(x**2*(6*v1+6*v0-a1-12))/2)+x**3*(5*v1+3*v0-a1-8)-(x**4*(4*v1+2*v0-a1-6))/2 v2(x) = (-x*(6*v1+6*v0-a1-12))+3*x**2*(5*v1+3*v0-a1-8)-2*x**3*(4*v1+2*v0-a1-6)+v0 a2(x) = 6*x*(5*v1+3*v0-a1-8)-6*x**2*(4*v1+2*v0-a1-6)-6*v1-6*v0+a1+12 j2(x) = 6*(5*v1+3*v0-a1-8)-12*x*(4*v1+2*v0-a1-6) plot [0:1] p2(x) lw 2, v2(x), a2(x) set label 1 'x' at graph 0.8,0.9 font ',8' p3(x) = (x**4*(14*v1+16*v0-2*a1+3*a0-30))/2-(x**3*(8*v1+12*v0-a1+3*a0-20))/2 -(x**5*(6*v1+6*v0-a1+a0-12))/2+x*v0 + (a0*x**2)/2 v3(x) = 2*x**3*(14*v1+16*v0-2*a1+3*a0-30)-(3*x**2*(8*v1+12*v0-a1+3*a0-20))/2 -(5*x**4*(6*v1+6*v0-a1+a0-12))/2+v0+a0*x a3(x) = 6*x**2*(14*v1+16*v0-2*a1+3*a0-30)-3*x*(8*v1+12*v0-a1+3*a0-20) -10*x**3*(6*v1+6*v0-a1+a0-12)+a0 j3(x) = 12*x*(14*v1+16*v0-2*a1+3*a0-30)-3*(8*v1+12*v0-a1+3*a0-20) -30*x**2*(6*v1+6*v0-a1+a0-12) plot [0:1] p3(x) lw 2, v3(x), a3(x) plot [0:1][0:1] p1(x) lw 2, p2(x) lw 2, p3(x) lw 2 unset multiplot