num4diff 0.0.22 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/num4diff/CNum4Diff.c +81 -0
- data/ext/num4diff/CNum4Diff.h +25 -0
- data/ext/num4diff/Rakefile +5 -0
- data/lib/num4diff.rb +12 -11
- metadata +34 -11
- data/ext/num4diff/libnum4diff.so +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0d3136cc91be5e19847b49e534e7fb8292c8e8d6e2e6ea7b64c19a8e4f0f5e87
|
4
|
+
data.tar.gz: 5687b8ae545c9df2da7b39fa2ebe6ae6017276edd8d1e5be750c583d7809c5ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1707e0ebc7e844bc39c64baff378a57ed2cffe80ad7ff3b1ebe51b9d6a2095b31b6018996cb8179ce298b4d7c7c04da5b758dcb896279db8b6703e4c5a3e189e
|
7
|
+
data.tar.gz: b9a91f1ebeccff6370a47204ec5de6b2a3e2b42e08934e609f512b313aeff78e53658d5b511585bb87ac82d6ecaced36e463446b70fdbf36efa92122607b437a
|
@@ -0,0 +1,81 @@
|
|
1
|
+
#include <stdio.h>
|
2
|
+
#include <stdlib.h>
|
3
|
+
#include <assert.h>
|
4
|
+
#include "CNum4Diff.h"
|
5
|
+
|
6
|
+
static double CNum4Diff_doEulerMethod(double yi, double xi, double h, Func func);
|
7
|
+
static double CNum4Diff_doHeunMethod(double yi, double xi, double h, Func func);
|
8
|
+
static double CNum4Diff_doRungeKuttaMethod(double yi, double xi, double h, Func func);
|
9
|
+
static CNum4Diff _cNum4Diff = {
|
10
|
+
.FP_eulerMethod = CNum4Diff_doEulerMethod,
|
11
|
+
.FP_heunMethod = CNum4Diff_doHeunMethod,
|
12
|
+
.FP_rungeKuttaMethod = CNum4Diff_doRungeKuttaMethod,
|
13
|
+
};
|
14
|
+
/**************************************/
|
15
|
+
/* InterFface部 */
|
16
|
+
/**************************************/
|
17
|
+
/**************************************/
|
18
|
+
/* Class部 */
|
19
|
+
/**************************************/
|
20
|
+
double CNum4Diff_eulerMethod(double yi, double xi, double h, Func func)
|
21
|
+
{
|
22
|
+
assert(func != 0);
|
23
|
+
|
24
|
+
return _cNum4Diff.FP_eulerMethod(yi, xi, h, func);
|
25
|
+
}
|
26
|
+
double CNum4Diff_heunMethod(double yi, double xi, double h, Func func)
|
27
|
+
{
|
28
|
+
assert(func != 0);
|
29
|
+
|
30
|
+
return _cNum4Diff.FP_heunMethod(yi, xi, h, func);
|
31
|
+
}
|
32
|
+
double CNum4Diff_rungeKuttaMethod(double yi, double xi, double h, Func func)
|
33
|
+
{
|
34
|
+
assert(func != 0);
|
35
|
+
|
36
|
+
return _cNum4Diff.FP_rungeKuttaMethod(yi, xi, h, func);
|
37
|
+
}
|
38
|
+
/**************************************/
|
39
|
+
/* 処理実行部 */
|
40
|
+
/**************************************/
|
41
|
+
/*
|
42
|
+
* オイラー法
|
43
|
+
*/
|
44
|
+
static double CNum4Diff_doEulerMethod(double yi, double xi, double h, Func func)
|
45
|
+
{
|
46
|
+
double y = func(xi);
|
47
|
+
|
48
|
+
return yi + h * y;
|
49
|
+
}
|
50
|
+
/*
|
51
|
+
* ホイン法
|
52
|
+
*/
|
53
|
+
static double CNum4Diff_doHeunMethod(double yi, double xi, double h, Func func)
|
54
|
+
{
|
55
|
+
double y = func(xi);
|
56
|
+
double k1 = 0.0;
|
57
|
+
double k2 = 0.0;
|
58
|
+
|
59
|
+
k1 = h * y; // k1 = h * f(xi, y)
|
60
|
+
k2 = h * (yi + k1); // k2 = h * f(xi_h, h * f(xi + h, yi + k1)
|
61
|
+
return yi + (k1 + k2) / 2.0;
|
62
|
+
}
|
63
|
+
/*
|
64
|
+
* ルンゲクッタ法
|
65
|
+
*/
|
66
|
+
static double CNum4Diff_doRungeKuttaMethod(double yi, double xi, double h, Func func)
|
67
|
+
{
|
68
|
+
double y = 0.0;
|
69
|
+
double k1 = 0.0;
|
70
|
+
double k2 = 0.0;
|
71
|
+
double k3 = 0.0;
|
72
|
+
double k4 = 0.0;
|
73
|
+
|
74
|
+
y = func(xi);
|
75
|
+
k1 = h * y; // k1 = h * f(xi, y)
|
76
|
+
k2 = h * (yi + k1 / 2.0); // k2 = h * f(xi + h / 2, yi + k1 / 2)
|
77
|
+
k3 = h * (yi + k2 / 2.0); // k3 = h * f(xi + h / 2, y1 + k2 / 2)
|
78
|
+
k4 = h * (yi + k3); // k4 = h * f(xi + h, yi + k3)
|
79
|
+
return yi + (k1 + 2 * k2 + 2 * k3 + k4) / 6.0;
|
80
|
+
}
|
81
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#ifndef _CNum4Diff_H_
|
2
|
+
#define _CNum4Diff_H_
|
3
|
+
|
4
|
+
/**************************************/
|
5
|
+
/* 構造体宣言 */
|
6
|
+
/**************************************/
|
7
|
+
typedef struct _CNum4Diff CNum4Diff;
|
8
|
+
typedef double (*Func)(double x);
|
9
|
+
|
10
|
+
struct _CNum4Diff
|
11
|
+
{
|
12
|
+
double (*FP_eulerMethod)(double yi, double xi, double h, Func func);
|
13
|
+
double (*FP_heunMethod)(double yi, double xi, double h, Func func);
|
14
|
+
double (*FP_rungeKuttaMethod)(double yi, double xi, double h, Func func);
|
15
|
+
};
|
16
|
+
/**************************************/
|
17
|
+
/* define宣言 */
|
18
|
+
/**************************************/
|
19
|
+
/**************************************/
|
20
|
+
/* プロトタイプ宣言 */
|
21
|
+
/**************************************/
|
22
|
+
double CNum4Diff_eulerMethod(double yi, double xi, double h, Func func);
|
23
|
+
double CNum4Diff_heunMethod(double yi, double xi, double h, Func func);
|
24
|
+
double CNum4Diff_rungeKuttaMethod(double yi, double xi, double h, Func func);
|
25
|
+
#endif
|
data/lib/num4diff.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
require 'ffi'
|
2
|
+
require 'ffi-compiler/loader'
|
2
3
|
|
3
4
|
#
|
4
5
|
# 数値計算による常微分方程式の解法するライブラリ
|
5
6
|
#
|
6
7
|
module Num4DiffLib
|
7
8
|
extend FFI::Library
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
# y = f(xi)
|
9
|
+
|
10
|
+
ffi_lib FFI::Compiler::Loader.find('num4diff')
|
11
|
+
# dy = f(xi)
|
12
12
|
# @param [double] xi xiの値
|
13
|
-
# @return [double]
|
13
|
+
# @return [double] xiに対するyの値
|
14
14
|
callback :f, [:double], :double
|
15
15
|
|
16
16
|
#
|
@@ -19,8 +19,8 @@ module Num4DiffLib
|
|
19
19
|
# @param [double] yi xiに対するyiの値
|
20
20
|
# @param [double] xi xiの値
|
21
21
|
# @param [double] h 刻み幅
|
22
|
-
# @param [callback] func xi
|
23
|
-
# @return [double]
|
22
|
+
# @param [callback] func xiに対する傾きを計算する関数
|
23
|
+
# @return [double] xi+hに対するyiの値
|
24
24
|
#
|
25
25
|
attach_function :eulerMethod,
|
26
26
|
:CNum4Diff_eulerMethod, [:double, :double, :double, :f], :double
|
@@ -29,8 +29,8 @@ module Num4DiffLib
|
|
29
29
|
# @param [double] yi xiに対するyiの値
|
30
30
|
# @param [double] xi xiの値
|
31
31
|
# @param [double] h 刻み幅
|
32
|
-
# @param [callback] func xi
|
33
|
-
# @return [double]
|
32
|
+
# @param [callback] func xiに対する傾きを計算する関数
|
33
|
+
# @return [double] xi+hに対するyiの値
|
34
34
|
#
|
35
35
|
attach_function :heunMethod,
|
36
36
|
:CNum4Diff_heunMethod, [:double, :double, :double, :f], :double
|
@@ -40,8 +40,9 @@ module Num4DiffLib
|
|
40
40
|
# @param [double] yi xiに対するyiの値
|
41
41
|
# @param [double] xi xiの値
|
42
42
|
# @param [double] h 刻み幅
|
43
|
-
# @param [callback] func xi
|
44
|
-
# @return [double]
|
43
|
+
# @param [callback] func xiに対する傾きを計算する関数
|
44
|
+
# @return [double] xi+hに対するyiの値
|
45
|
+
#
|
45
46
|
attach_function :rungeKuttaMethod,
|
46
47
|
:CNum4Diff_rungeKuttaMethod, [:double, :double, :double, :f], :double
|
47
48
|
end
|
metadata
CHANGED
@@ -1,43 +1,66 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: num4diff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- siranovel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-04-
|
11
|
+
date: 2022-04-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: ffi
|
14
|
+
name: ffi-compiler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 1.15.0
|
20
17
|
- - "~>"
|
21
18
|
- !ruby/object:Gem::Version
|
22
|
-
version: '1.
|
19
|
+
version: '1.0'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.0.1
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.0'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.0.1
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rake
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '12.3'
|
27
40
|
- - ">="
|
28
41
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
42
|
+
version: 12.3.3
|
43
|
+
type: :development
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
30
47
|
- - "~>"
|
31
48
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
49
|
+
version: '12.3'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 12.3.3
|
33
53
|
description: numerical solution for ordinaray differential equations
|
34
54
|
email: siranovel@gmail.com
|
35
55
|
executables: []
|
36
|
-
extensions:
|
56
|
+
extensions:
|
57
|
+
- ext/num4diff/Rakefile
|
37
58
|
extra_rdoc_files: []
|
38
59
|
files:
|
39
60
|
- LICENSE
|
40
|
-
- ext/num4diff/
|
61
|
+
- ext/num4diff/CNum4Diff.c
|
62
|
+
- ext/num4diff/CNum4Diff.h
|
63
|
+
- ext/num4diff/Rakefile
|
41
64
|
- lib/num4diff.rb
|
42
65
|
homepage: http://github.com/siranovel/num4different
|
43
66
|
licenses:
|
data/ext/num4diff/libnum4diff.so
DELETED
Binary file
|