Octave

From Coder Merlin
Within these castle walls be forged Mavens of Computer Science ...
— Merlin, The Coder

Octave[edit]

GNU Octave is software featuring a high-level programming language, primarily intended for numerical computations. Octave helps in solving linear and nonlinear problems numerically, and for performing other numerical experiments using a language that is mostly compatible with MATLAB.[1]

Preparation[edit]

In this exercise, you'll be generating graphic files by using Octave. In order to view these files, you'll save them in a special directory called "~www" which must be created in your home directory. The following instructions will instruct you on how to create this directory.

Create a directory to be served by the web server. If the directory already exists, no error will occur.

amrit-gupta@codermerlin:~$ mkdir --parents ~/www


Enter the directory.

amrit-gupta@codermerlin:~$ cd ~/www


Set the permissions so that the files can be accessed by the web server. If permission errors are encountered, re-execute this command.

amrit-gupta@codermerlin:~$ chmod -R a+rX ~/www

Graphing[edit]

Octave may be started by typing 'octave' in the shell. It's easiest to perform this in your www directory so the files that you create will be saved there.

liang-xue@codermerlin:~$ cd ~/www

liang-xue@codermerlin:~$ octave

You'll know you're in Octave when you see the Octave prompt.

octave:1> 

In order to enable graphics plotting, execute the following command:

octave:1> graphics_toolkit("gnuplot")

We'll begin with a 3-D example to demonstrate the power of Octave and the ease with which complex graphs can be created.

Examples[edit]

3-D Sombrero Plot[edit]

octave:2> tx = ty = linspace (-8, 8, 41)';

octave:3> [xx, yy] = meshgrid (tx, ty);

octave:4> r = sqrt (xx .^ 2 + yy .^ 2) + eps;

octave:5> tz = sin (r) ./ r;

octave:6> mesh (tx, ty, tz);

octave:7> xlabel ("tx");

octave:8> ylabel ("ty");

octave:9> zlabel ("tz");

octave:10> title ("3-D Sombrero plot");

We can now print the plot to a file with:

octave:11> print -dpng sombrero.png

It may take a few seconds to produce the file; be patient.

It's necessary to adjust the file's permissions to enable web server access. This may easily be performed from within octave using the following command:

octave:12> system("chmod -R a+rX ~/www")

When the prompt returns, the file may be viewed in a browser. Every user has a personal URL. Your file may be viewed here: You must be logged in to view your personal URL.

Random Numbers[edit]

We can produce results similar to those of throwing a six-sided die by using the rand function which returns a random value in the interval (0, 1).

octave:13> rand

Try executing this command several times and observe the results. In order to obtain integer values in the range from 1 to 6 we'll multiply the result of rand by 6, add 1, and then take the floor of this result.

octave:16> floor(6*rand + 1)

Try executing this command several times and observe the results.

Array of Random Numbers[edit]

An array of 10 random throws of a six-sided die can be produced as follows.

octave:17> A = floor(6 * rand(10, 1) + 1)

Plotting a Histogram[edit]

Histograms can easily be plotted from the array. The second argument [1 2 3 4 5 6] provides the midpoints of the 'bins' for our histogram.

octave:18> hist(A, [1 2 3 4 5 6]);

Plotting Multiple Histograms on Same Graph[edit]

 # Plots three histograms of random data from six-sided die                                     
 # Histograms vary in their population
 graphics_toolkit("gnuplot")

 # Generate three random data sets of six-sided die throws
 A = floor(6 * rand(10000, 1) + 1)
 B = floor(6 * rand(100, 1) + 1)
 C = floor(6 * rand(10, 1) + 1)

 # Plot data as histograms
 hold on
 hist(A, [1, 2, 3, 4, 5, 6], "facecolor", "cyan");
 hist(B, [1, 2, 3, 4, 5, 6], "facecolor", "magenta");
 hist(C, [1, 2, 3, 4, 5, 6], "facecolor", "green");
 colormap( summer(64));

 # Use a logarithmic scale
 set(gca, 'yscale', 'log');

 # Add Titles and Legends
 grid on
 title("Histogram Plots: Six-sided Die Simulations");

 xlabel("Six-sided Die Roll")
 ylabel("Frequency of Occurrence (log scale)")

 legend ("10 thousand samples", "100 samples", "10 samples", "location", "northeastoutside");

 # Print to a file
 print -dpng histogram.png

Reading from a Remote URL[edit]

We can read the contents of a remote URL using the following command:

octave:17> s = urlread ("https://www.codermerlin.com/users/john-williams/sample.csv");

Reading from a String[edit]

We can read the contents of a string using the following command, interpreting each value read as a Double:

octave:18> A = strread(s, "%n");

Appending from a String[edit]

We can append the contents of a string to an existing array using the following command:

octave:18> A = [A; strread(s, "%n")];

References[edit]

  1. Gnu Octave. (2022, February, 10). In Wikipedia. https://en.wikipedia.org/wiki/GNU_Octave