|
2 | 2 |
|
3 | 3 | available functions: |
4 | 4 | - ord1_acc2: order=1, accuracy=2 |
| 5 | + - ord1_acc4: order=1, accuracy=4 |
5 | 6 | - ord2_acc2: order=2, accuracy=2 |
| 7 | + - ord2_acc4: order=2, accuracy=4 |
6 | 8 | """ |
7 | 9 |
|
8 | 10 | from hypersolver.util import xnp as np |
@@ -79,3 +81,39 @@ def ord2_acc2(_func, _xvar): |
79 | 81 | ) |
80 | 82 |
|
81 | 83 | return np.concatenate((_derivative0, _derivative, _derivative1)) |
| 84 | + |
| 85 | + |
| 86 | +@jit(nopython=True) |
| 87 | +def ord2_acc4(_func, _xvar): |
| 88 | + """ central differencing: order=2, accuracy=4 """ |
| 89 | + |
| 90 | + _func, _xvar = np.asarray(_func), np.asarray(_xvar) |
| 91 | + |
| 92 | + _result10 = ( |
| 93 | + _func[:-2] - 2.0*_func[1:-1] + _func[2:] |
| 94 | + )/((_xvar[2:] - _xvar[:-2])/2.0)**2 |
| 95 | + |
| 96 | + _result20 = ( |
| 97 | + (4/3)*_func[:-2] - (5/2)*_func[1:-1] + (4/3)*_func[2:] |
| 98 | + )/((_xvar[2:] - _xvar[:-2])/2.0)**2 |
| 99 | + |
| 100 | + _result2 = np.concatenate(( |
| 101 | + np.array([_result10[0]]), |
| 102 | + ( |
| 103 | + -(1/12)*_func[:-4] - (1/12)*_func[4:] |
| 104 | + )/((_xvar[4:] - _xvar[:-4])/4.0)**2 + _result20[1:-1], |
| 105 | + np.array([_result10[-1]]), |
| 106 | + )) |
| 107 | + |
| 108 | + _derivative = _result2 |
| 109 | + |
| 110 | + _derivative0 = np.asarray( |
| 111 | + [(_func[2] - 2.0*_func[1] + _func[0])/(_xvar[1] - _xvar[0])**2] |
| 112 | + ) |
| 113 | + _derivative1 = np.asarray( |
| 114 | + [(_func[-1] - 2.0*_func[-2] + _func[-3])/(_xvar[-1] - _xvar[-2])**2] |
| 115 | + ) |
| 116 | + |
| 117 | + return np.concatenate( |
| 118 | + (_derivative0, _derivative, _derivative1) |
| 119 | + ) |
0 commit comments