File tree 10 files changed +109
-1
lines changed
src/Numerics/Interpolation
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)
334
334
/// <returns>Interpolated second derivative at point t.</returns>
335
335
double IInterpolation . Differentiate2 ( double t ) => throw new NotSupportedException ( ) ;
336
336
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
+
337
344
/// <summary>
338
345
/// Indefinite integral at point t. NOT SUPPORTED.
339
346
/// </summary>
Original file line number Diff line number Diff line change @@ -182,6 +182,13 @@ public double Interpolate(double t)
182
182
/// <returns>Interpolated second derivative at point t.</returns>
183
183
double IInterpolation . Differentiate2 ( double t ) => throw new NotSupportedException ( ) ;
184
184
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
+
185
192
/// <summary>
186
193
/// Indefinite integral at point t. NOT SUPPORTED.
187
194
/// </summary>
Original file line number Diff line number Diff line change @@ -576,7 +576,18 @@ public double Differentiate2(double t)
576
576
{
577
577
int k = LeftSegmentIndex ( t ) ;
578
578
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 ] ;
580
591
}
581
592
582
593
/// <summary>
Original file line number Diff line number Diff line change @@ -65,6 +65,13 @@ public interface IInterpolation
65
65
/// <returns>Interpolated second derivative at point t.</returns>
66
66
double Differentiate2 ( double t ) ;
67
67
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
+
68
75
/// <summary>
69
76
/// Indefinite integral at point t.
70
77
/// </summary>
Original file line number Diff line number Diff line change @@ -152,6 +152,13 @@ public double Differentiate(double t)
152
152
/// <returns>Interpolated second derivative at point t.</returns>
153
153
public double Differentiate2 ( double t ) => 0d ;
154
154
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
+
155
162
/// <summary>
156
163
/// Indefinite integral at point t.
157
164
/// </summary>
Original file line number Diff line number Diff line change @@ -152,6 +152,24 @@ public double Differentiate2(double t)
152
152
return secondDerivative ;
153
153
}
154
154
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
+
155
173
/// <summary>
156
174
/// Indefinite integral at point t.
157
175
/// </summary>
Original file line number Diff line number Diff line change @@ -197,6 +197,36 @@ public double Differentiate2(double t)
197
197
return ddx [ 0 ] ;
198
198
}
199
199
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
+
200
230
/// <summary>
201
231
/// Indefinite integral at point t. NOT SUPPORTED.
202
232
/// </summary>
Original file line number Diff line number Diff line change @@ -110,6 +110,13 @@ public double Differentiate2(double t)
110
110
return 2 * _c2 [ k ] ;
111
111
}
112
112
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
+
113
120
/// <summary>
114
121
/// Indefinite integral at point t.
115
122
/// </summary>
Original file line number Diff line number Diff line change @@ -139,6 +139,13 @@ public double Differentiate(double t)
139
139
/// <returns>Interpolated second derivative at point t.</returns>
140
140
public double Differentiate2 ( double t ) => Differentiate ( t ) ;
141
141
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
+
142
149
/// <summary>
143
150
/// Indefinite integral at point t.
144
151
/// </summary>
Original file line number Diff line number Diff line change @@ -146,6 +146,13 @@ public static TransformedInterpolation Interpolate(
146
146
/// <returns>Interpolated second derivative at point t.</returns>
147
147
double IInterpolation . Differentiate2 ( double t ) => throw new NotSupportedException ( ) ;
148
148
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
+
149
156
/// <summary>
150
157
/// Indefinite integral at point t. NOT SUPPORTED.
151
158
/// </summary>
You can’t perform that action at this time.
0 commit comments