File tree Expand file tree Collapse file tree 10 files changed +109
-1
lines changed
src/Numerics/Interpolation Expand file tree Collapse file tree 10 files changed +109
-1
lines changed Original file line number Diff line number Diff line change @@ -334,6 +334,13 @@ public double Interpolate(double t)
334334 /// <returns>Interpolated second derivative at point t.</returns>
335335 double IInterpolation . Differentiate2 ( double t ) => throw new NotSupportedException ( ) ;
336336
337+ /// <summary>
338+ /// Differentiate three times at point t. NOT SUPPORTED.
339+ /// </summary>
340+ /// <param name="t">Point t to interpolate at.</param>
341+ /// <returns>Interpolated third derivative at point t.</returns>
342+ double IInterpolation . Differentiate3 ( double t ) => throw new NotSupportedException ( ) ;
343+
337344 /// <summary>
338345 /// Indefinite integral at point t. NOT SUPPORTED.
339346 /// </summary>
Original file line number Diff line number Diff line change @@ -182,6 +182,13 @@ public double Interpolate(double t)
182182 /// <returns>Interpolated second derivative at point t.</returns>
183183 double IInterpolation . Differentiate2 ( double t ) => throw new NotSupportedException ( ) ;
184184
185+ /// <summary>
186+ /// Differentiate three times at point t. NOT SUPPORTED.
187+ /// </summary>
188+ /// <param name="t">Point t to interpolate at.</param>
189+ /// <returns>Interpolated third derivative at point t.</returns>
190+ double IInterpolation . Differentiate3 ( double t ) => throw new NotSupportedException ( ) ;
191+
185192 /// <summary>
186193 /// Indefinite integral at point t. NOT SUPPORTED.
187194 /// </summary>
Original file line number Diff line number Diff line change @@ -576,7 +576,18 @@ public double Differentiate2(double t)
576576 {
577577 int k = LeftSegmentIndex ( t ) ;
578578 var x = t - _x [ k ] ;
579- return 2 * _c2 [ k ] + x * 6 * _c3 [ k ] ;
579+ return 2 * _c2 [ k ] + x * 6 * _c3 [ k ] ;
580+ }
581+
582+ /// <summary>
583+ /// Differentiate three times at point t.
584+ /// </summary>
585+ /// <param name="t">Point t to interpolate at.</param>
586+ /// <returns>Interpolated third derivative at point t.</returns>
587+ public double Differentiate3 ( double t )
588+ {
589+ int k = LeftSegmentIndex ( t ) ;
590+ return 6 * _c3 [ k ] ;
580591 }
581592
582593 /// <summary>
Original file line number Diff line number Diff line change @@ -65,6 +65,13 @@ public interface IInterpolation
6565 /// <returns>Interpolated second derivative at point t.</returns>
6666 double Differentiate2 ( double t ) ;
6767
68+ /// <summary>
69+ /// Differentiate three times at point t.
70+ /// </summary>
71+ /// <param name="t">Point t to interpolate at.</param>
72+ /// <returns>Interpolated third derivative at point t.</returns>
73+ double Differentiate3 ( double t ) ;
74+
6875 /// <summary>
6976 /// Indefinite integral at point t.
7077 /// </summary>
Original file line number Diff line number Diff line change @@ -152,6 +152,13 @@ public double Differentiate(double t)
152152 /// <returns>Interpolated second derivative at point t.</returns>
153153 public double Differentiate2 ( double t ) => 0d ;
154154
155+ /// <summary>
156+ /// Differentiate three times at point t.
157+ /// </summary>
158+ /// <param name="t">Point t to interpolate at.</param>
159+ /// <returns>Interpolated third derivative at point t.</returns>
160+ public double Differentiate3 ( double t ) => 0d ;
161+
155162 /// <summary>
156163 /// Indefinite integral at point t.
157164 /// </summary>
Original file line number Diff line number Diff line change @@ -152,6 +152,24 @@ public double Differentiate2(double t)
152152 return secondDerivative ;
153153 }
154154
155+ /// <summary>
156+ /// Differentiate three times at point t.
157+ /// </summary>
158+ /// <param name="t">Point t to interpolate at.</param>
159+ /// <returns>Interpolated third derivative at point t.</returns>
160+ public double Differentiate3 ( double t )
161+ {
162+ var linearFirstDerivative = _spline . Differentiate ( t ) ;
163+ var linearSecondDerivative = _spline . Differentiate2 ( t ) ;
164+ var linearThirdDerivative = _spline . Differentiate3 ( t ) ;
165+
166+ var thirdDerivative = Differentiate2 ( t ) * linearFirstDerivative +
167+ 2 * Differentiate ( t ) * linearSecondDerivative +
168+ Interpolate ( t ) * linearThirdDerivative ;
169+
170+ return thirdDerivative ;
171+ }
172+
155173 /// <summary>
156174 /// Indefinite integral at point t.
157175 /// </summary>
Original file line number Diff line number Diff line change @@ -197,6 +197,36 @@ public double Differentiate2(double t)
197197 return ddx [ 0 ] ;
198198 }
199199
200+ /// <summary>
201+ /// Differentiate three times at point t.
202+ /// </summary>
203+ /// <param name="t">Point t to interpolate at.</param>
204+ /// <returns>Interpolated third derivative at point t.</returns>
205+ public double Differentiate3 ( double t )
206+ {
207+ var x = new double [ _y . Length ] ;
208+ var dx = new double [ _y . Length ] ;
209+ var ddx = new double [ _y . Length ] ;
210+ var dddx = new double [ _y . Length ] ;
211+ _y . CopyTo ( x , 0 ) ;
212+
213+ for ( int level = 1 ; level < x . Length ; level ++ )
214+ {
215+ for ( int i = 0 ; i < x . Length - level ; i ++ )
216+ {
217+ double hp = t - _x [ i + level ] ;
218+ double ho = _x [ i ] - t ;
219+ double den = _x [ i ] - _x [ i + level ] ;
220+ dddx [ i ] = ( ( hp * dddx [ i ] ) + ( 3 * ddx [ i ] ) + ( ho * dddx [ i + 1 ] ) - ( 3 * ddx [ i + 1 ] ) ) / den ;
221+ ddx [ i ] = ( ( hp * ddx [ i ] ) + ( 2 * dx [ i ] ) + ( ho * ddx [ i + 1 ] ) - ( 2 * dx [ i + 1 ] ) ) / den ;
222+ dx [ i ] = ( ( hp * dx [ i ] ) + x [ i ] + ( ho * dx [ i + 1 ] ) - x [ i + 1 ] ) / den ;
223+ x [ i ] = ( ( hp * x [ i ] ) + ( ho * x [ i + 1 ] ) ) / den ;
224+ }
225+ }
226+
227+ return dddx [ 0 ] ;
228+ }
229+
200230 /// <summary>
201231 /// Indefinite integral at point t. NOT SUPPORTED.
202232 /// </summary>
Original file line number Diff line number Diff line change @@ -110,6 +110,13 @@ public double Differentiate2(double t)
110110 return 2 * _c2 [ k ] ;
111111 }
112112
113+ /// <summary>
114+ /// Differentiate three times at point t.
115+ /// </summary>
116+ /// <param name="t">Point t to interpolate at.</param>
117+ /// <returns>Interpolated third derivative at point t.</returns>
118+ public double Differentiate3 ( double t ) => 0d ;
119+
113120 /// <summary>
114121 /// Indefinite integral at point t.
115122 /// </summary>
Original file line number Diff line number Diff line change @@ -139,6 +139,13 @@ public double Differentiate(double t)
139139 /// <returns>Interpolated second derivative at point t.</returns>
140140 public double Differentiate2 ( double t ) => Differentiate ( t ) ;
141141
142+ /// <summary>
143+ /// Differentiate three times at point t.
144+ /// </summary>
145+ /// <param name="t">Point t to interpolate at.</param>
146+ /// <returns>Interpolated third derivative at point t.</returns>
147+ public double Differentiate3 ( double t ) => Differentiate2 ( t ) ;
148+
142149 /// <summary>
143150 /// Indefinite integral at point t.
144151 /// </summary>
Original file line number Diff line number Diff line change @@ -146,6 +146,13 @@ public static TransformedInterpolation Interpolate(
146146 /// <returns>Interpolated second derivative at point t.</returns>
147147 double IInterpolation . Differentiate2 ( double t ) => throw new NotSupportedException ( ) ;
148148
149+ /// <summary>
150+ /// Differentiate three times at point t. NOT SUPPORTED.
151+ /// </summary>
152+ /// <param name="t">Point t to interpolate at.</param>
153+ /// <returns>Interpolated third derivative at point t.</returns>
154+ double IInterpolation . Differentiate3 ( double t ) => throw new NotSupportedException ( ) ;
155+
149156 /// <summary>
150157 /// Indefinite integral at point t. NOT SUPPORTED.
151158 /// </summary>
You can’t perform that action at this time.
0 commit comments