num4inte 0.0.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/ext/num4inte/CNum4Inte.c +120 -20
- data/ext/num4inte/CNum4Inte.h +32 -7
- data/ext/num4inte/Rakefile +1 -1
- data/lib/num4inte.rb +37 -13
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f3bd51f9372806b1b4251367e31852d5fa1ceab2a154b96481d8c193867e1ba
|
4
|
+
data.tar.gz: 0b40e2490195c0b39c71fd39d64c6c63f375ffc585376dc2727255d0297accc5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 983873e08341371a05526319aaede30562dac9c1a3ba29ea42538aedfdffd4c2f00300df688c745fb971bee89172ea22d56832fd343d44167ba751a9acb6d3f0
|
7
|
+
data.tar.gz: cf9f75b196b7c711084b63d0fad68ade85866073c609ca6c8cfe50b68d137c2dc8af43c4d4aca6b2db52ce331a172b2859644c958c2570277fbdf9bd1e021a1a
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,22 @@
|
|
2
2
|
|
3
3
|
## Unreleased
|
4
4
|
|
5
|
+
## [0.1.2] - 2023-05-24
|
6
|
+
|
7
|
+
### Added
|
8
|
+
- add function of gaussLegendreRule.
|
9
|
+
|
10
|
+
## [0.1.1] - 2023-04-27
|
11
|
+
|
12
|
+
### Added
|
13
|
+
- add function of simpsonRule.
|
14
|
+
- add assert(a < b);
|
15
|
+
|
16
|
+
### Fixed
|
17
|
+
- change from leftReimannSumMetod to leftReimannSumMethod.
|
18
|
+
- change from rigtReimannSumMetod to rigtReimannSumMethod.
|
19
|
+
- change from newtonMetod to trapezioidalRule.
|
20
|
+
|
5
21
|
## [0.0.1] - 2023-04-25
|
6
22
|
|
7
23
|
### Fixed
|
data/ext/num4inte/CNum4Inte.c
CHANGED
@@ -3,13 +3,50 @@
|
|
3
3
|
#include <assert.h>
|
4
4
|
#include "CNum4Inte.h"
|
5
5
|
|
6
|
-
static double
|
6
|
+
static double CNum4Inte_doLeftReimannSumMethod(double a, double b, double h, Func func);
|
7
7
|
static double CNum4Inte_doRigtReimannSumMetod(double a, double b, double h, Func func);
|
8
|
-
static double
|
8
|
+
static double CNum4Inte_doTrapezioidalRule(double a, double b, double h, Func func);
|
9
|
+
static double CNum4Inte_doSimpsonRule(double a, double b, double h, Func func);
|
10
|
+
static double CNum4Inte_doGaussLegendreRule(int n, double a, double b, double h, Func func);
|
9
11
|
static CNum4Inte _cNum4Inte = {
|
10
|
-
.
|
11
|
-
|
12
|
-
|
12
|
+
.reimann = {
|
13
|
+
.FP_leftReimannSumMethod = CNum4Inte_doLeftReimannSumMethod,
|
14
|
+
.FP_rigtReimannSumMethod = CNum4Inte_doRigtReimannSumMetod,
|
15
|
+
},
|
16
|
+
.newton = {
|
17
|
+
.FP_trapezioidalRule = CNum4Inte_doTrapezioidalRule,
|
18
|
+
.FP_simpsonRule = CNum4Inte_doSimpsonRule,
|
19
|
+
},
|
20
|
+
.gauss = {
|
21
|
+
.FP_gaussLegendreRule = CNum4Inte_doGaussLegendreRule,
|
22
|
+
},
|
23
|
+
};
|
24
|
+
// ガウス・テーブル
|
25
|
+
// n = 1
|
26
|
+
// xi = 0 wi = 2
|
27
|
+
// n = 2
|
28
|
+
// xi = ±1/sqrt(3)=0.577350 wi = 1
|
29
|
+
// n = 3
|
30
|
+
// xi = 0 wi = 8/9
|
31
|
+
// xi = ±sqrt(3/5)=0.774597 wi = 5/9
|
32
|
+
// n = 4
|
33
|
+
// xi = ±sqrt(3/7-2/7sqrt(6/5))=0.339981 wi = (18+sqrt(30))/36=0.652145
|
34
|
+
// xi = ±sqrt(3/7+2/7sqrt(6/5))=0.861136 wi = (18-sqrt(30))/36=0.347855
|
35
|
+
// n = 5
|
36
|
+
// xi = 0 wi = 128/225
|
37
|
+
// xi = 1/3*sqrt(5-2sqrt(10/7))=0.538469 wi = (322+13sqrt(70))/900:0.478629
|
38
|
+
// xi = 1/3*sqrt(5+2sqrt(10/7))=0.906180 wi = (322-13sqrt(70))/900:0.236927
|
39
|
+
static GaussTbl gaussTbl[] = {
|
40
|
+
[0] = {.xi = {[0] = 0.0},
|
41
|
+
.wi = {[0] = 2.0}},
|
42
|
+
[1] = {.xi = {[0] = -0.577350, [1] = 0.577350},
|
43
|
+
.wi = {[0] = 1.0, [1] = 1.0}},
|
44
|
+
[2] = {.xi = {[0] = 0.0, [1] = -0.774597, [2] = 0.774597},
|
45
|
+
.wi = {[0] = 0.888889, [1] = 0.555556, [2] = 0.555556}},
|
46
|
+
[3] = {.xi = {[0] = -0.339981, [1] = 0.339981, [2] = -0.861136, [3] = 0.861136},
|
47
|
+
.wi = {[0] = 0.652145, [1] = 0.652145, [2] = 0.347855, [3] = 0.347855}},
|
48
|
+
[4] = {.xi = {[0] = 0.0, [1] = -0.538469, [2] = 0.538469, [3] = -0.906180, [4] = 0.906180},
|
49
|
+
.wi = {[0] = 0.568889, [1] = 0.478629, [2] = 0.478629, [3] = 0.236927, [4] = 0.236927}},
|
13
50
|
};
|
14
51
|
/**************************************/
|
15
52
|
/* InterFface部 */
|
@@ -17,23 +54,41 @@ static CNum4Inte _cNum4Inte = {
|
|
17
54
|
/**************************************/
|
18
55
|
/* Class部 */
|
19
56
|
/**************************************/
|
20
|
-
double
|
57
|
+
double CNum4Inte_reimann_leftReimannSumMethod(double a, double b, double h, Func func)
|
58
|
+
{
|
59
|
+
assert(func != 0);
|
60
|
+
assert(a < b);
|
61
|
+
|
62
|
+
return _cNum4Inte.reimann.FP_leftReimannSumMethod(a, b, h, func);
|
63
|
+
}
|
64
|
+
double CNum4Inte_reimann_rigtReimannSumMethod(double a, double b, double h, Func func)
|
65
|
+
{
|
66
|
+
assert(func != 0);
|
67
|
+
assert(a < b);
|
68
|
+
|
69
|
+
return _cNum4Inte.reimann.FP_rigtReimannSumMethod(a, b, h, func);
|
70
|
+
}
|
71
|
+
double CNum4Inte_rewton_trapezioidalRule(double a, double b, double h, Func func)
|
21
72
|
{
|
22
73
|
assert(func != 0);
|
74
|
+
assert(a < b);
|
23
75
|
|
24
|
-
return _cNum4Inte.
|
76
|
+
return _cNum4Inte.newton.FP_trapezioidalRule(a, b, h, func);
|
25
77
|
}
|
26
|
-
double
|
78
|
+
double CNum4Inte_rewton_simpsonRule(double a, double b, double h, Func func)
|
27
79
|
{
|
28
80
|
assert(func != 0);
|
81
|
+
assert(a < b);
|
29
82
|
|
30
|
-
return _cNum4Inte.
|
83
|
+
return _cNum4Inte.newton.FP_simpsonRule(a, b, h, func);
|
31
84
|
}
|
32
|
-
double
|
85
|
+
double CNum4Inte_gauss_gaussLegendreRule(int n, double a, double b, double h, Func func)
|
33
86
|
{
|
34
87
|
assert(func != 0);
|
88
|
+
assert(a < b);
|
89
|
+
assert((1 <= n) && (n <= 5));
|
35
90
|
|
36
|
-
return _cNum4Inte.
|
91
|
+
return _cNum4Inte.gauss.FP_gaussLegendreRule(n, a, b, h, func);
|
37
92
|
}
|
38
93
|
/**************************************/
|
39
94
|
/* 処理実行部 */
|
@@ -41,10 +96,10 @@ double CNum4Inte_newtonMethod(double a, double b, double h, Func func)
|
|
41
96
|
/*
|
42
97
|
* 左リーマン和法
|
43
98
|
*/
|
44
|
-
static double
|
99
|
+
static double CNum4Inte_doLeftReimannSumMethod(double a, double b, double h, Func func)
|
45
100
|
{
|
46
101
|
double rimann = 0.0;
|
47
|
-
double x
|
102
|
+
double x;
|
48
103
|
|
49
104
|
for (x = a; x < b; x += h) {
|
50
105
|
rimann += func(x);
|
@@ -57,7 +112,7 @@ static double CNum4Inte_doLeftReimannSumMetod(double a, double b, double h, Func
|
|
57
112
|
static double CNum4Inte_doRigtReimannSumMetod(double a, double b, double h, Func func)
|
58
113
|
{
|
59
114
|
double rimann = 0.0;
|
60
|
-
double x
|
115
|
+
double x;
|
61
116
|
|
62
117
|
for (x = a; x < b; x += h) {
|
63
118
|
rimann += func(x + h);
|
@@ -65,21 +120,66 @@ static double CNum4Inte_doRigtReimannSumMetod(double a, double b, double h, Func
|
|
65
120
|
return rimann * h;
|
66
121
|
}
|
67
122
|
/*
|
68
|
-
*
|
123
|
+
* 台形公式
|
69
124
|
*/
|
70
|
-
static double
|
125
|
+
static double CNum4Inte_doTrapezioidalRule(double a, double b, double h, Func func)
|
71
126
|
{
|
72
|
-
double
|
73
|
-
double x = 0.0;
|
127
|
+
double trapezoidal = 0.0;
|
74
128
|
double fx = func(a);
|
75
129
|
double fxh = 0.0;
|
130
|
+
double x;
|
76
131
|
|
77
132
|
for (x = a; x < b; x += h) {
|
78
133
|
fxh = func(x + h);
|
79
|
-
|
134
|
+
trapezoidal += (fx + fxh);
|
80
135
|
fx = fxh;
|
81
136
|
}
|
82
|
-
return
|
137
|
+
return trapezoidal * h / 2.0;
|
138
|
+
}
|
139
|
+
/*
|
140
|
+
* シンプソンの公式
|
141
|
+
*/
|
142
|
+
static double CNum4Inte_doSimpsonRule(double a, double b, double h, Func func)
|
143
|
+
{
|
144
|
+
double simpson = 0.0;
|
145
|
+
double fx = func(a);
|
146
|
+
double fxh = 0.0;
|
147
|
+
double h2 = h / 2.0;
|
148
|
+
double x;
|
149
|
+
|
150
|
+
for (x = a; x < b; x += h) {
|
151
|
+
double fxh2 = func(x + h2);
|
152
|
+
double fxh = func(x + h);
|
153
|
+
|
154
|
+
simpson += (fx + fxh + 4 * fxh2);
|
155
|
+
fx = fxh2;
|
156
|
+
}
|
157
|
+
return simpson * h / 6.0;
|
158
|
+
|
159
|
+
}
|
160
|
+
/*
|
161
|
+
* ガウス・ルジャンドルの公式
|
162
|
+
*/
|
163
|
+
static double CNum4Inte_doGaussLegendreRule(int n, double a, double b, double h, Func func)
|
164
|
+
{
|
165
|
+
double x;
|
166
|
+
double gauss = 0.0;
|
167
|
+
GaussTbl *pt = &gaussTbl[n - 1];
|
168
|
+
|
169
|
+
for (x = a; x < b; x += h) {
|
170
|
+
int i;
|
171
|
+
double xa = x;
|
172
|
+
double xb = x + h;
|
173
|
+
double bMa = (xb - xa) / 2.0;
|
174
|
+
double aPb = (xa + xb) / 2.0;
|
175
|
+
double wifi = 0.0;
|
176
|
+
|
177
|
+
for (i = 0; i < n; i++) {
|
178
|
+
wifi += pt->wi[i] * func(bMa * pt->xi[i] + aPb);
|
179
|
+
}
|
180
|
+
gauss += bMa * wifi;
|
181
|
+
}
|
182
|
+
return gauss;
|
83
183
|
}
|
84
184
|
|
85
185
|
|
data/ext/num4inte/CNum4Inte.h
CHANGED
@@ -5,21 +5,46 @@
|
|
5
5
|
/* 構造体宣言 */
|
6
6
|
/**************************************/
|
7
7
|
typedef struct _CNum4Inte CNum4Inte;
|
8
|
+
typedef struct _CReimann CReimann;
|
9
|
+
typedef struct _CNewton CNewton;
|
10
|
+
typedef struct _CGauss CGauss;
|
8
11
|
typedef double (*Func)(double x);
|
12
|
+
typedef struct _GaussTbl GaussTbl;
|
9
13
|
|
14
|
+
struct _CReimann
|
15
|
+
{
|
16
|
+
double (*FP_leftReimannSumMethod)(double a, double b, double h, Func func);
|
17
|
+
double (*FP_rigtReimannSumMethod)(double a, double b, double h, Func func);
|
18
|
+
};
|
19
|
+
struct _CNewton
|
20
|
+
{
|
21
|
+
double (*FP_trapezioidalRule)(double a, double b, double h, Func func);
|
22
|
+
double (*FP_simpsonRule)(double a, double b, double h, Func func);
|
23
|
+
};
|
24
|
+
struct _CGauss
|
25
|
+
{
|
26
|
+
double (*FP_gaussLegendreRule)(int n, double a, double b, double h, Func func);
|
27
|
+
};
|
10
28
|
struct _CNum4Inte
|
11
29
|
{
|
12
|
-
|
13
|
-
|
14
|
-
|
30
|
+
CReimann reimann;
|
31
|
+
CNewton newton;
|
32
|
+
CGauss gauss;
|
33
|
+
};
|
34
|
+
struct _GaussTbl
|
35
|
+
{
|
36
|
+
double xi[5];
|
37
|
+
double wi[5];
|
15
38
|
};
|
16
39
|
/**************************************/
|
17
40
|
/* define宣言 */
|
18
41
|
/**************************************/
|
19
42
|
/**************************************/
|
20
|
-
/* プロトタイプ宣言
|
43
|
+
/* プロトタイプ宣言 */
|
21
44
|
/**************************************/
|
22
|
-
double
|
23
|
-
double
|
24
|
-
double
|
45
|
+
double CNum4Inte_reimann_leftReimannSumMethod(double a, double b, double h, Func func);
|
46
|
+
double CNum4Inte_reimann_rigtReimannSumMethod(double a, double b, double h, Func func);
|
47
|
+
double CNum4Inte_rewton_trapezioidalRule(double a, double b, double h, Func func);
|
48
|
+
double CNum4Inte_rewton_simpsonRule(double a, double b, double h, Func func);
|
49
|
+
double CNum4Inte_gauss_gaussLegendreRule(int n, double a, double b, double h, Func func);
|
25
50
|
#endif
|
data/ext/num4inte/Rakefile
CHANGED
data/lib/num4inte.rb
CHANGED
@@ -17,39 +17,63 @@ module Num4InteLib
|
|
17
17
|
|
18
18
|
#
|
19
19
|
# 左リーマン和法
|
20
|
-
# @overload
|
21
|
-
# y =
|
20
|
+
# @overload leftReimannSumMethod(a, b, h, func)
|
21
|
+
# y = leftReimannSumMethod(a, b, h, func)
|
22
22
|
# @param [double] a aの値
|
23
23
|
# @param [double] b bの値
|
24
24
|
# @param [double] h 刻み幅
|
25
25
|
# @param [callback] func xiに対する傾きを計算する関数
|
26
26
|
# @return [double] [a,b]の間の積分値
|
27
27
|
#
|
28
|
-
attach_function :
|
29
|
-
:
|
28
|
+
attach_function :leftReimannSumMethod,
|
29
|
+
:CNum4Inte_reimann_leftReimannSumMethod, [:double, :double, :double, :f], :double
|
30
30
|
#
|
31
31
|
# 右リーマン和法
|
32
|
-
# @overload
|
33
|
-
# y =
|
32
|
+
# @overload rigtReimannSumMethod(a, b, h, func)
|
33
|
+
# y = rigtReimannSumMethod(a, b, h, func)
|
34
34
|
# @param [double] a aの値
|
35
35
|
# @param [double] b bの値
|
36
36
|
# @param [double] h 刻み幅
|
37
37
|
# @param [callback] func xiに対する傾きを計算する関数
|
38
38
|
# @return [double] [a,b]の間の積分値
|
39
39
|
#
|
40
|
-
attach_function :
|
41
|
-
:
|
40
|
+
attach_function :rigtReimannSumMethod,
|
41
|
+
:CNum4Inte_reimann_rigtReimannSumMethod, [:double, :double, :double, :f], :double
|
42
42
|
#
|
43
|
-
#
|
44
|
-
# @overload
|
45
|
-
# y =
|
43
|
+
# ニュートン・コーツ法(1次:台形公式)
|
44
|
+
# @overload trapezioidalRule(a, b, h, func)
|
45
|
+
# y = trapezioidalRule(a, b, h, func)
|
46
46
|
# @param [double] a aの値
|
47
47
|
# @param [double] b bの値
|
48
48
|
# @param [double] h 刻み幅
|
49
49
|
# @param [callback] func xiに対する傾きを計算する関数
|
50
50
|
# @return [double] [a,b]の間の積分値
|
51
51
|
#
|
52
|
-
attach_function :
|
53
|
-
:
|
52
|
+
attach_function :trapezioidalRule,
|
53
|
+
:CNum4Inte_rewton_trapezioidalRule, [:double, :double, :double, :f], :double
|
54
|
+
#
|
55
|
+
# ニュートン・コーツ法(2次:シンプソンの公式)
|
56
|
+
# @overload simpsonRule(a, b, h, func)
|
57
|
+
# y = simpsonRule(a, b, h, func)
|
58
|
+
# @param [double] a aの値
|
59
|
+
# @param [double] b bの値
|
60
|
+
# @param [double] h 刻み幅
|
61
|
+
# @param [callback] func xiに対する傾きを計算する関数
|
62
|
+
# @return [double] [a,b]の間の積分値
|
63
|
+
#
|
64
|
+
attach_function :simpsonRule,
|
65
|
+
:CNum4Inte_rewton_simpsonRule, [:double, :double, :double, :f], :double
|
66
|
+
#
|
67
|
+
# ガウス求積法
|
68
|
+
# @overload gaussLegendreRule(n, a, b, h, func)
|
69
|
+
# y = gaussLegendreRule(n, a, b, h, func)
|
70
|
+
# @param [int] n 分割数
|
71
|
+
# @param [double] a aの値
|
72
|
+
# @param [double] b bの値
|
73
|
+
# @param [double] h 刻み幅
|
74
|
+
# @param [callback] func xiに対する傾きを計算する関数
|
75
|
+
# @return [double] [a,b]の間の積分値
|
76
|
+
attach_function :gaussLegendreRule,
|
77
|
+
:CNum4Inte_gauss_gaussLegendreRule, [:int, :double, :double, :double, :f], :double
|
54
78
|
end
|
55
79
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: num4inte
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- siranovel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-05-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi-compiler
|
@@ -69,8 +69,9 @@ licenses:
|
|
69
69
|
- MIT
|
70
70
|
metadata:
|
71
71
|
changelog_uri: http://github.com/siranovel/num4integral/blob/main/CHANGELOG.md
|
72
|
-
documentation_uri: https://rubydoc.info/gems/num4inte/0.
|
72
|
+
documentation_uri: https://rubydoc.info/gems/num4inte/0.1.2
|
73
73
|
homepage_uri: http://github.com/siranovel/num4integral
|
74
|
+
wiki_uri: https://github.com/siranovel/mydocs/tree/main/num4integral
|
74
75
|
post_install_message:
|
75
76
|
rdoc_options: []
|
76
77
|
require_paths:
|