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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a8ce50434e6550fb905aa1cb215106fc208af310
4
- data.tar.gz: 2bce06f9c4b43424bf26923d0ecf7c91789253d3
3
+ metadata.gz: 1e848a2ca014612e04f7d621ff4667bc4dad2603
4
+ data.tar.gz: 85a146ea4bea8cb8720f4a7542c4582849f42f11
5
5
  SHA512:
6
- metadata.gz: 8568cd24de9e9404a584e7f2723c62f604cfd5a9e8235f393f9f6438770b865dd0e569d8ce57d736f567b76c94edc7c1182efd484c17cc178bd6fdf01f2fcdc0
7
- data.tar.gz: 5eb2691333cc2af964d925a4f7c3c6c75598c08c6229b6d321a6011e9003e7ceb89e463c13d99e47a7af149f2e4fbb44cf10bcb83ec4c9fe3ad05fa06dee9eff
6
+ metadata.gz: e7f5d93c396d007c6b634e3b68874eef3e64b29e7d3e8397de39f0325d3f24b303391d4f8155e3afd106340d2fd527372c586696d2fc4077b4357dbf38861e5b
7
+ data.tar.gz: 1f55b2454e8271adaa34f955cf161cd9e52807ba3090d0c5f925c53568de2a2eb04b5db01c4b8318d70b939794c4273bde6b31e914b0e7c6a1541da5a1068371
data/lib/mathpack.rb CHANGED
@@ -7,3 +7,4 @@ require 'mathpack/integration'
7
7
  require 'mathpack/io'
8
8
  require 'mathpack/functions'
9
9
  require 'mathpack/functional'
10
+ require 'mathpack/integral_equations'
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Mathpack
2
- VERSION = '0.4.5'
2
+ VERSION = '0.4.6'
3
3
  end
@@ -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
@@ -1,4 +1,4 @@
1
- describe 'Equation' do
1
+ describe 'NonlinearEquation' do
2
2
  require 'mathpack/nonlinear_equations'
3
3
 
4
4
  describe '#solve' do
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.5
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-04-05 00:00:00.000000000 Z
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.6
95
+ rubygems_version: 2.4.3
94
96
  signing_key:
95
97
  specification_version: 4
96
98
  summary: Summary