$f'(x_{0}) = \displaystyle \lim _{h\to 0}\frac{f(x_{0}+h) - f(x_{0})}{h}$
Wartość drugiej otrzymamy poprzez podstawienie do podanego wzoru wartości pierwszej pochodnej.
Możemy wyróżnić trzy metody doboru przedziału. Centralnie wokół punktu x, na prawo od punktu x i na lewo od punktu x:
$\delta_h[f](x) = f(x+\tfrac12h)-f(x-\tfrac12h)$
$\nabla_h[f](x) = f(x) - f(x-h)$
$\delta_h[f](x) = f(x+\tfrac12h)-f(x-\tfrac12h)$
Ja skorzystałem z metody pierwszej. Kod na pierwszą i drugą pochodną jest następujący:
public class CentralDifferenceMethod { private double m_h; private Func<double, double> m_func; public CentralDifferenceMethod() : base() { } public CentralDifferenceMethod(Func<double, double> a_func, double a_h = Constants.DOUBLE_PRECISION * 2) { m_h = a_h; m_func = a_func; } public double Derive1(double a_x) { return (m_func(a_x + m_h) - m_func(a_x - m_h)) / (2 * m_h); } public double Derive2(double a_x) { return (m_func(a_x + m_h) - 2 * m_func(a_x) + m_func(a_x - m_h)) / (m_h * m_h); } public static Func<double, double> Derive1( Func<double, double> a_func, double a_h) { CentralDifferenceMethod cdm = new CentralDifferenceMethod(a_func, a_h); return (x) => { return cdm.Derive1(x); }; } public static Func<double, double> Derive2( Func<double, double> a_func, double a_h) { CentralDifferenceMethod cdm = new CentralDifferenceMethod(a_func, a_h); return (x) => { return cdm.Derive2(x); }; } public static Func<double, double> Derive2( Func<double, double> a_func, Func<double, double> a_d1, double a_h) { CentralDifferenceMethod cdm = new CentralDifferenceMethod(a_d1, a_h); return (x) => { return cdm.Derive1(x); }; } }
Zauważmy, że pierwsza pochodna wymaga dwóch punktów, druga trzech, itd.
Brak komentarzy:
Prześlij komentarz