# Class: Bullshit::NewtonBisection

Inherits:
Object
• Object
show all
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

The function, passed into the constructor.

## Instance Method Summary collapse

• Return a bracket around a root, starting from the initial `range`.

• constructor

Creates a NewtonBisection instance for `function`, a one-argument block.

• Find the root of function in `range` and 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

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.

Raises:

 ``` 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```