-
Notifications
You must be signed in to change notification settings - Fork 17
/
qnuma.c
106 lines (94 loc) · 2.86 KB
/
qnuma.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*!
* @file qnuma.c
* @author J. Camilo Gomez C.
* @note This file is part of the qLibs distribution.
**/
#include "qnuma.h"
/*cppcheck-suppress misra-c2012-20.7 */
#define qNumA_Update( x ) (x)->x[ 2 ] = (x)->x[ 1 ]; \
(x)->x[ 1 ] = s \
/*============================================================================*/
void qNumA_StateInit( qNumA_state_t *x,
const float x0,
const float sn_1,
const float sn_2 )
{
x->x[ 0 ] = x0;
x->x[ 1 ] = sn_1;
x->x[ 2 ] = sn_2;
}
/*============================================================================*/
float qNumA_IntegralRe( qNumA_state_t *x,
const float s,
const float dt,
const bool bUpdate )
{
x->x[ 0 ] += s*dt;
if ( bUpdate ) {
qNumA_Update( x );
}
return x->x[ 0 ];
}
/*============================================================================*/
float qNumA_IntegralTr( qNumA_state_t *x,
const float s,
const float dt,
const bool bUpdate )
{
x->x[ 0 ] += 0.5F*( s + x->x[ 1 ] )*dt;
if ( bUpdate ) {
qNumA_Update( x );
}
return x->x[ 0 ];
}
/*============================================================================*/
float qNumA_IntegralSi( qNumA_state_t *x,
const float s,
const float dt,
const bool bUpdate )
{
x->x[ 0 ] += ( 1.0F/6.0F )*( s + ( 4.0F*x->x[ 1 ] ) + x->x[ 2 ] )*dt;
if ( bUpdate ) {
qNumA_Update( x );
}
return x->x[ 0 ];
}
/*============================================================================*/
float qNumA_Derivative2p( qNumA_state_t *x,
const float s,
const float dt,
const bool bUpdate )
{
float ds;
ds = ( s - x->x[ 1 ] )/dt;
if ( bUpdate ) {
qNumA_Update( x );
}
return ds;
}
/*============================================================================*/
float qNumA_DerivativeBa( qNumA_state_t *x,
const float s,
const float dt,
const bool bUpdate )
{
float ds;
ds = ( ( 3.0F*s ) - ( 4.0F*x->x[ 1 ] ) + x->x[ 2 ] )/( 2.0F*dt );
if ( bUpdate ) {
qNumA_Update( x );
}
return ds;
}
/*============================================================================*/
float qNumA_DerivativeFo( qNumA_state_t *x,
const float s,
const float dt,
const bool bUpdate )
{
float ds;
ds = ( ( 4.0F*x->x[ 1 ] ) - ( 3.0F*x->x[ 2 ] ) - s )/( 2.0F*dt );
if ( bUpdate ) {
qNumA_Update( x );
}
return ds;
}