# Review of Scilab

When I first installed Linux, I was
delighted to find that f2c (with the shell programs f77 or fort77)
made FORTRAN coding possible and almost transparent, despite the
lack of a FORTRAN compiler. But, after trying a number of publicly
available graphics programs, I was unsatisfied with plots of my
FORTRAN results. Also, I missed the mathematical power of such
programs as MATLAB, which I also (and primarily) use for its great
graphics. Then I tried scilab, which was released recently for Unix
and Linux by INRIA (*Institut National de Recherche de
Informatique et en Automatique*) of France. Although the
graphics aren't as good as MATLAB's, scilab did solve most of my
problems; so much so, that I installed it on my workstation at work
as well.

Scilab is a fully featured scientific package, with hundreds of built-in functions for matrix manipulation, signal processing (complete with its own toolbox), Fourier transforms, plotting, etc. It is based on the use of matrices, which means that, with proper planning, you don't need to use subscripted variables in your programs. Scilab has voluminous help files, documentation and demo programs. Here, I will just outline some of what it can do. There is just too much to cover in one article.

The documentation you will need is found in directories under
the main directory scilab-2.0. In doc/intro, the compressed
PostScript file intro.ps contains the user's manual,
*Introduction to Scilab*. This you will need for
sure. In man/LaTeX-doc is Docu.ps, which contains a list of all the
scilab functions. This is not really necessary as all of it is
available on line via the help command or the help button on the
scilab front end. The Signal Processing Toolbox manual in
doc/signal shows examples of IIR and FIR filters, spectral
analysis, and Kalman filtering.

As a direct descendent of MATLAB, its syntax is similar. For
example, to define a vector x, we can type at scilab's
**-->** prompt:

-->x=[ 1 3 5 8]

which is echoed back as:

x = ! 1. 3. 5. 8. !

(exclamation points denote a vector or matrix).

Matrix multiplications are trivial:

--> z=[ 7 8 9 10]; --> x * z' ans = 156. -->x.*z ans = ! 7. 24. 45. 80. !

The first multiplication was the row vector
**x** multiplied by the column vector
**z'** (created by a transpose of the row vector
**z** using the prime operator). This yields the
single number 156. The second multiplication with the
**.*** operator is an element by element multiply,
resulting in a vector.

Solutions of matrix equations of the form **a x =
b** are also simple. For example, let's define the 3x3
coefficient matrix **a**:

--> a=[2 1 3; 5 -3 1; 4 4 2] a = ! 2. 1. 3. ! ! 5. -3. 1. ! ! 4. 4. 2. !

For **b=[1 29 -14]'**, a column vector (using
the prime operator), we can find **x** several ways:

--> x=a\b x = ! 2. ! ! -6. ! ! 1. !

or alternatively **x=inv(a)*b**, where
**inv(a)** produces the inverse of the matrix
**a**.

To find and plot the **sin(2PI x/25)** for
**1<x<7lt;100**, first generate the sequence
of numbers—**x** ranging from 1 to 100, counting by
1,

-->x=[1:100];

where the semi-colon is used to stop scilab from echoing back the numbers. To find the sine of all the numbers at once:

-->y=sin(2*%pi*x/25);

where **%pi** is the scilab intrinsic value
for **PI**, and the vector y is the vector of the
sines, with the first value
**y(1)=sin(2*%pi*1/25)**, the second as
**y(2)=sin(2*%pi*2/25)**, and so on. To see these
values, we can plot them with **plot(y)**, as shown
in Figure 1, which shows the scilab front-end along with the
separate x-window plot that was generated automatically by scilab
superimposed.

Help is available several different ways. Typing
**help** at the scilab prompt, followed by a
function name, will produce a window with the help text for that
function. Or use the help button in the main window (shown in
Figure 1) to create the Scilab Help Panel (shown in Figure 2). This
method allows a search of the help files with the apropos command,
shown here with a search for the keyword plot. There are 10 entries
shown in the figure of the 28 available for plot. With a single
click on fplot3d, an xless window pops open with detailed
information on the use and the arguments of the function (shown in
Figure 3).

One problem I solve often is *s=x tanh(x)*
for *x* when *s* is given. It
comes up in the problem of determining the length of a water wave
of a given frequency in a known water depth. Since x appears in the
argument of the hyperbolic tangent function, this is not an easy
problem to solve, requiring an iterative solution method. Instead
of writing a Newton-Raphson scheme as I do in FORTRAN, I use the
**fsolve** function, which finds the zero of a
system of nonlinear functions. First, let's find x given a single
value of s.

-->s=.5

I then define the remainder, **r =
s-x*tanh(x)**, which should be zero for the correct value
of **x**.

-->deff(`[r]=g(x)','r=s-x.*tanh(x)')

The **deff** function defines
**g(x)**, with single quotes about each part. Now to
**fsolve**:

-->x=fsolve(.3,g) x = .7717023

The value 0.3 is my initial guess at the answer. Let's check
the answer by substituting it back into
**g(x)**:

-->r=g(x) r = - 1.110E-16

Our solution is good. If we had defined **s**
as **[0.1 0.2 0.3]** and used
**x=fsolve(s,g)**, we would get three solutions at
once. (That's why I used **.*** instead of
***** in the definition of
**r(x)**.)

Rather than typing the definition of g directly into to
scilab, we can define a file—**wvnum**, for
example, as the definition of the function **g(x)**.
The file would look just like the deff argument given above, with
two separate lines, but without the single quotes. We then call the
definition into scilab with **getf(`wvnum')**. This
can also be done through the File Operations button.

We can assure ourselves that there is only one positive
solution for **x** by plotting
**g(x)**, say, in the range from 0 to 5 by steps of
0.1:

-->fplot2d((0:.1:5),g)

**fplot2d** has the advantage over the plot
function of specifying the range of the abscissa and plotting a
function instead of a list of numbers. (Note there is a minor error
in the help file example—reversing the arguments of fplot2d. This
is one of the mistakes I have found. The worst was an error in
scilab's attempt to convert a function definition into FORTRAN
code. Be careful.)

Scilab has a variety of other plotting functions available.
Histograms, contour plots, 3d plots, and plots of vectors (useful
for flow fields) are all available. I sometimes use scilab to plot
data from another program. By saving the data in an ASCII file,
with known numbers of rows and columns, the data is read into
scilab by a read command:
**z=read(`datafile',m,n)**, where
**(m,n)** are the numbers of rows and columns. Then
the data can be contoured, for example, by
**contour(1:m,1:n,z,10)** for 10 contour
levels.

Plotting data in three dimensions is also straightforward.
Using the **z** data from above, a similar call to
**plot3d(1:m,1:n,z,45,45)** produces a 3D plot with
a view point associated with the spherical coordinates 45 and 45
(in degrees). By setting the program to use color,
**xset("use color",1)**, then
**plot3d1** with the same arguments gives a color
shaded plot. Looking through the demo program sources will show you
how to animate this type of plot.

Printing figures is easy. One way is to simply use the Print
button in the scilab graphic window. This sends the figure directly
to your PostScript printer, if you have one. The same thing is
accomplished with the command
**xbasimp(0,'foo.ps')**, which outputs the contents
of plotting window 0 to a PostScript printer (despite what the
documentation says). Using **xbasimp(0,'foo.ps',0)**
will instead make a file named **foo.ps.0**, which
can be printed with an external scilab program called Blpr. The
file foo.ps.0 is not quite a PostScript file, as a preamble
translating scilab abbreviations is missing. Blpr adds that
preamble producing a PostScript file that can be redirected into a
true PostScript file or printed directly. Scilab also comes with
external programs to include PostScript figures in LaTeX documents,
if you're not already using epsf.sty with LaTeX.

Long programs can be written in a file for use with scilab. This means you don't have to do everything interactively. These files are easily pulled into the scilab program by using the File Operations button, clicking the program file name and then the Exec button. Debugging a large program is relatively simple; just write the file and then run it repeatedly, making corrections as you go along.

There are lots of other things that I haven't mentioned, such as integration functions, ordinary differential equation solvers, nonlinear optimization tools, symbolic manipulation of polynomials and linear systems, interfaces to Maple, C, and FORTRAN, and many others. These you'll just have to try out on your own. But I think that you will agree the effort is worth it and that scilab does bring mathematical clout to the Linux environment.

**Robert A. Dalrymple**
teaches coastal engineering at the
University of Delaware and directs the Center for Applied Coastal
Research. He uses Linux at home and work and has more fun with it
than he should, as he has other things he is supposed to do!

## Trending Topics

## Webinar

### Fast/Flexible Linux OS Recovery

On Demand Now

In this live one-hour webinar, learn how to enhance your existing backup strategies for complete disaster recovery preparedness using Storix System Backup Administrator (SBAdmin), a highly flexible full-system recovery solution for UNIX and Linux systems.

Join *Linux Journal*'s Shawn Powers and David Huffman, President/CEO, Storix, Inc.

Free to *Linux Journal* readers.

CentOS 6.8 Released | May 27, 2016 |

Secure Desktops with Qubes: Introduction | May 27, 2016 |

Chris Birchall's Re-Engineering Legacy Software (Manning Publications) | May 26, 2016 |

ServersCheck's Thermal Imaging Camera Sensor | May 25, 2016 |

Petros Koutoupis' RapidDisk | May 24, 2016 |

The Italian Army Switches to LibreOffice | May 23, 2016 |

- Secure Desktops with Qubes: Introduction
- Download "Linux Management with Red Hat Satellite: Measuring Business Impact and ROI"
- CentOS 6.8 Released
- Linux Mint 18
- The Italian Army Switches to LibreOffice
- Chris Birchall's Re-Engineering Legacy Software (Manning Publications)
- ServersCheck's Thermal Imaging Camera Sensor
- Oracle vs. Google: Round 2
- Petros Koutoupis' RapidDisk
- The FBI and the Mozilla Foundation Lock Horns over Known Security Hole

## Geek Guides

Until recently, IBM’s Power Platform was looked upon as being the system that hosted IBM’s flavor of UNIX and proprietary operating system called IBM i. These servers often are found in medium-size businesses running ERP, CRM and financials for on-premise customers. By enabling the Power platform to run the Linux OS, IBM now has positioned Power to be the platform of choice for those already running Linux that are facing scalability issues, especially customers looking at analytics, big data or cloud computing.

￼Running Linux on IBM’s Power hardware offers some obvious benefits, including improved processing speed and memory bandwidth, inherent security, and simpler deployment and management. But if you look beyond the impressive architecture, you’ll also find an open ecosystem that has given rise to a strong, innovative community, as well as an inventory of system and network management applications that really help leverage the benefits offered by running Linux on Power.

Get the Guide