Class: Bullshit::NewtonBisection
- Inherits:
-
Object
- Object
- Bullshit::NewtonBisection
- Defined in:
- lib/bullshit.rb
Overview
This class is used to find the root of a function with Newton’s bisection method.
Instance Attribute Summary collapse
-
#function ⇒ Object
readonly
The function, passed into the constructor.
Instance Method Summary collapse
-
#bracket(range = -1..1, n = 50, factor = 1.6) ⇒ Object
Return a bracket around a root, starting from the initial
range. -
#initialize(&function) ⇒ NewtonBisection
constructor
Creates a NewtonBisection instance for
function, a one-argument block. -
#solve(range = nil, n = 1 << 16, epsilon = 1E-16) ⇒ Object
Find the root of function in
rangeand return it.
Constructor Details
#initialize(&function) ⇒ NewtonBisection
Creates a NewtonBisection instance for function, a one-argument block.
634 635 636 |
# File 'lib/bullshit.rb', line 634 def initialize(&function) @function = function end |
Instance Attribute Details
#function ⇒ Object (readonly)
The function, passed into the constructor.
639 640 641 |
# File 'lib/bullshit.rb', line 639 def function @function end |
Instance Method Details
#bracket(range = -1..1, n = 50, factor = 1.6) ⇒ Object
Return a bracket around a root, starting from the initial range. The method returns nil, if no such bracket around a root could be found after n tries with the scaling factor.
644 645 646 647 648 649 650 651 652 653 654 655 656 657 |
# File 'lib/bullshit.rb', line 644 def bracket(range = -1..1, n = 50, factor = 1.6) x1, x2 = range.first.to_f, range.last.to_f x1 >= x2 and raise ArgumentError, "bad initial range #{range}" f1, f2 = @function[x1], @function[x2] n.times do f1 * f2 < 0 and return x1..x2 if f1.abs < f2.abs f1 = @function[x1 += factor * (x1 - x2)] else f2 = @function[x2 += factor * (x2 - x1)] end end return end |
#solve(range = nil, n = 1 << 16, epsilon = 1E-16) ⇒ Object
Find the root of function in range and return it. The method raises a BullshitException, if no such root could be found after n tries and in the epsilon environment.
662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 |
# File 'lib/bullshit.rb', line 662 def solve(range = nil, n = 1 << 16, epsilon = 1E-16) if range x1, x2 = range.first.to_f, range.last.to_f x1 >= x2 and raise ArgumentError, "bad initial range #{range}" elsif range = bracket x1, x2 = range.first, range.last else raise ArgumentError, "bracket could not be determined" end f = @function[x1] fmid = @function[x2] f * fmid >= 0 and raise ArgumentError, "root must be bracketed in #{range}" root = if f < 0 dx = x2 - x1 x1 else dx = x1 - x2 x2 end n.times do fmid = @function[xmid = root + (dx *= 0.5)] fmid < 0 and root = xmid dx.abs < epsilon or fmid == 0 and return root end raise BullshitException, "too many iterations (#{n})" end |