Skip to content

Commit 74febe3

Browse files
committed
Added Differentiate3 to Interpolation
1 parent f196418 commit 74febe3

7 files changed

+88
-1
lines changed

src/Numerics/Interpolation/CubicSpline.cs

+12-1
Original file line numberDiff line numberDiff 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>

src/Numerics/Interpolation/IInterpolation.cs

+7
Original file line numberDiff line numberDiff 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>

src/Numerics/Interpolation/LinearSpline.cs

+7
Original file line numberDiff line numberDiff 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>

src/Numerics/Interpolation/LogLinear.cs

+18
Original file line numberDiff line numberDiff 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>

src/Numerics/Interpolation/NevillePolynomialInterpolation.cs

+30
Original file line numberDiff line numberDiff 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>

src/Numerics/Interpolation/QuadraticSpline.cs

+7
Original file line numberDiff line numberDiff 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>

src/Numerics/Interpolation/StepInterpolation.cs

+7
Original file line numberDiff line numberDiff 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>

0 commit comments

Comments
 (0)