mathpack 0.4.5 → 0.4.6
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/lib/mathpack.rb +1 -0
- data/lib/mathpack/integral_equations.rb +59 -0
- data/lib/mathpack/version.rb +1 -1
- data/spec/integral_equations_spec.rb +27 -0
- data/spec/nonlinear_equations_spec.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1e848a2ca014612e04f7d621ff4667bc4dad2603
|
4
|
+
data.tar.gz: 85a146ea4bea8cb8720f4a7542c4582849f42f11
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7f5d93c396d007c6b634e3b68874eef3e64b29e7d3e8397de39f0325d3f24b303391d4f8155e3afd106340d2fd527372c586696d2fc4077b4357dbf38861e5b
|
7
|
+
data.tar.gz: 1f55b2454e8271adaa34f955cf161cd9e52807ba3090d0c5f925c53568de2a2eb04b5db01c4b8318d70b939794c4273bde6b31e914b0e7c6a1541da5a1068371
|
data/lib/mathpack.rb
CHANGED
@@ -0,0 +1,59 @@
|
|
1
|
+
module Mathpack
|
2
|
+
module IntegralEquations
|
3
|
+
def self.solve_fredholm_2(params = {})
|
4
|
+
step = (params[:to] - params[:from]) / 2.0
|
5
|
+
y_next = solve_freedholm_with_step(step, params)
|
6
|
+
loop do
|
7
|
+
y_prev = y_next
|
8
|
+
step /= 2.0
|
9
|
+
y_next = solve_freedholm_with_step(step, params)
|
10
|
+
break if Mathpack::IO.count_diff(y_next, y_prev) / (2**4 - 1) <= params[:eps]
|
11
|
+
end
|
12
|
+
{ x: Mathpack::Approximation.generate_nodes(from: params[:from], to: params[:to], step: step), f: y_next }
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.solve_freedholm_with_step(step, params = {})
|
16
|
+
nodes = Mathpack::Approximation.generate_nodes(from: params[:from], to: params[:to], step: step)
|
17
|
+
a = Array.new(nodes.length) do |i|
|
18
|
+
i % 2 == 1 ? 4.0 * step / 3.0 : 2.0 * step / 3.0
|
19
|
+
end
|
20
|
+
a[0], a[-1] = 1.0 / 3.0 * step, 1.0 / 3.0 * step
|
21
|
+
matrix = Array.new(nodes.length) { Array.new nodes.length }
|
22
|
+
for i in 0...matrix.length do
|
23
|
+
for j in 0...matrix[i].length do
|
24
|
+
matrix[i][j] = i == j ? 1.0 - params[:lambda] * a[i] * params[:k].call(nodes[i], nodes[i]) : - params[:lambda] * a[j] * params[:k].call(nodes[i], nodes[j])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
f = Array.new(nodes.length){ |i| params[:f].call(nodes[i]) }
|
28
|
+
Mathpack::SLE.solve(matrix: matrix, f: f)
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.solve_volter_2(params = {})
|
32
|
+
step = (params[:to] - params[:from]) / 2.0
|
33
|
+
y_next = solve_volter_with_step(step, params)
|
34
|
+
loop do
|
35
|
+
y_prev = y_next
|
36
|
+
step /= 2.0
|
37
|
+
y_next = solve_volter_with_step(step, params)
|
38
|
+
break if Mathpack::IO.count_diff(y_next, y_prev) / (2**2 - 1) <= params[:eps]
|
39
|
+
end
|
40
|
+
{ x: Mathpack::Approximation.generate_nodes(from: params[:from], to: params[:to], step: step), f: y_next }
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.solve_volter_with_step(step, params = {})
|
44
|
+
y = []
|
45
|
+
nodes = Mathpack::Approximation.generate_nodes(from: params[:from], to: params[:to], step: step)
|
46
|
+
y[0] = params[:f].call(nodes[0])
|
47
|
+
y[1] = (params[:f].call(nodes[1]) + 0.5 * params[:lambda] * step * params[:k].call(nodes[1], nodes[0]) * y[0]) / (1.0 - 0.5 * params[:lambda] * step * params[:k].call(nodes[1], nodes[1]))
|
48
|
+
for i in 2...nodes.length do
|
49
|
+
sum = 0.0
|
50
|
+
for j in 1..(i-1) do
|
51
|
+
sum += params[:k].call(nodes[i], nodes[j]) * y[j]
|
52
|
+
end
|
53
|
+
sum *= step
|
54
|
+
y[i] = (0.5 * params[:lambda] * step * params[:k].call(nodes[i], nodes[0]) * y[0] + params[:lambda] * sum + params[:f].call(nodes[i])) / (1.0 - 0.5 * params[:lambda] * step * params[:k].call(nodes[i], nodes[i]))
|
55
|
+
end
|
56
|
+
y
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
data/lib/mathpack/version.rb
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
describe 'IntegralEquation' do
|
2
|
+
require 'mathpack/integral_equations'
|
3
|
+
|
4
|
+
describe '#solve_fredholm_2' do
|
5
|
+
let(:eps) { 1e-5 }
|
6
|
+
|
7
|
+
it 'solves fredholm 2 equations correctly' do
|
8
|
+
k = -> x, t { 1.0 / (x + t**2)**0.5 }
|
9
|
+
f = -> x { 2*x + (x + 1)**0.5 - (x + 4)**0.5 }
|
10
|
+
result = Mathpack::IntegralEquations.solve_fredholm_2(from: 1, to: 2, lambda: 0.5, eps: eps, k: k, f: f)[:f]
|
11
|
+
solution = Mathpack::Approximation.fill_f(Mathpack::Approximation.generate_nodes(from: 1, to: 2, step: 1.0 / (result.count - 1))) { |x| 2*x }
|
12
|
+
expect(Mathpack::IO.count_diff(result, solution) <= eps).to eq(true)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#solve_volter_2' do
|
17
|
+
let(:eps) { 1e-5 }
|
18
|
+
|
19
|
+
it 'solves volter 2 equations correctly' do
|
20
|
+
k_volter = -> x, t { Math.cos(x - t) }
|
21
|
+
f_volter = -> x { 0.75 * Math.exp(x) + 0.25 * Math.cos(x) - 0.25 * Math.sin(x) }
|
22
|
+
result = Mathpack::IntegralEquations.solve_volter_2(from: 0, to: 1, lambda: 0.5, eps: eps, k: k_volter, f: f_volter)[:f]
|
23
|
+
solution = Mathpack::Approximation.fill_f(Mathpack::Approximation.generate_nodes(from: 0, to: 1, step: 1.0 / (result.count - 1))) { |x| Math.exp(x) }
|
24
|
+
expect(Mathpack::IO.count_diff(result, solution) <= eps).to eq(true)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mathpack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- maxmilan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -55,6 +55,7 @@ files:
|
|
55
55
|
- lib/mathpack/approximation.rb
|
56
56
|
- lib/mathpack/functional.rb
|
57
57
|
- lib/mathpack/functions.rb
|
58
|
+
- lib/mathpack/integral_equations.rb
|
58
59
|
- lib/mathpack/integration.rb
|
59
60
|
- lib/mathpack/io.rb
|
60
61
|
- lib/mathpack/nonlinear_equations.rb
|
@@ -65,6 +66,7 @@ files:
|
|
65
66
|
- spec/approximation_spec.rb
|
66
67
|
- spec/functional_spec.rb
|
67
68
|
- spec/functions_spec.rb
|
69
|
+
- spec/integral_equations_spec.rb
|
68
70
|
- spec/integration_spec.rb
|
69
71
|
- spec/io_spec.rb
|
70
72
|
- spec/nonlinear_equations_spec.rb
|
@@ -90,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
92
|
version: '0'
|
91
93
|
requirements: []
|
92
94
|
rubyforge_project:
|
93
|
-
rubygems_version: 2.4.
|
95
|
+
rubygems_version: 2.4.3
|
94
96
|
signing_key:
|
95
97
|
specification_version: 4
|
96
98
|
summary: Summary
|