help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Fractions


From: Paul Kienzle
Subject: Re: Fractions
Date: Fri, 30 Mar 2001 01:30:56 +0100
User-agent: Mutt/1.2.5i

You can get a rational approximation to a number with the function
rat.m that I have written.  And you can display a matrix of fractions
as a string with the function rats.m.  See below.  

E.g.,

octave:1> rats(hilb(9))
ans = 
  1   1/2  1/3  1/4  1/5  1/6  1/7  1/8  1/9
 1/2  1/3  1/4  1/5  1/6  1/7  1/8  1/9 1/10
 1/3  1/4  1/5  1/6  1/7  1/8  1/9 1/10 1/11
 1/4  1/5  1/6  1/7  1/8  1/9 1/10 1/11 1/12
 1/5  1/6  1/7  1/8  1/9 1/10 1/11 1/12 1/13
 1/6  1/7  1/8  1/9 1/10 1/11 1/12 1/13 1/14
 1/7  1/8  1/9 1/10 1/11 1/12 1/13 1/14 1/15
 1/8  1/9 1/10 1/11 1/12 1/13 1/14 1/15 1/16
 1/9 1/10 1/11 1/12 1/13 1/14 1/15 1/16 1/17 

Any non-standard octave functions can be found in matcompat
        http://users.powernet.co.uk/kienzle/octave/matcompat

Hope this helps.

Paul Kienzle
address@hidden

On Thu, Mar 29, 2001 at 11:20:02PM +1000, Menaka Lashitha Bandara wrote:
> Hi people,
> 
> can Octave work purely with fractions???
> 
> I'm getting too many decimals in my work.
> 
> Thanks.
> 
> Lashi.
> 
> 
> 
> -------------------------------------------------------------
> Octave is freely available under the terms of the GNU GPL.
> 
> Octave's home on the web:  http://www.octave.org
> How to fund new projects:  http://www.octave.org/funding.html
> Subscription information:  http://www.octave.org/archive.html
> -------------------------------------------------------------
> 
> 

## Copyright (C) 2001 Paul Kienzle
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

## [n,d] = rat(x,tol)
## Find a rational approximation to x within tolerance using a continued
## fraction expansion. E.g,
##
##    rat(pi) = 3 + 1/(7 + 1/16) = 355/113
##    rat(e) = 3 + 1/(-4 + 1/(2 + 1/(5 + 1/(-2 + 1/(-7))))) = 1457/536

function [n,d] = rat(x,tol)

  if (nargin != [1,2] || nargout != 2)
    usage("[n,d] = rat(x,tol)");
  endif

  y = x(:);
  if (nargin < 2)
    tol = 1e-6 * norm(y,1);
  endif

  ## First step in the approximation is the integer portion
  n = round(y);  # first element in the continued fraction
  d = ones(size(y));
  frac = y-n;
  lastn = ones(size(y));
  lastd = zeros(size(y));

  ## grab new factors until all continued fractions converge
  while (1)
    ## determine which fractions have not yet converged
    idx = find (abs(y-n./d) >= tol);
    if (isempty(idx)) break; endif

    ## grab the next step in the continued fraction
    flip = 1./frac(idx);
    step = round(flip); # next element in the continued fraction
    frac(idx) = flip-step;

    ## update the numerator/denominator
    nextn = n;
    nextd = d;
    n(idx) = n(idx).*step + lastn(idx);
    d(idx) = d(idx).*step + lastd(idx);
    lastn = nextn;
    lastd = nextd;
  endwhile

  ## move the minus sign to the top
  n = n.*sign(d);
  d = abs(d);

  ## return the same shape as you receive
  n = reshape(n, size(x));
  d = reshape(d, size(x));

endfunction


opyright (C) 2001 Paul Kienzle
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

## S = rat(x,tol)
## Convert x into a rational approximation represented as a string.  You
## can convert the string back into a matrix as follows:
##
##    eval(["[",rats(hilb(4)),"];"])

function T = rats(x)
  if nargin != 1
    usage("S = rats(x)");
  endif

  [n, d] = rat(x');
  [nr, nc] = size(x);

  len = nr*nc;
  S = sprintf("%d/%d ", [n(:), d(:)]');
  if (len == 1)
    T = S;
  else
    index = findstr(S, "/1 ");
    if (index)
      S = toascii(S);
      S([index, index+1]) = [];
      S = setstr(S);
    endif
    index = find(S == " ");
    shift = [index(1), diff(index)];
    cellsize = max(shift);
    shift = cellsize - shift;
    assign = ones(size(S));
    index = index(1:len-1);
    assign([1,index]) = assign([1,index]) + ceil(shift/2);
    assign(index) = assign(index) + floor(shift(1:len-1)/2);
    assign = cumsum(assign);
    T = setstr(toascii(" ")*ones(1, nr*nc*cellsize+1));
    T(assign+1) = S;
    T(nc*cellsize+1:nc*cellsize:nr*nc*cellsize) = "\n";
    T(1)='\n';
  endif

endfunction



-------------------------------------------------------------
Octave is freely available under the terms of the GNU GPL.

Octave's home on the web:  http://www.octave.org
How to fund new projects:  http://www.octave.org/funding.html
Subscription information:  http://www.octave.org/archive.html
-------------------------------------------------------------



reply via email to

[Prev in Thread] Current Thread [Next in Thread]