Dr.EW Johnny Heikell Dr.EW Johnny Heikell Scilab for Real Dummies, Scilab for Real Dummies, Introducing an Open Introducing an Open - - Source Source Alternative to Alternative to Matlab Matlab Johnny Heikell Johnny Heikell v1.0 / Scilab 5.3.2 (5.3.3) "It is a mistake often made in this country to measure things by the amount of money they cost." Albert Einstein
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Dr.EWJohnny Heikell
Dr.EWJohnny Heikell
Scilab for Real Dummies,Scilab for Real Dummies,Introducing an OpenIntroducing an Open--Source Source
Alternative to Alternative to MatlabMatlab
Johnny HeikellJohnny Heikell
v1.0 / Scilab 5.3.2 (5.3.3)
"It is a mistake often made in this country to measure things by the amount of money they cost." Albert Einstein
About this presentationAbout this presentation
I compiled this presentation while familiarizing myself with Scilab for basic engineering applications. The exercise taught that a reason to the limited spread of Scilab is lack of good tutorials in English, which makes learning Scilab a frustrating experience for programming newbies. It’s a pity because Scilab deserves better recognition. Hopefully this presentation can be of use to at least some Scilab aspirants.
The text no doubt has shortcomings and errors. I hope to come up with an improved version in a not too distant future (with Scilab 6). Please post comments & suggestions at:
Espoo in August 2011
Johnny HeikellJohnny HeikellJohnny HeikellJohnny Heikellwww.heikell.fiLinkedIn
Copyleft: This material is released under the only condition that you do not put restrictions or a price tag on your redistributions—modified or not—and
The best Scilab tutorials are non-English. The following are the ones that I have consulted most for this work:
• Timo Mäkelä’s Scilab/Xcos tutorials (3 parts) in Finnish <http://sites.google.com/site/tjmakela/home>. Heavy on mathematical formalism,standard dull LaTeX typesetting, but the best one I know
• Jean-Marie Zogg’s Arbeiten mit Scilab und Scicos in German <http://www.fh-htwchur.ch/uploads/media/Arbeiten_mit_Scilab_und_Scicos_v1_01.pdf>. It’s good and informal, and contains details thatMäkelä has omitted. Needs updating
• Wolfgang Kubitzki’s mixed tutorials in German that can be found at<http://www.mst.fh-kl.de/~kubitzki/>. Quite good, a lot of details, fewpractical examples (scripts in separate .zip files)
I am indebt to their work.
“To copy from one is plagiarism, to copy from many is research.” Unknown
Why I did it Why I did it
the way I did itthe way I did it
As a grad student at KU in 1990-91, I needed to quickly learn MathCAD or Matlab. A fellow student showed me MathCAD basics in 15 minutes with the use of a sine function. The lecture went something like this:
• “First you declare the variables that you need”• “Then you define the function that you want to plot”• “After that you write the plot commands”
With that teaching I got started and was able to use MathCAD for my MS thesis.
Lessons learned: Show examples and skip the academic trivia.
I am deeply grateful to Jim for his lesson. We’ll repeat it as soon as Scilab is installed and opened.
Why PowerPoint?Why PowerPoint?
1.1. These were originally personal notes, I recognized only later thThese were originally personal notes, I recognized only later that at they may be of use to othersthey may be of use to others
2.2. It is easy to edit PPT material slide by slideIt is easy to edit PPT material slide by slide3.3. You get a quick overview of the discussion at hand by shifting You get a quick overview of the discussion at hand by shifting
between between PPTPPT’’ss Normal and Slide Sorter viewsNormal and Slide Sorter views4.4. PPT has an advantage over PDF in allowing the reader to modify PPT has an advantage over PDF in allowing the reader to modify
the work the way (the work the way (s)hes)he likeslikes5.5. You can copyYou can copy--paste the provided scripts into Scilabpaste the provided scripts into Scilab’’s Editor s Editor
without having to rewrite them, only minor editing is neededwithout having to rewrite them, only minor editing is needed6.6. And finally, I have seen And finally, I have seen too many depressing LaTeX documentstoo many depressing LaTeX documents
Why do I release this tutorial as a PowerPoint* presentation when there is enough material for a 400-page book? There are several reasons:
*) .ppt documents do not require MS software. LibreOffice works as well (at least up to PPT 2003) but some editing may be needed. Oracle threw in the towel on OpenOffice in April 2011, but it lives on in the Apache Incubator.
Why simulate?Why simulate?
British physicist and engineer Lord Kelvin British physicist and engineer Lord Kelvin (William Thomson) is known to have said:(William Thomson) is known to have said:
““When you can measure what you are speaking about and express it innumbers, you know something aboutit.””
His words can be paraphrased in computerHis words can be paraphrased in computer--age terms:age terms:
““When you can simulate what you arespeaking about and present it visually,you know something about it.””
Lord Kelvin 1827-1904
ContentsContents
1.1. IntroductionIntroduction2.2. A first peek at ScilabA first peek at Scilab3.3. The Console & EditorThe Console & Editor4.4. Examples, Set 1 Examples, Set 1 5.5. Matrices, functions & Matrices, functions &
operatorsoperators6.6. Examples, Set 2 Examples, Set 2 7.7. Graphics & plottingGraphics & plotting8.8. Examples, Set 3Examples, Set 39.9. Converting Converting MatlabMatlab filesfiles10.10. SubroutinesSubroutines
11.11. Flow controlFlow control12.12. Examples, Set 4Examples, Set 413.13. Doing math on ScilabDoing math on Scilab14.14. Examples, Set 5Examples, Set 515.15. Working with GUIsWorking with GUIs16.16. File handlingFile handling17.17. AnimationAnimation18.18. MiscellaneousMiscellaneous19.19. Examples, Set 6Examples, Set 620.20. AdieuAdieu
HOW TO HYPERLINK IN POWERPOINT: 1) Slide Show mode: By clicking on the underlined text. 2) Norman View mode: Put cursor on the underlined text right-click Click: Open Hyperlink. (There is a bugin PowerPoint, hyperlinking to certain slides is impossible, e.g. to Chapter 19.)
Dr.EWJohnny Heikell
Dr.EWJohnny Heikell
1. Introduction1. Introduction
What is and why use Scilab?What is and why use Scilab?
Return to Contents
What Scilab is (1/2)What Scilab is (1/2)
A software package for scientific and engineering computing, A software package for scientific and engineering computing, quite similar to quite similar to MatlabMatlab
Scilab is a tool for Scilab is a tool for numeric computingnumeric computing, as are Excel, GNU , as are Excel, GNU Octave, Octave, MatlabMatlab, etc. The alternative is , etc. The alternative is symbolic computingsymbolic computing, to , to which belong Maple, which belong Maple, MathCadMathCad, , MathematicaMathematica, and others, and others
Developed by Consortium Scilab (DIGITEO), behind which are Developed by Consortium Scilab (DIGITEO), behind which are a number of French institutions and companiesa number of French institutions and companies
Included in the Scilab package is Included in the Scilab package is XcosXcos, a graphic modeling , a graphic modeling and simulation tool. However, it is not compatible with and simulation tool. However, it is not compatible with SimulinkSimulink. . XcosXcos 1.0 came with Scilab 5.2, before there was 1.0 came with Scilab 5.2, before there was ScicosScicos. The . The confusionconfusion is complete with a rival called is complete with a rival called ScicoslabScicoslab
Scilab is free and can be downloaded at Scilab is free and can be downloaded at www.scilab.orgwww.scilab.org
What Scilab is (2/2)What Scilab is (2/2)
Scilab is matrixScilab is matrix--oriented, just like oriented, just like MatlabMatlab It allows It allows matrix manipulations, 2D/3D plotting, animation, etc. It is an open programming environment that allows users to
create their own functions and libraries Its editor has a built-in, though elementary, debugger Main components of Scilab are:Main components of Scilab are:
–– An interpreterAn interpreter–– Libraries of functions (procedures, macros)Libraries of functions (procedures, macros)–– Interfaces for Fortran, Interfaces for Fortran, Tcl/TkTcl/Tk, C, C++, Java, , C, C++, Java, ModelicaModelica, and , and
LabVIEWLabVIEW——but not for Python and/or Rubybut not for Python and/or Ruby
Which is “better,” Matlab or Scilab? – Matlab outperforms Scilab in many respects, but Scilab is
catching up. The use of Matlab is motivated only in special circumstances due to its high cost
Why use ScilabWhy use Scilab——personal personal
reasonsreasons
MatlabMatlab 6.5 (R13) was not compatible with my new Windows Vista 6.5 (R13) was not compatible with my new Windows Vista laptop. laptop. MatWorksMatWorks, Inc., recommended to buy a new version, Inc., recommended to buy a new version
I refused to pay another license fee for I refused to pay another license fee for MatlabMatlab and went looking for and went looking for openopen--source alternatives:source alternatives:–– SageSage felt bulky, immature, and focused on pure mathematicsfelt bulky, immature, and focused on pure mathematics–– PythonPython is not optimized for scientific and engineering tasksis not optimized for scientific and engineering tasks–– Python(x,yPython(x,y)) messed up my PC when I installed it. Maybe I should I messed up my PC when I installed it. Maybe I should I
have tried have tried SciPySciPy instead?instead?–– I grew tired of I grew tired of GNU OctaveGNU Octave before I figured out how to download before I figured out how to download
and install it (I want a tool to use, not to fight against)and install it (I want a tool to use, not to fight against)–– ScilabScilab was the fifth alternative that I looked at. It gave no immediatwas the fifth alternative that I looked at. It gave no immediate e
problems, so I stuck to it. Later I have come across bugs and problems, so I stuck to it. Later I have come across bugs and crashes/lockupscrashes/lockups——and become frustrated with its poor documentationand become frustrated with its poor documentation
Would I still select Scilab? Yes, I am impressed by Scilab and believe that the competitors cause you gray hair as well—one way or another.
Why people donWhy people don’’t use t use
ScilabScilab
The following are some comments about Scilab and open-source software in general that I have come across:
• “Scilab? Never heard of it”• “Octave is closer to Matlab”• “As a company we have to use software that will be supported ten
years from now”• “It doesn’t have the toolboxes that we need”• “There is a cost involved in shifting to a new software tool, even if
the tool is gratis”• “Training and documentation support is poor”• “There are no interfaces for other software tools that we use”• “It seems to be rather slow”
Conclusion: Scilab, like other open-source programs, lacks credibility in the eyes of users—particularly professional users. The situation is similar with various excellent Linux distros and the LibreOffice office package. Users trust products that have to be paid for
Scilab advantagesScilab advantages
Numeric computing is better suited for complex tasks than symbolNumeric computing is better suited for complex tasks than symbolic ic computingcomputing
Not all mathematical problems have closed form solutions, numeriNot all mathematical problems have closed form solutions, numeric c computing will therefore always be neededcomputing will therefore always be needed
Scilab is similar to Scilab is similar to MatlabMatlab and keeps developing even closer. It is and keeps developing even closer. It is quite easy to step from one to the otherquite easy to step from one to the other
Scilab requires less disk space than Scilab requires less disk space than MatlabMatlab and GNU Octaveand GNU Octave It includes a It includes a MatlabMatlab--toto--ScilabScilab translatortranslator (.m files to .(.m files to .scisci files)files) Data plotting is said to be simpler than with GNU Octave (but thData plotting is said to be simpler than with GNU Octave (but the e
trend is toward more complex handle structures)trend is toward more complex handle structures) The The XcosXcos toolbox installs automatically with Scilab, be it, that toolbox installs automatically with Scilab, be it, that XcosXcos is is
not compatible with not compatible with SimulinkSimulink Scilab installs without immediate problems on Windows computersScilab installs without immediate problems on Windows computers Scilab is freeScilab is free——if your wasted time and frustrations are worth if your wasted time and frustrations are worth
nothing. The fight for a limited number of expensive licenses nothing. The fight for a limited number of expensive licenses ((MatlabMatlab, , MathematicaMathematica, etc.) is not an issue in professional life, etc.) is not an issue in professional life
Scilab disadvantagesScilab disadvantages
Numeric computing introduces rounding errors, contrary to symbolNumeric computing introduces rounding errors, contrary to symbolic ic computingcomputing
The learning effort required by numeric computing is higher thanThe learning effort required by numeric computing is higher than for for symbolic computing symbolic computing
Scilab Scilab lacks a unified tutorial and/or userlacks a unified tutorial and/or user’’s manuals manual. You . You ““try and crytry and cry””and waste time searching for information on its use*and waste time searching for information on its use*
In some cases Scilab executes much slower than In some cases Scilab executes much slower than MatlabMatlab and GNU and GNU Octave (improvements are said to be under way)Octave (improvements are said to be under way)
ScilabScilab’’s tools for creating GUIs are poor compared with s tools for creating GUIs are poor compared with MatlabMatlab The Help Browser is very formal and of little use to The Help Browser is very formal and of little use to newbiesnewbies Scilab hasScilab has bugs bugs and tends toand tends to crash/lockupcrash/lockup (it happens to Bill Gates (it happens to Bill Gates
as well. Often)as well. Often) OnOn--line support from line support from EqualisEqualis costs $495 or more per annum (the costs $495 or more per annum (the
French prefer $ to French prefer $ to €€))
*) Scilab is not alone. The open-source community has a poor track record in documentation because “paperwork” does not bring recognition.
Terminology: Terminology: ““functionfunction””
The C programming language brought confusion with its unrestricted use of the term “function” and this is repeated in Scilab. The term refers to (at least):
• Mathematical functions in general• Scilab’s built-in functions• User defined functions (UDF)
I would prefer the terms function, macro (or procedure), and subroutine respectively (protests form dogmatic programmers are overruled). Sometimes I talk about subroutine, but it is not always possible. For instance, function is the term that must be used to define a UDF in Scilab. And there is also the risk of adding to the bewilderment by applying own terminology. The confusion remains...
Intro to problems (1/3): Intro to problems (1/3):
crashes & lockupscrashes & lockups
Processor loads of this magnitude are normal during computer startup. However, this is the situation after Scilab had crashed and I had closed it. “WScilex.exe” had another of its lockups and required to be closed with the Task Manager (or by rebooting the computer).
The Scilab team’s standard answer to problems like this is to make sure that the computer’s drivers are up-to-date. It has not worked for my Windows Vista PC.
Intro to problems (2/3): Intro to problems (2/3):
new releases*new releases*
With Scilab 5.2 came a problem that I did not experience with With Scilab 5.2 came a problem that I did not experience with version 5.1.1: Copyversion 5.1.1: Copy--pasting from Scilabpasting from Scilab’’s Editor to PowerPoint s Editor to PowerPoint frequently caused the latter to frequently caused the latter to crashcrash. The bug has been fixed. The bug has been fixed
With Scilab 5.3.0 I found that the paths With Scilab 5.3.0 I found that the paths File/Open file in...File/Open file in... and and File/Save file in...File/Save file in... on the Editor were unresponsiveon the Editor were unresponsive
Some scripts that I originally wrote using Scilab 5.1.1 did not Some scripts that I originally wrote using Scilab 5.1.1 did not work work with Scilab 5.3.0, and GUIs on 5.3.2 are a real pain down therewith Scilab 5.3.0, and GUIs on 5.3.2 are a real pain down there
Typically larger updates come with bugs and are quickly followedTypically larger updates come with bugs and are quickly followed by by minor minor ““bug fixbug fix”” updates (a.k.a. patches). Scilab 5.3.1 emerged within updates (a.k.a. patches). Scilab 5.3.1 emerged within three months of 5.3.0. This is universal in the software businesthree months of 5.3.0. This is universal in the software business s
It is wise to It is wise to keep an old Scilab versionkeep an old Scilab version until you know that the new until you know that the new release can be trusted (I was happy I had kept version 5.1.1 wherelease can be trusted (I was happy I had kept version 5.1.1 when n GUIs on 5.3.1 & 5.3.2 gave me problems)GUIs on 5.3.1 & 5.3.2 gave me problems)
*) Various Scilab versions are mentioned. I have worked with Scilab 5.1.1 -5.3.2. Scilab 5.3.3 came too late to be considered.
Intro to problems (3/3): Intro to problems (3/3):
ATOMS and nerdsATOMS and nerds
ATOMS is ATOMS is ScilabScilab’’ss system for system for downloading and installing userdownloading and installing user--developed toolboxes. It has given me developed toolboxes. It has given me real gray hairreal gray hair
I installed two toolboxes and I installed two toolboxes and ScilabScilab plots plots became a mess. Here you can see what became a mess. Here you can see what the later discussed rotation surface the later discussed rotation surface looked like with toolboxes installedlooked like with toolboxes installed
I found what caused it after reinstalling I found what caused it after reinstalling Windows and the toolboxes. It took me Windows and the toolboxes. It took me days to get all programs running days to get all programs running
The idea of user contributions is basically The idea of user contributions is basically sound, but there is sound, but there is a risk with nerdsa risk with nerds that that have more zeal than ability and tenacity have more zeal than ability and tenacity to properly test their programsto properly test their programs
Embedded informationEmbedded information
Scilab comes with some built-in information structures. The major ones are:– The Help Browser that can be accessed from various windows. Its utility
improved with Scilab 5.3.1 when demonstrations were included, but the Help Browser is still a hard nut for newbies. It confuses by sometimes referring to obsolete functions
– Demonstrations that can be accessed from the Console. Not really tutorials and some of them act funny, some may cause Scilab to crash, and others still ask for a C compiler
– Error messages displayed on the Console. Quite basic messages, sometimes confusing, sometimes too brief
What is really missing is an embedded tutorial (or even a user’s manual of the Matlab style) that is updated with each Scilab release
Information on the Web Information on the Web
(1/2)(1/2) The main portal is Wiki Scilab, <http://wiki.scilab.org/Tutorials>,
were most of the accessible tutorials are listed Scilab’s forge <http://forge.scilab.org/> is a repository of “work in
progress,” many of which exist only in name. Its set of draft documents is valuable
Wiki Scilab’s HowTo page <http://wiki.scilab.org/howto> has some articles of interest
Free sites:– Scilab File Exchange website <http://fileexchange.scilab.org/>. A new
discussion forum managed by the Scilab team and “dedicated to easily exchange files, script, data, experiences, etc.”
– Google discussion group at <http://groups.google.com/group/ comp.soft-sys.math.scilab/topics>
– MathKB <http://www.mathkb.com/>. Contains, among other things, a Scilab discussion forum. Mostly advanced questions
– spoken-tutorial <http://spoken-tutorial.org/Study_Plans_Scilab/>. Screencasts under construction by IIT Bombay. Scilab basics
Information on the Web Information on the Web
(2/2)(2/2)– YouTube has some video clips on Scilab, but nothing really valuable – Equalis <http://www.equalis.com>. By registering you gain free access
to the discussion forum – <http://usingscilab.blogspot.com/> used to be a very good blog but is
now terminally ill. Worth checking the material that is still there– Scilab India <http://scilab.in/> is basically a mirror of Scilab Wiki, with
added obsolete material and a less active discussion forum
If you know German:– German technical colleges produce helpful basic tutorials on Scilab
(better than their French counterparts). Search the Internet e.g. using the terms “Scilab” + “Einführung” and limit the language option to German
Conclusion: A lot of resources have gone into producing the existing scattered documentation, but they have been uncoordinated and have produced little relative the input effort. Lousy management!
BooksBooks
There is not a single good textbook in English on Scilab like you find in abundance on Matlab. These are the books that I am familiar with:
• Beater, P.: Regelungstechnik und Simulationstechnik mit Scilab undModelica, Books on Demand GmbH, 2010. Basic control systems formechanical engineers. Scilab plays only a minor role in the book
• Das, V.V.: Programming in Scilab 4.1, New Age International, 2008.Reference manual with uninviting layout, obsolete functions, and no practical examples. Useless
• Chancelier, J.-P. et al.: Introduction á Scilab, Deuxième édition, Springer,2007. An intermediate/advanced textbook with some engineeringapplications. Approaching obsolescence
• Campbell, S.L. et al: Modeling and Simulation in Scilab/Scicos, Springer,2006. Based on Scilab 3.1, over half of the book is on Scicos. Of some use, but dull the way Springer and LaTeX make them
• Gomez, C. et al.: Engineering and Scientific Computing with Scilab,Birkhäuser, 1999. Often referred to but outdated and of no use
On updates & literatureOn updates & literature
Scilab evolves rapidly and one frequently encounters obsolete features. Functions are often declared obsolete, although Scilab still may support them, and other functions are removed altogether. There is obviously no collection of obsolete/removed functions and their current equivalents (if any).
The Scilab team is slow with information on major updates. For instance, the GUI interface is said to have been completely renewed with version 5.x, but so far the only (poor) GUI description that I have seen is for version 4.x. It’s almost three years now...
Rapid development is a reason to why the limited literature on Scilab is mostly obsolete, sometimes outright misleading. I got a hands-on experience with all the changes that had to be made to 5.1.1 scripts before they agreed to run on version 5.3.x (and not all do)
Learning Scilab can be frustrating to a person with limited previous programming experience. The biggest hurdles are:
Lack of handsLack of hands--on tutorialson tutorials for Englishfor English--speaking speaking newbiesnewbies. The . The situation is better, though not good, with some other languagessituation is better, though not good, with some other languages
Excessive number of Scilab functionsExcessive number of Scilab functions. There are some two thousand . There are some two thousand of them. There are often numerous options to select between; somof them. There are often numerous options to select between; some e of which work, some donof which work, some don’’t, some of which you know, most you dont, some of which you know, most you don’’tt
Unhelpful Help BrowserUnhelpful Help Browser. Even when you have a hunch of which . Even when you have a hunch of which function to use, you cannot get it right because of the Help Brofunction to use, you cannot get it right because of the Help Browserwser’’s s cryptic explanationcryptic explanation
Basic programming errorsBasic programming errors. Creating infinite loops, dividing by zero, . Creating infinite loops, dividing by zero, using * instead of .* , etc. We all make them, there is no way using * instead of .* , etc. We all make them, there is no way around them than by practicing. around them than by practicing. ““ÜÜbungbung machtmacht den Meister!den Meister!””
On the bright side...On the bright side...
ScilabScilab works! Despite my complaints it mainly does a fine jobworks! Despite my complaints it mainly does a fine job It is a great thing that it is given away for free to all of us It is a great thing that it is given away for free to all of us who who
cannot afford expensive commercial simulation toolscannot afford expensive commercial simulation tools It is a great thing that it is give away for free to all commercIt is a great thing that it is give away for free to all commercial and ial and
nonnon--commercial institutions that care about costcommercial institutions that care about cost--effectivenesseffectiveness It is a free gift (though with restrictions*) to science and engIt is a free gift (though with restrictions*) to science and engineering ineering
and deserves support of us who happily download whatever comes and deserves support of us who happily download whatever comes gratis on the Webgratis on the Web
It deserves support because It deserves support because ScilabScilab, like other open, like other open--source IT source IT solutions, faces an uphill struggle against vast commercial intesolutions, faces an uphill struggle against vast commercial interests rests and skeptical individualsand skeptical individuals
Long live the free and openLong live the free and open--source/access community!source/access community!
*) Scilab is released under the French CeCILL license. The question is, is it really a Free and Open-Source license that allows you to release a Scilab copy under a new name, the way OpenOffice was turned into LibreOffice?
Dr.EWJohnny Heikell
Dr.EWJohnny Heikell
2. A first peek at Scilab2. A first peek at Scilab
What you face when trying to get What you face when trying to get startedstarted——including including ““Scilab in 15 Scilab in 15 minutesminutes””
Return to Contents
Windows installation (1/3)Windows installation (1/3)
1. Download Scilab from www.scilab.org(Windows on the top, other OSs below)
2. The right operating system should be on top. Save the file, typically it goes to your own Downloads folder
Windows installation (2/3)Windows installation (2/3)
3. Scan the downloaded file for viruses
4. Double-click on the file to install Scilab, follow the prompts
Inside the Downloads file
Windows installation (3/3)Windows installation (3/3)
5. Scilab suggests that it should install all toolboxes (modules). Go for it unless you are really short of memory
6. Accept Scilab license terms (you have no option so why do they ask?). Click Next as many times as needed
7. You’re all set to use Scilab (no need to reboot the computer)
Note: Scilab does not uninstall an old version
Linux installationLinux installation
Click: Applications/Ubuntu Software Center/Science & Engineering and scroll down to Scilab; then just Click Install
Only Scilab 5.3.0 beta-2 is available at the repository
For the latest version you must go to Scilab's web site and download Linux binaries. The installation, however, is a trickier question and I do not cover it here (have not tried it)
This discussion is valid for Ubuntu 10.04 LTS with the GNOME desktop*
*) Ubuntu 11.04 with Unity has been released, but I have not gone for it
The Console The Console
Menu bar
Toolbar
Command prompt
If no shortcut icon has been created: Click: Start\All Programs\scilab\scilab (do not select Scilab Console)
Click on Scilab’s shortcut icon to open the Console (Command Window in Matlab*):
*) The Console has other names as well: Workspace, Startup/Main Window, etc.
Folks:Folks:
Here it comes, the lesson on MathCad that Jim gave me back in 1991, transformed to Scilab. A lecture worth gold in three slides
Scilab in 15 minutes Scilab in 15 minutes
(1/3): write a script(1/3): write a script
Recall how Jim taught me MathCAD in 15 minutes? Now we’ll repeat that lesson in Scilab. We do it by using the Editor (SciNotes):
Step 1: On the Console, Click the leftmost icon on the toolbar. The Editor pops up
Step 2: Define whatever variables your function needs (row 1). Note comment (//… )
Step 4: Finally, write the plot command (row 3)
Step 3: Next, define the (sine) function in case (row 2)
Scilab in 15 minutes Scilab in 15 minutes
(2/3): save and plot(2/3): save and plot
Step 6: Finish by running (executing) the script by a Click the Execute icon (a second one came with 5.3.2)
Step 7: Up pops the Graphics Window with the a plot of the defined equation
Did you have problems or get an error message on the Console? Don’t worry, we’ll return to everything later. Jump to Examples 1-1 & 1-2 if you are in a hurry.
Step 5: Save the script by Clicking on the Save icon and name it e.g. foo.sce
Scilab in 15 minutes Scilab in 15 minutes
(3/3): discussion(3/3): discussion
ScilabScilab’’s user interface consists of three main windows:s user interface consists of three main windows:–– The The ConsoleConsole, which pops up when Scilab is opened and on which , which pops up when Scilab is opened and on which
it outputs textual data (numeric answers, error messages, etc.)it outputs textual data (numeric answers, error messages, etc.)–– The The EditorEditor ((SciNotesSciNotes), which is the main tool for writing, saving, ), which is the main tool for writing, saving,
and executing scripts (programs)and executing scripts (programs)–– The The Graphics WindowGraphics Window, on which Scilab presents plots, on which Scilab presents plots
The recipe for using The recipe for using ScilabScilab is the one that Jim taught me:is the one that Jim taught me:– First you declare the variables that are needed– Then you define the function that you want to plot– And finally, plug in the plot instruction
This exercise showed the essentials of Scilab in engineering applications:
That was ScilabLet’s go pizza
The ConsoleThe Console’’s menu bar s menu bar
(1/6): File(1/6): FileAmong the functions under the File drop-down menu that you will quickly encounter are:
Execute...: From here you can run Scilab scripts (or from the Editor, as seen later)
Open…: Similar to the Open…command in MS Office programs
Change current directory…, Display current directory: Pay attention to those two, they will be needed to tell Scilab where to look for a script that you want to open
The ConsoleThe Console’’s menu bar s menu bar
(2/6): Edit(2/6): Edit
The functions under the Edit drop-down menu are self-explanatory.
The Cut, Copy, and Pastecommands have their own icons in the toolbar. You also find them by right-clicking on the PC mouse
Be careful with Empty clipboard. You may not be able to use Copyafter clicking it! (Happened to me)
I have used Select all a lot to copy-paste the demos in this presentation
The ConsoleThe Console’’s menu bar s menu bar
(3/6): Preferences(3/6): PreferencesThe functions under the Preferences drop-down menu are quite similar to what you can find on a PC
I can only guess that Clear History is similar to Clear Private Data in Firefox, but there is no Show Historyalternative and Help is not helpful
Clear Console empties the console. You achieve the same by pressing F2 Change visual appearance
of the Console
The ConsoleThe Console’’s menu bar s menu bar
(4/6): Control(4/6): Control
I did not need the Controldrop-down menu a single time while doing this presentation, so obviously it is not very useful
My guess would be that the Resume , Abort, and Interruptalternatives give the user a way to interfere with the execution of a program The Help Browser is not
very helpful and it does not even recognize the Interrupt command
The ConsoleThe Console’’s menu bar s menu bar
(5/6): Applications(5/6): Applications
SciNotes: Opens Scilab’s Text Editor (same as Launch SciNotes in the toolbar)
Xcos: Opens Xcos
Matlab to Scilab translator: Used to translate a Matlab .m-file to a Scilab .sci file
Atoms: Opens the onlinemodule manager
Variable Browser: Opens a list with variables (same as the browsevar; command)
Command History: Opens a list with commands used
The ConsoleThe Console’’s menu bar s menu bar
(6/6): Help alternatives(6/6): Help alternatives
Scilab Demonstrations: Shows demos with few comments (same command as the cogwheel in the toolbar). At least the GUI/Uicontrols 2 demo causes Scilab to crash
Scilab Help: Same as the question mark icon in the toolbar Scilab Web
resources
The ConsoleThe Console’’s toolbars toolbar
Launch Editor: Opens Scilab’s Editor (SciNotes, another part of its Integrated Development Environment (IDE). Basic tutorials seldom stress the fact that normally we work with (write, edit, save, run) executable Scilab scripts on the Editor, not on the Console. The Editor is presented a few slides below
Change Current Directory: It can also be found under Filein the menu bar. You need it to point out from which directory (folder) Scilab should search for a script that you want to execute (run)
The Atoms, Xcos, and Demonstrationsicons came with Scilab 5.2
The Help Browser (1/3)The Help Browser (1/3)
In the Console, Click on the Help Browser icon to open it
The Help Browser is a brief “encyclopedia” of Scilab’s main features and functions. Explanations of functions are augmented by examples (see next slide for a demo), but this does not compensate for a good tutorial
Help discussions become more readable if you print them as PDF files
The Help Browser (2/3)The Help Browser (2/3)
1. In the script box with examples, Click on the Execute icon to see how the scripts executes (not all work)
2. The Graphics Window with the plot pops up (in this cases it briefly flashes the first plot)
3. Click on the Editor icon and the script is transferred to Scilab’s text Editor where you can play with it (must be saved before it can be run)
The Help Browser (3/3):The Help Browser (3/3):
help help function_namefunction_nameTo find the proper use of any function—assuming that the name is known—the Help Browser can be opened from the Console by entering the command help function_namecommand, in the shown case help det() (the brackets can be omitted). The alternative is to open the Browser with theHelp icon
The Editor (The Editor (SciNotesSciNotes))
The (Text) Editor is where The (Text) Editor is where executable Scilab scripts are executable Scilab scripts are written, maintained & runwritten, maintained & run
Open the Editor by clicking Open the Editor by clicking on the on the Launch Launch SciNotesSciNotes icon icon in the Console, or by clicking: in the Console, or by clicking: ApplicationsApplications\\SciNotesSciNotes
A Scilab script is a text file A Scilab script is a text file with a name of the type with a name of the type *.*. scesce (the alternative (the alternative *.*. scisci is also used but is also used but *.*. scesce is the default)is the default)
It is good practice to use It is good practice to use scripts also for small tasks.scripts also for small tasks.Then all Then all ““projectsprojects”” are saved are saved and commented, ready for and commented, ready for reusereuse
But don’t forget to create a properly organized archive for your programs!
ExecuteSave & execute
Editor menu bar (1/5): Editor menu bar (1/5):
FileFile
Recent filesRecent files gives quick access to gives quick access to recently edited scriptsrecently edited scripts
NewNew opens a second tab for a opens a second tab for a new script to be editednew script to be edited
OpenOpen opens a saved script into opens a saved script into the Editorthe Editor
Open file in...Open file in... and and Save file in...Save file in...do not workdo not work in Scilab 5.3in Scilab 5.3
PrintPrint is an ordinary print is an ordinary print commandcommand
CloseClose closes the file in casecloses the file in case
File commands that you are most likely to run into:
Commands under Edit are mostly self-explanatory. Note however the following four:
Shift Right/Left: Indent/unindent a row by one step (this pair should be on the toolbar)
Comment/Uncomment Selection: Add/delete a comment
Editor menu bar (2/5):Editor menu bar (2/5):
EditEdit
The Preferences drop-down menu allows you adjust Editor settings to your liking
I had difficulties reading scripts on the Editor (poor contrast with default settings) and used Set Colors... and Set Font to change from default values
Editor menu bar (3/5):Editor menu bar (3/5):
PreferencesPreferences
Users can send bug reports to Scilab’s development team (link at <www.scilab.org>). I filed the following report (Bug 8802):
“Default color settings on the Editor produce poor contrast ... Changing font colors is tedious due to the excessive number of options under Preferences\Set colors... (an overkill, you could say). I would suggest default settings with just four colors (red, green, blue and black). ”
To which I got this answer:
“You can modify more easily the colors configuration in modifying the file: C:\Documents and Settings\Johnny\Application Data\Scilab\scilab-5.3\scinotesConfiguration.xml (or a path which is similar) ”
I found scinotesConfiguration.xml under C:\Program Files\scilab-5.3\modules\scinotes\etc\. XML color codes must be changed in this file. I wish you good luck
Editor menu bar (4/5):Editor menu bar (4/5):
Preferences, commentPreferences, comment
The Execute drop-down window contains three options:
... file with no echo: A simple execute command (same as clicking the Execute icon on the toolbar)
... file with echo: Executes the script and echoes it (shows it) on the Console
... until the caret, with echo: Beats me, what it means
Editor menu bar (5/5):Editor menu bar (5/5):
ExecuteExecute
The Execute commands used to be simpler. I have no idea why they changed them this way. My recommendation is to use the Execute icon on the toolbar (see next slide)
Editor toolbarEditor toolbar
New... Opens a second tab for a new script to be edited (the same command can be found under File)
The Save icon looks like the Dutch tricolor, but you’ll get used to it. The next one is Save as...
The Undo/Redo arrows are quite normal
The Paste icon is a bit unusual (French?)
The Execute (or Save & execute) icon is what you normally use to run a script
Ready to goReady to go
Your desktop should now look something like the one here. As we have seen, both the Editor and the Console are needed since when the scripts—created on the Editor—are executed numeric outputs is returned to the Console
Console (command window)
Editor (SciNotes)
One more thing (1/2):One more thing (1/2):
docking windowsdocking windows It is possible to It is possible to dock dock Scilab windows; i.e., to form a unified Scilab windows; i.e., to form a unified
workspace similar to the one in workspace similar to the one in MatlabMatlab. Here is how to do it:. Here is how to do it:
Console Editor
Press the left mouse button on the darkened bar of an active window, drag over another window and release. The next page shows one case
One more thing (2/2):One more thing (2/2):
docking windowsdocking windows
Console Editor
Help BrowserGraphics Window
Each window part has an arrow in the upper right-hand corner, by which you can release it from docking
On scripts and functionsOn scripts and functions
Scilab has two command types:Scilab has two command types:–– ScriptsScripts. A set of commands used to automate computing. Script . A set of commands used to automate computing. Script
commands are normally returned to the Console, but plots are commands are normally returned to the Console, but plots are returned to the Graphics Windowreturned to the Graphics Window
–– FunctionsFunctions (macros). Short programs that interface with the (macros). Short programs that interface with the environment through input and output variables. A list of environment through input and output variables. A list of common common builtbuilt--in functionsin functions is given on the next slide. Functions is given on the next slide. Functions defined by the user can either be local (integrated in a script)defined by the user can either be local (integrated in a script) or or global (stored as a separate file and accessible to any script)global (stored as a separate file and accessible to any script)
–– I may use the term I may use the term ““codecode”” to make general references to either to make general references to either scripts or functionsscripts or functions
As was already saidAs was already said——and will repeatedand will repeated——one should rather one should rather create scripts and functions on the (Text) Editor (create scripts and functions on the (Text) Editor (SciNotesSciNotes))
BuiltBuilt--in functionsin functions
Below is a list of common math functions in Scilab. A full list of built-in functions can be found under Help\Elementary Functions, which also explains requirements on arguments (there are both mandatory and optional arguments).
Square root, e.g. sqrt(2) / exponentsqrt(), exp()
Sum sum()
Minimum / maximum valuemin(), max()
Absolute value, e.g. abs(sinc(x)) / signabs(), sign()
Real & imaginary parts of a complex freal(f), imag(f)
The pair of left/ right parenthesis is used for various purposes()
Vector or matrix definition concatenation, transposed matrix[] , [] '
End of expression, row separatorEnd of expression, row separator;
*) Both simple (') and double (") quotes are allowed to define character strings
Scilab operators (2/2)Scilab operators (2/2)
Right division, element-by-element right division/ , ./
Left division, element-by element left division\ , .\
KroneckerKroneckerright and left divisionright and left division./. , .\.
Power (exponent), elementPower (exponent), element--byby--element powerelement power^ or ** , .^
KroneckerKroneckerproductproduct.*.
Logical NOT~
Equal to, equal or greater than, equal or less than, greater than, less than, not equal to (two alternatives)
==, >=, <=, >, <,< >, ~=
Logical AND&
Logical ORLogical OR|
Computing terminology: Computing terminology:
a brief introductiona brief introduction
ArgumentsArguments: Values provided as inputs to a command (input : Values provided as inputs to a command (input arguments) or returned by the command (output arguments)arguments) or returned by the command (output arguments)
CommandCommand: A user: A user--written statement that provides instructions to the written statement that provides instructions to the computer (computer (““statementstatement”” is an often used alternative)is an often used alternative)
DefaultDefault: Action taken or value chosen if none has been provided: Action taken or value chosen if none has been provided DisplayDisplay: To output a listing of text information on the computer : To output a listing of text information on the computer
screenscreen EchoEcho: To display commands or other input typed by the user: To display commands or other input typed by the user ExecuteExecute: To run a program or carry out the instructions specified in a : To run a program or carry out the instructions specified in a
commandcommand PrintPrint: To output information on a computer printer (often confused : To output information on a computer printer (often confused
with with ““displaydisplay””)) ReturnsReturns: Results provided by the computer in response to a : Results provided by the computer in response to a
commandcommand
On On ““handleshandles””
In graphics software the word handle refersIn graphics software the word handle refersto the points placed around a figure or plotto the points placed around a figure or plotthat allow you to manipulate the objectthat allow you to manipulate the object(see figure)(see figure)
A A MatlabMatlab tutorial gives the following explanation that is also valid fortutorial gives the following explanation that is also valid forScilab: Scilab: ““Whenever Whenever MatlabMatlab creates a graphics object, it assigns an creates a graphics object, it assigns an identifier (called identifier (called handlehandle) to it. You can use this handle to access the ) to it. You can use this handle to access the objectobject’’s properties.s properties.””
You need handles to edit graphical plots beyond the means offereYou need handles to edit graphical plots beyond the means offered d by basic plot functions (by basic plot functions (plot2d()plot2d(), , plot3d()plot3d(),, etc.) etc.)
WeWe’’ll return handles when discussing ll return handles when discussing graphics & plotting (Ch. 7)graphics & plotting (Ch. 7)
You will often see ScilabYou will often see Scilab’’s Help Browser refer to a s Help Browser refer to a ““handle,handle,”” but but Help does not provide a helpful explanation of the term. Here isHelp does not provide a helpful explanation of the term. Here is a a brief account:brief account:
Check handlesCheck handles
with with gcfgcf()() The function The function plot2d()plot2d()
produces the plot belowproduces the plot below The command The command gcfgcf()() gives gives
the list to the rightthe list to the right The list is the handle for the The list is the handle for the
defined function (Scilab defined function (Scilab literature also refers to literature also refers to individual rows in the list by individual rows in the list by the term the term ““handlehandle””))
The term The term ““foofoo”” is used in many tutorials. It may be confusing is used in many tutorials. It may be confusing if you are not intimately familiar with programmingif you are not intimately familiar with programming
Simply stated, Simply stated, foofoo can be interpreted as can be interpreted as ““something comes something comes here.here.”” The professional expression is The professional expression is placeholder nameplaceholder name, also , also referred to as referred to as metasyntactic variablemetasyntactic variable
Example:Example:
Alternative placeholder names that you may come across are Alternative placeholder names that you may come across are foobarfoobar, , barbar, and , and bazbaz. I prefer to use dots (....). I prefer to use dots (....)
for k = 1:2:nfoo;
end
Dr.EWJohnny Heikell
Dr.EWJohnny Heikell
3. Playing with the 3. Playing with the
Console & EditorConsole & Editor
Those awkward first steps; a bit Those awkward first steps; a bit about what Scilab doesabout what Scilab does
Return to Contents
Console keyboard Console keyboard
shortcutsshortcuts
In the Help Browser, Click: Console/consolefor a list of keyboard shortcuts
Keyboard shortcuts allow speedier execution of commands, but require frequent use to stay memorized
The simplest ones to memorize are:F1 = Open Help BrowserF2 = Clear Console
Simple calculationsSimple calculations
The Console can be used as a calculator by writing arithmetic expressions after the command prompt and pressing Enter
If no variable name is given, Scilab uses the inbuilt variable ans
When a variable name is given (here alpha) it will be used instead. π is an inbuilt variable (constant) represented by %pi
Expressions can be written on the same line by separating them with a comma (the warning can be ignored)
Scilab displays an executed command unless it ends with a semicolon (;)
List of variables (1/2)List of variables (1/2)
The command who (+ Enter) produces a list of some Scilab variables. At least on my Windows Vista laptop the columns are right aligned (French logic or a bug?). Note that variables from the previous example are displayed
List of variables (2/2)List of variables (2/2)
The command browsevaropens the Variable Browser window (it used to be called Browser Variables, thus the command browsevar)
The list that pops up gives information about the type and size of each variable
Recall that the Variable Browser also can be called via the menu bar: Applications/Variable Browser
Entering numbersEntering numbers
Scilab allows numbers to be entered in different ways, as shown in this example
Some expressions have alternate forms. For instance, there are three power expressions (^), (**) and (.^), but Scilab picks them in that calling order
Note that e and π are given with seven decimals, which puts limits to the achievable accuracy (a function for double precisiondoes exist)
Consult Help if you need to change the display format
Note: From now on I’ll show only the contents of the Console (on light yellow background)
-->0.1, 1e-1, 2^3, exp(1), %pi ans = 0.1 ans = 0.1 ans = 8. ans = 2.7182818 %pi = 3.1415927
Computing precision Computing precision
(1/2)(1/2)Look at the two examples to the left. In both cases we are computing 1-5*0.2, but in two different ways
In the first case the answer is correct (0)
In the second case the answer is 5.55*10-17, which quite obviously is incorrect
The reason is that numeric computing has finite precision(rounding errors)
We must take this limitation into account in Scilab simulations
-->a = 1 - 5*0.2 a = 0.
-->b = 1 - .2 - .2 - .2 - .2 - .2 b = 5.551D-17
-->a = sin(%pi) a = 1.225D-16 -->0.1 == 1.0 - 0.9 ans = F
Computing precision Computing precision
(2/2)(2/2)
Here are two more cases where finite precision shows up. The answers should be 0 (zero) and T (True) respectively (Note that 1.225D-15, 1.225e-16, 1.225*10^-16 and 1.225*10-16
express the same thing)
Assume that the mentioned variable a is part of a script with an if...then...else...end structure (conditional branching will be covered in Chapter 11). The result is that alternative 1 is never executed because a is never exactly zero
We must test a with some finite bounds, e.g.:
if abs (a ) < 1e- 6 then......
fooif a == 0 then
alternative 1else
alternative 2end
|a| < 10-6
Displaying graphicsDisplaying graphics
The Console can also be used to give commands for plotting graphics:
The graphical picture is plotted in the Graphics Window that pops up automatically (more in Ex. 1)
The meaning of the entered code will become clear as we proceed
Suppose we make a mistake when Suppose we make a mistake when entering the command line and entering the command line and Scilab returns an error messageScilab returns an error message
Instead of retyping the whole line, Instead of retyping the whole line, we can press the up arrow ( ) on we can press the up arrow ( ) on the keyboard to return the line the keyboard to return the line and correct the mistakeand correct the mistake
In the shown example the In the shown example the function for the square root, function for the square root, sqrtsqrt()(), , was first erroneously typed was first erroneously typed sqtsqt ()()
Note that this is just one of Note that this is just one of several alternatives for command several alternatives for command line editingline editing
|
-->a = 2; b = sqt(a)
!--error 4 Undefined variable: sqt
-->a = 2; b = sqrt(a) b = 1.4142136
-->a = 2; b = sqt(a)
| Press uparrow
Correct
Editing demoEditing demo
Evaluate the function
log(s2 – 2s·cos(π/5) + 1)
for s = 0.5, 0.95, and 1
Do not rewrite the function, use instead the up arrow to edit previous commands!
-->s=.5; log(s^2-2*s*cos(%pi/5)+1)ans =
- 0.8187489
-->s=.95; log(s^2-2*s*cos(%pi/5)+1) ans =
- 1.006851
-->s=1; log(s^2-2*s*cos(%pi/5)+1)ans =
- 0.9624237
Complex numbersComplex numbers
Scilab handles complex numbers as easily as real numbers
The variable %i stands for √-1
The first example shows how Scilab evaluates some functions with the complex argument x = 2 + 3i
An imaginary sin() argument produces a result!
The second example shows how Scilab does arithmetic operations with two complex equations, x and y
-->x = 2 + 3*%i; -->abs(x) ans = 3.6055513 -->real(x) ans = 2. -->imag(x) ans = 3. -->sin(x) ans = 9.1544991 - 4.168907i -->atan( imag(x), real(x) ) ans = 0.9827937
-->x = 2 + 3*%i; y = 1 - 1*%i; -->z1 = x –yz1 =
1. + 4.i
-->z2 = x * yz2 =
5. + i
-->z3 = x / yz3 =
- 0.5 + 2.5i
VectorizedVectorized functionsfunctions
Scilab functions are vectorized, meaning that functions can be called with vectorialarguments
In the shown example, first a column vector called t is created
Next the vector is used as argument in the sin() function, in the expression for y
If the values of t are of no interest, the printout can be avoided by putting a semicolon after the expression for t:
t = [0:5]’; y = sin(0.2*t)
Vectors will be discussed in connection Vectors will be discussed in connection with matrices in with matrices in Chapter 5Chapter 5
Long command expressions Long command expressions can be divided among two or can be divided among two or more linesmore lines
One tool for that purpose is One tool for that purpose is two or three periodstwo or three periods (..) to (..) to indicate that the statement indicate that the statement continues continues
Long matrix expressions can Long matrix expressions can be written on separate lines be written on separate lines by omitting the semicolon that by omitting the semicolon that normally ends a row (bottom)normally ends a row (bottom)
-->p=1+2+3+4+5+6+7+8+9+10+11+12+...-->13+14+15+16+17+18+18+19+21+22+23+24+25 p =
You run into polynomials e.g. if you You run into polynomials e.g. if you use frequency domain (stateuse frequency domain (state--space) space) analysis in control engineeringanalysis in control engineering
Here Here s = %ss = %s is the is the seedseed that defines that defines the polynomial of the polynomial of ““ss””. An alternative, . An alternative, often used form of the seed often used form of the seed definition is definition is s = (0,s = (0,’’ss’’))
The polynomials can be defined The polynomials can be defined through their root vectorsthrough their root vectors
Scilab translates the roots to their Scilab translates the roots to their respective polynomialsrespective polynomials
When we divide the When we divide the numnum polynomial polynomial by the by the denden polynomial, Scilab polynomial, Scilab presents the full polynomial presents the full polynomial expressionexpression
-->s=%s; -->x=roots(2*s+3*s^2+s^3) x = 0 - 1. - 2.
Determining roots (zeros) of Determining roots (zeros) of polynomials can be a tedious polynomials can be a tedious undertakingundertaking
However, Scilab has a handy However, Scilab has a handy tool for the task in the form of tool for the task in the form of the the roots()roots() functionfunction
To the right the polynomials To the right the polynomials on the previous slide have on the previous slide have been determinedbeen determined
Note that the seed Note that the seed s=%ss=%s has has to be defined here as wellto be defined here as well
Poles and zeros: Poles and zeros: plzrplzr()()
The The plzrplzr()() function function plots the poles and plots the poles and zeros of a polynomialzeros of a polynomial
The The syslinsyslin()() function function used here will be used here will be discussed laterdiscussed later
When pressing When pressing EnterEnterafter the after the plzr(sysplzr(sys))command, the command, the Graphics Window Graphics Window opens and displays the opens and displays the plot (The Graphics plot (The Graphics Window will be Window will be discussed in discussed in Example Example 11--11))
Another gadget is a puzzle that can be found under Demonstrations\Tcl/Tk\Puzzle
Scilab the spy: Scilab the spy:
historymanagerhistorymanager
Software that we install on our computers tend to spy on us by collecting information on what we do. Have you ever cared to figure out how much data e.g. Windows’index.dat has stored about your computer & surfing behavior?
Scilab spies with (at least) its history manager. You can access this data by entering displayhistory() on the Console. The file can be cleaned via Preferences\Clear History
Sorry,I could not copy-paste an extract because PowerPoint crashed repeatedly (it happens to Bill Gates as well… Often.)
Dr.EWJohnny Heikell
Dr.EWJohnny Heikell
4. Examples, Set 1 4. Examples, Set 1
Demonstration of basic Scilab Demonstration of basic Scilab programsprograms
Return to Contents
Example 1Example 1--1: script for a 1: script for a
simple plotsimple plot
LetLet’’s elaborate on the s elaborate on the example from example from ““Scilab in 15 Scilab in 15 minutesminutes””
We work with the Editor We work with the Editor using the same script as using the same script as before, but with added before, but with added commentscomments
Save the function when it Save the function when it has been typed in. I call it has been typed in. I call it plot1.sceplot1.sce and have saved it and have saved it on my USB thumb drive, on my USB thumb drive, you can save it wherever you can save it wherever you likeyou like
To run the script, Click on To run the script, Click on the Editorthe Editor’’s s Execute Execute iconicon
What happens is shown on What happens is shown on the next slidethe next slide
Note: Comments begin with a double slash (//). Scilab disregards everything behind the // when it executes the code
// plot1.sce
// A simple 2D plot of a sine function / // with the abscissa x = 0 ... 10, / // and amplitude A = increases with x / // The function itself is y(x) /
x = [0:.1:10]; // The abscissa x is a row vector A = 0.5*x; // Modulated amplitude, row vectory = A.*sin(2*x); // Element-by-element multiplication plot(y) // Plot command
Ex 1Ex 1--1: the Graphics 1: the Graphics
WindowWindow
As seen before, Scilab uses a third window, the Graphics Window, to present the plot
Information on the executed script is echoed to the Console. Error messagesare also displayed on the Console These three are the windows that we mainly work
with, but there are more. You have already seen a few like the Help Browser and Variable Browser
Ex 1Ex 1--1: using the Console1: using the Console
The script could also be The script could also be executed from the Consoleexecuted from the Console
After the command prompt, After the command prompt, typetype
exec plot1.sceexec plot1.sce
And the result is an And the result is an error error messagemessage
The reason? The reason? Scilab looks for Scilab looks for plot1.sce in the wrong placeplot1.sce in the wrong place
To see where Scilab was To see where Scilab was looking, Click: looking, Click: FileFile\\Display Display current directorycurrent directory
The answer is shown in the The answer is shown in the lower window: It looks in lower window: It looks in ScilabScilab’’s program file, which s program file, which is not where I put itis not where I put it
Ex 1Ex 1--1: change directory1: change directory
Click on the icon Click on the icon Change Change current directory...current directory...
A new window pops upA new window pops up Define the right file with Define the right file with
the dropthe drop--down menudown menu Click: Click: OpenOpen
You can then return to the You can then return to the Console and type in the Console and type in the commandcommand
exec plot1.sceexec plot1.sce
And it works, as seen on And it works, as seen on the next slidethe next slide
Note: The command chdir()allows the directory to be changed “on the run”
Ex 1Ex 1--1: plot and echo1: plot and echo
Up pops the Graphics Window with a plot of the defined function...
while the script is echoed to the Command Window (Console)
// plot1.sce
// A simple 2D plot of a sine function / // with the abscissa x = 0 ... 10, / // and amplitude A = increases with x / // The function itself is y(x) /
x = [0:.1:10]; // The abscissa x is a row vectorA = 0.5*x; // Modulated amplitude, row vectory = A.*sin(2*x); // Element-by-element multiplicationplot(y) // Plot command
at line 10 of exec file called by : exec('H:\Dr.EW\Writings\Scilab examples\plot1.sce', -1)
-->
Ex 1Ex 1--1: comments (1/4), 1: comments (1/4),
command detailscommand details
The vector definition The vector definition xx=[0:0.1:10]=[0:0.1:10] can be can be interpreted as interpreted as ““from 0 to from 0 to 10 in steps of 0.110 in steps of 0.1””
Multiplication by theMultiplication by the Dot Dot OperatorOperator (.*) is necessary (.*) is necessary to tell Scilab it should to tell Scilab it should multiply the vectors multiply the vectors elementelement--byby--element. element. Change to ordinary Change to ordinary multiplication (*) and youmultiplication (*) and you’’ll ll get this get this error messageerror message on on the Consolethe Console
Editor contents will from now on be shown on light green background
Ex 1Ex 1--1: comments (2/3), 1: comments (2/3),
the plotthe plot
The plot is very basic as it has no title, axis labels, or grid. We’ll return to them in the next example
The abscissa scale may seem strange, the maximum value for x was 10 but the scale goes to 100. The figure 100 is actually the number of calculations, since they were made in steps of 0.1 up to 10. Try to change t to x=[0:0.2:10]; and you’ll see that the scale ends at 50 (the modified script must be saved before it can be run)
Ex 1Ex 1--1: comments (3/4), 1: comments (3/4),
clfclf
Assume that we make a change to the script, e.g. increase the frequency to sin(5*s), save it, and execute it immediately after a previous run
As a result Scilab plots the new graph on top of the previous one. To avoid this we must either
• Close the Graphics Windowmanually after each run, or
• Add the function clf (clear figure) to the script to makeScilab clean the window
clf; x = [0:.1:10]; A = 0.5*x; y = A.*sin(5*x); plot(y)
// plot1.sce
// A simple 2D plot of a sine function / // with the abscissa x = 0 ... 10, / // and amplitude A = increases with x / // The function itself is y(x) /
clear, clc, clf;x = [0:.1:10]; // The abscissa x is a row vectorA = 0.5*x; // Modulated amplitude, row vectory = A.*sin(2*x); // Element-by-element multiplicationplot(y) // Plot command
Ex 1Ex 1--1: comments (4/4), 1: comments (4/4),
cleaning trashcleaning trashSome programmers prefer to safeguard against different forms of old junk that may interfere with the execution of the script. To do this, three commands are added at the beginning of the script:
• clear, removes items fromthe workspace and freesmemory*
• clc, cleans the Console; the echo signal is mainly erased
• clf, wipes an open GraphicsWindow
Thus our final script looks like this. Pay attention to the semicolon (;) at the end of each expression apart from the last
*) Careful with clear, it may cause havoc in some cases (there will be a demo on this later)
Example 1Example 1--2: the task, a 2: the task, a
decaying linear chirpdecaying linear chirp Write the script for a linearly frequency modulated sinusoidal
signal s(t), i.e. a linear chirp of the type
s(t) = A(t) · sin [2π(f0 + k(t)t] + ϕ
where k is the rate of frequency change, or chirp rate Use 2.5 periods of the basic frequency The amplitude should decay exponentially, A(t) = 2e-t/3
The initial phase shift ϕ shall be π/4 Plot and print the result with a plotting method that differs
from the previous one The plot shall have grid, title, and axis labels
Plug in the commands plot(), histplot(), surf(), and plot3d() on the Console to view examples of Scilab plots. See also Chapter 7.
// f-modulation1.sce /
// Plots a sinusoidal function of the type /// s = A(t)(sin(wt+x(t)+phi)), where w = angular /// velocity, x(t) = frequency modulation, phi = /// phase shift, and A(t) = amplitude /
The The linspacelinspace()() function creates function creates a linearly space plotting vector a linearly space plotting vector with the arguments with the arguments fromfrom, , toto, , number of pointsnumber of points. The default . The default value is 100 points, but more are value is 100 points, but more are needed hereneeded here
Here is the Dot Operator (.*) Here is the Dot Operator (.*) againagain
The The plot2d()plot2d() produces the 2D produces the 2D plot. The arguments plot. The arguments tt and and ssstands for the x and ystands for the x and y--axes, the axes, the number number 55 produces a red graphproduces a red graph
Note: fin is used as the end of plot variable name because end is reserved (Scilab keyword)
Ex 1Ex 1--2: plot2: plot
The plot looks as expected—including the initial phase shift—but it lacks a grid, title, and axis labels
plot2d() is a more versatile function than plot(), which is similar to the plotfunction in Matlab
Ex 1Ex 1--2: improved plot2: improved plot
// f-modulation2.sce
// Plots a sinusoidal function of the type /// s = A(t)(sin(wt+x(t)+phi)), where w = angular /// velocity, x(t) = frequency modulation, phi = /// phase shift, and A(t) = amplitude /
Here I have added code to plot the grid, xgrid(),title, xtitle(),and x and y labels, xlabel(),ylabel().Crude, but it works
Ex 1Ex 1--2: 2:
printingprinting ScilabScilab’’s windows (Console, Editor, s windows (Console, Editor,
Graphics Window) all have both Graphics Window) all have both normal and advanced print functionsnormal and advanced print functions
One way of getting a coherent One way of getting a coherent printable document is to copy the printable document is to copy the contents of the windows and paste contents of the windows and paste them into a word processing page them into a word processing page (Scilab supports (Scilab supports LaTeXLaTeX))
The image shown here was done on The image shown here was done on MS Word (MS Word (OOoOOo Writer did not Writer did not recognize Scilabrecognize Scilab’’s file type). It was s file type). It was then printed as .PDF, saved as a then printed as .PDF, saved as a .PNG file, and finally cropped with .PNG file, and finally cropped with MS Picture ManagerMS Picture Manager
ThatThat’’s a tedious method. Consult s a tedious method. Consult HelpHelp for advanced print featuresfor advanced print features
// f-modulation3.sce /
// Plots a sinusoidal function of the type / // s = A(t)(sin(wt+x(t)+phi)), where w = angular / // velocity, x(t) = frequency modulation, phi = / // phase shift, and A(t) = amplitude. Second / // plot for momentary frequency values /
clear, clc, clf; f = 1; // Frequencyw = 2*%pi*f; phi = %pi/4; // Initial phase shiftfin = (4*%pi)/w; // End of plott = linspace(0,fin,1000); A = 2*exp(-t); s = A.*sin(w*t + 10*t^2 + phi); f_mom = f + 10*t; // Momentary frequencyplot(t,s,'r',t,f_mom,'b') xgrid() xtitle('SINUSOIDAL PLOT','t') legend('s','f_mom',2)
Ex 1Ex 1--2: checking2: checking
To show that the frequency is To show that the frequency is linearly modulated, we can linearly modulated, we can add frequency as a function add frequency as a function of t to the plotof t to the plot
For that we add the function For that we add the function f_momf_mom to the scriptto the script
The plot command must also The plot command must also be modified. Webe modified. We–– shift back to the shift back to the plot()plot()
command and include both command and include both parameters, together with parameters, together with color information (color information (‘‘rr’’, , ‘‘bb’’))
–– fuse xfuse x--label label ‘‘tt’’ as an as an argument of argument of xtitlextitle()()
–– swap yswap y--label for label for legend()legend();;the argument 2 refers to the the argument 2 refers to the upper left hand cornerupper left hand corner
Ex 1Ex 1--2: final plot2: final plot
OK, not an optimal plot but the information is there.
With the big differences in vertical scales, we should either use logarithmic y axis or separate the two into subplots—but that comes later
Pay attention to the legend
Ex 1Ex 1--2: discussion2: discussion
As was said earlier, Scilab evolves with time and approaches As was said earlier, Scilab evolves with time and approaches MatlabMatlab with each releasewith each release
As an example in case, ScilabAs an example in case, Scilab’’s s Help BrowserHelp Browser recognizes the recognizes the xlabelxlabel()() and and ylabelylabel()() that I used in the improved plot as that I used in the improved plot as MatlabMatlab functionsfunctions and also refers to them as Scilab functionsand also refers to them as Scilab functions
However, there are plenty of However, there are plenty of obsolete Scilab functionsobsolete Scilab functions and and you find them all over if you rely on old tutorials. Even Scilabyou find them all over if you rely on old tutorials. Even Scilab’’s s Help BrowserHelp Browser may refer to themmay refer to them
Be careful, particularly if a function name begins with Be careful, particularly if a function name begins with xx-- ((cf. cf. note in Chapter 7note in Chapter 7) )
You may have noticed that I begin the script with You may have noticed that I begin the script with a comment a comment stating the name of the scriptstating the name of the script (e.g. (e.g. // f// f--modulation3.scemodulation3.sce //). I ). I do this to help identify the script when I am looking at a do this to help identify the script when I am looking at a printout printout
Example 1Example 1--3: Lotto, the 3: Lotto, the
tasktask
The first part of this example is borrowed from Mäkelä’s tutorial
Task 1: Create a user defined function (UDF) that draws a row of Lotto numbers. Assume that the Lotto row contains 7 numbers, 1-39
Task 2: Write a script that calls the previous function (or a modification of it, if necessary) and produces a plot of it to visually indicate if the function produces random numbers. Generate 10,000 draws for the task
function lotto
//-----------------------------------------------------------------/ // The function draws 7 Lotto numbers [1,39] by first / // creating a seed using current date and time / // (second, millisecond) information ///----------------------------------------------------------------/
dt=getdate(); // Pick current daterand('seed',1000*dt(9)+dt(10)); // Initialize random generatornumbers=floor(1+39*rand(1,7)); // Draw Lotto rowwhile(length(unique(numbers))<7) // If number repeats in row,
numbers=floor(1+39*rand(1,7)); // then drawn a new rowendnumbers=gsort(numbers); // Sort numbers in decreasing orderdisp(numbers(7:-1:1)); // Display in increasing orderendfunction
rand(rand(‘‘seedseed’’,n,n)) sets sets the random genethe random gene--ratorrator seed to nseed to n
dt(9)dt(9) returns a returns a number between 00 number between 00 and 59, and 59, dt(10)dt(10)returns milliseconds returns milliseconds 000000……999999
The The while...endwhile...endconstruct will be construct will be covered under the covered under the discussion belowdiscussion below
Why the hassle with the seed? Without it Scilab generates the same sequence for each session. The 1000*t(9)+ dt(10) argument improves randomness.
Function ID, not a comment
Ex 1Ex 1--3: task 1, saving3: task 1, saving
This script This script (function) differs a (function) differs a bit from the earlier bit from the earlier ones, so letones, so let’’s go s go through the save through the save operation:operation:
Save the script as Save the script as lotto.scilotto.sci in your in your preferred filepreferred file
Next, Click on the Next, Click on the ExecuteExecute icon of icon of the Editor to the Editor to loadloadthe saved file into the saved file into ScilabScilab
Continues on next slide…
Ex 1Ex 1--3: task 1, running3: task 1, running
Execute (run) the Execute (run) the loaded function by loaded function by entering the function entering the function name on the Consolename on the Console
. Use funcprot(0) to avoid this message -->help funcprot -->lotto 3. 5. 13. 15. 33. 37. 39.
And the winning And the winning numbers are...numbers are...
If the Console shows a If the Console shows a warningwarning, check with , check with HelpHelpwhat it means. It can be what it means. It can be ignored or the ignored or the funcprot(0)funcprot(0)command can be added to command can be added to the script to avoid the the script to avoid the warning. You can also jump warning. You can also jump to to Chapter 18 Chapter 18 for a brief for a brief explanationexplanation
Ex 1Ex 1--3: task 1, discussion3: task 1, discussion
This is already an intermediate level This is already an intermediate level programming exercise. Donprogramming exercise. Don’’t worry if t worry if it gives you problems. Most of its it gives you problems. Most of its details will be repeated laterdetails will be repeated later
The flowchart of the The flowchart of the while...endwhile...endconstruct is shown to the right. Pay construct is shown to the right. Pay attention to the elegant solution for attention to the elegant solution for testing uniqueness of the numbers:testing uniqueness of the numbers:
However, in theory it could become However, in theory it could become an almost infinite loopan almost infinite loop……
WeWe’’ll return to ll return to while ... endwhile ... end loops in loops in Chapter 11Chapter 11
Draw new row
Draw Lotto row
All numbersunique?
Sort numbers
N
Y
Ex 1Ex 1--3: task 2, script 3: task 2, script
(1/2)(1/2)
The previous UDF must The previous UDF must be modified if it is be modified if it is called by a separate called by a separate code: 1) Delete sorting code: 1) Delete sorting and display and 2) and display and 2) redefine the function redefine the function ID to allow callingID to allow calling
In the latter case it has In the latter case it has one or more one or more input input argumentsarguments (in) that are (in) that are given to it by the given to it by the calling command and calling command and output argumentsoutput arguments [out] [out] by which it returns the by which it returns the result of its calculations result of its calculations to the calling command to the calling command (see next slide)(see next slide)
// lotto2.sce
//-----------------------------------------------------------------------/ // The script asks for the number of Lotto draws that we / // wish to do, using a separate dialog box. It then calls / // the local UDF lottodraw()) that generates a row of N / // random Lotto numbers in the range [1,39]. It sorts the / // numbers into a vector by adding one (1) to the relevant / // vector element for each corresponding hit. The result / // is plotted after the entered number of draws. / //-----------------------------------------------------------------------/
clear,clc,clf;
// (SUBROUTINE) function lottodraw()://-----------------------------------------------------
// The function draws N Lotto numbers [1,39], with / // N being defined through the input argument in. / // It delivers the drawn row to the calling script / // command through the output argument out. The / // randomness of the drawn numbers is improved by / // first creating a seed using current date and /// time (second, millisecond) information. /
Ex 1Ex 1--3: task 2, script 3: task 2, script
(2/2)(2/2)
Redefined function Redefined function (subroutine)(subroutine)
The number of Lotto The number of Lotto draws that we are draws that we are looking for is entered looking for is entered via a separate dialog via a separate dialog box box x_dialogx_dialog()()
The drawn Lotto The drawn Lotto numbers are collected numbers are collected in the in the columnscolumns vector vector inside the inside the for ... endfor ... endlooploop
The result is plotted as The result is plotted as step functionsstep functions
function out=lottodraw(in) dt=getdate(); // Pick current date rand('seed',1000*dt(9)+dt(10)); // Initialize random generatorout = floor(1+39*rand(1,in)); // Draw Lotto row (out variable)while(length(unique(out))<in) // If number repeats in row,
out = floor(1+39*rand(1,in)); // then a new row is drawnend
endfunction
// (MAIN) Call subroutine, update histogram, plot://-------------------------------------------------------------------M = evstr(x_dialog('Enter # of... // Open dialog box lotto draws ','')); N = 7; // Lotto numbers to drawcolumns = zeros(1,39); // Initiate collecting vectorfor k = 1:M
numbers = lottodraw(N); // Call to subroutinecolumns(numbers)=columns(numbers)+1;
// Add 1 for drawn numberend
x = linspace(1,39,39); // Define x axisplot2d2(x,columns,style=2) // Plot as step functionsxtitle('RESULT OF LOTTO DRAWS') // Add title & labelsxlabel('Lotto numbers [1,39]') ylabel('Hits')
Ex 1Ex 1--3: task 2, execution 3: task 2, execution
& plot& plot
The result is plotted on the Graphics Window. It is not too bad, considering that the average of 10,000 draws is 7x10,000/39 = 1,795
The dialog box pops up when executing the script. Enter the wanted number of Lotto draws and Click OK
It takes my 1.6 GHz dual core processor about 10 seconds to compute 10,000 draws
Ex 1Ex 1--3: comments (1/3)3: comments (1/3)
This was not exactly an engineering problem, but it showed This was not exactly an engineering problem, but it showed many features of Scilabmany features of Scilab
The UDF in Task 1 is unusual in being closed, having no input The UDF in Task 1 is unusual in being closed, having no input or output argumentsor output arguments——you just use it as it is. The local UDF you just use it as it is. The local UDF demonstrated in Task 2 is the normal casedemonstrated in Task 2 is the normal case
In addition to In addition to rand()rand(), Task 1 brings in several useful , Task 1 brings in several useful functions: functions: getdategetdate()(), , floor()floor(),, unique()unique(), and, and gsortgsort()()
The script in Task 2 is commented at length. Adding headings The script in Task 2 is commented at length. Adding headings and comments takes time and they require space, but and comments takes time and they require space, but comments arecomments are absolutely necessaryabsolutely necessary to understand the to understand the program at a later dateprogram at a later date
Task 2 introduces the dialog box, a GUI (graphical user Task 2 introduces the dialog box, a GUI (graphical user interface) feature to which we shall return in interface) feature to which we shall return in Chapter 15 Chapter 15
Ex 1Ex 1--3: comments (2/3)3: comments (2/3)
In addition to the In addition to the plot()plot() and and plot2d()plot2d() commands that we commands that we used, Scilab has numerous other ways of creating plots, used, Scilab has numerous other ways of creating plots, together with options for adding clarifying together with options for adding clarifying text stringstext strings to the to the plots. Plotting will be covered in more detail in plots. Plotting will be covered in more detail in Chapter 7Chapter 7
Flow controlFlow control——in this case the term refers to the use of in this case the term refers to the use of conditional branch structuresconditional branch structures——will be discussed in will be discussed in Chapter 11Chapter 11
Examples 1Examples 1--1 1 …… 11--3 were also intended to stress the fact that 3 were also intended to stress the fact that we are forced to we are forced to ““think matrixthink matrix--wisewise”” when working with when working with Scilab. For instance, Scilab immediately generates an error Scilab. For instance, Scilab immediately generates an error message if we attempt to do ordinary multiplication (*) when message if we attempt to do ordinary multiplication (*) when a parameter is in matrix form and requires Dot multiplication a parameter is in matrix form and requires Dot multiplication (.*) (Recall Example 1(.*) (Recall Example 1--1?)1?)
Ex 1Ex 1--3: comments (3/3), 3: comments (3/3),
rounding functionsrounding functions
-->round(-2.7), round(2.7) ans =
- 3. ans =
3.
-->fix(-2.7), fix(2.7)ans =
- 2. ans =
2.
-->floor(-2.7), floor(2.7)ans =
- 3. ans =
2.
-->ceil(-2.7), ceil(2.7)ans =
- 2. ans =
3.
The rounding function floor() is one of four rounding functions in Scilab: round(), fix() (or int()), floor(), and ceil()
Pay attention to the difference between the first and the two last ones
rounds upceil()
rounds downfloor()
returns integer partfix() orint()
rounds to nearest integerround()
Dr.EWJohnny Heikell
Dr.EWJohnny Heikell
5. Matrices, functions & 5. Matrices, functions &
operatorsoperators
An overview of basic matrix An overview of basic matrix operations, functions, and operations, functions, and operatorsoperators
Return to Contents
IntroductionIntroduction
As Scilab is built around matrices we are forced to use themAs Scilab is built around matrices we are forced to use them Scilab stores numbers (and characters) in matricesScilab stores numbers (and characters) in matrices A matrix can be seen as a table, consisting of A matrix can be seen as a table, consisting of mm rows and rows and nn columns columns
((mmxxnn matrices, also denoted matrices, also denoted ixjixj matrices)matrices) Scalar variablesScalar variables do not exist do not exist per seper se, they are treated as 1x1 matrices, they are treated as 1x1 matrices The general form of a Scilab matrix (here 3x3 matrix) isThe general form of a Scilab matrix (here 3x3 matrix) is
In both cases In both cases semicolonssemicolons separate rowsseparate rows The next page shows both alternatives for the 3x3 matrixThe next page shows both alternatives for the 3x3 matrix
“[The vector] has never been of the slightest use to any creature.”Attributed to Lord Kelvin
The 3x3 matrixThe 3x3 matrix
Both alternatives for expressing matrices are interpreted in the same way by Scilab. Pick whichever you like
Note:Scilab may cause a copied screen text (as seen here) to be underlined when pasted to another document. If so, put the cursor at the end of the text and press Backspace ()
Row and column vectorsRow and column vectors
Task 1: Create a row vector with first element 0, last element 1 and increment (step size) 0.2. Note the order and colons that divide elements
Task 2: Create a similar column vector. Note the asterisk that signifies the matrix transpose
In case the Console window is set too small and all elements do not fit in, Scilab interrupts plotting and asks if it should continue
-->column=[0:0.2:1]'column =
0. 0.2 0.4 0.6 0.8 1.
-->row=[0:0.2:1] row = 0. 0.2 0.4 0.6 0.8 1.
Some special matricesSome special matrices
-->C=eye(3,3) C = 1. 0. 0. 0. 1. 0. 0. 0. 1. -->D=ones(3,2) D = 1. 1. 1. 1. 1. 1. -->E=zeros(2,3) E = 0. 0. 0. 0. 0. 0.
-->A = [1 2 3; 4 5 6]; B = A; C = A + B C = 2. 4. 6. 8. 10. 12.
-->A = [1 2 3; 4 5 6]; B = A'; C = A * B C = 14. 32. 32. 77.
Addition Multiplication (note transpose!)
Division (note rounding errors)
-->A = [2 3; 4 5]; H = inv(A) H = - 2.5 1.5 2. - 1.
Inverse matrix
Note 1: Rules for matrix operations must of course be observed!Note 2: Scilab returns D, not e, for the exponent (1.518D-16); the exact value is 0 but here we have a case of limited computing accuracy
-->A=[1 2 3; 4 5 6]; B=[A]; C=A/BC =
1. 1.518D-163.795D-15 1.
DDüürerrer’’ss magic squaremagic square
German Renaissance artist and German Renaissance artist and amateur amateur matematicianmatematician Albrecht Albrecht DDüürerrer’’ss ““magicmagic”” square is a square is a popular example in linear algebrapopular example in linear algebra
In the window of In the window of DDüürerrer’’ssengraving the sum of any row, engraving the sum of any row, column, or diagonal yield the column, or diagonal yield the same result (34)same result (34)
We shall use the magic square to We shall use the magic square to investigate some aspects of investigate some aspects of matrix operationsmatrix operations
The magic square will be The magic square will be denoted denoted ““MM”” to set it apart from to set it apart from other matricesother matrices
Note that Note that many matrix operations many matrix operations are defined only for square are defined only for square matricesmatrices
diagdiag()() The magic square is entered in The magic square is entered in
the Consolethe Console’’s command lines command line
The statement The statement sum(Msum(M))produces the sum of all produces the sum of all elements. This elements. This differs from differs from MatlabMatlab, where the same , where the same statement returns the sum of statement returns the sum of the four columns, i.e., the four columns, i.e.,
sum(Msum(M) = 34. 34. 34. 34.) = 34. 34. 34. 34.
The transpose statement The transpose statement MM’’flips the matrix about its main flips the matrix about its main diagonaldiagonal
The statement The statement diag(Mdiag(M )) , , finally, returns the main finally, returns the main diagonal as a column vector diagonal as a column vector
Scilab returns the sums of rows and Scilab returns the sums of rows and columns of a matrix A with the columns of a matrix A with the commands commands sum(A,sum(A,’’cc’’)) and and sum(A,sum(A,’’rr’’)) respectivelyrespectively
At first sight the use of At first sight the use of ‘‘ cc’’ and and ‘‘ rr’’ arguments feels odd. The logic arguments feels odd. The logic is that is that ‘‘ rr’’ returns the sums of returns the sums of matrix columns giving a matrix columns giving a row vectorrow vector, , while while ‘‘ cc’’ returns the sums of returns the sums of matrix rows, a matrix rows, a column vectorcolumn vector
Alternative statements are: Alternative statements are: sum(A,sum(A,’’rr’’)) = = sum(A,1)sum(A,1) and and sum(A,sum(A,’’cc’’)) = = sum(A,2)sum(A,2)
prod()prod()
The product of rows and columns The product of rows and columns can be formed in a similar way as can be formed in a similar way as sumssums
prod(Aprod(A, , ‘‘rr’’) ) returns the product returns the product of each column as a row vectorof each column as a row vector
prod(Aprod(A, , ‘‘cc’’)) returns the product returns the product of each row as a column vectorof each row as a column vector
prod(Aprod(A)) returns the product of returns the product of all matrix elementsall matrix elements
-->A=[1 2 3; 4 5 6; 7 8 9] A =
1. 2. 3.4. 5. 6.7. 8. 9.
-->prod(A, 'r') ans =
28. 80. 162.
-->prod(A, 'c') ans =
6.120.504.
-->prod(A) ans =
362880.
min(), max()min(), max()
The same logic continues with the The same logic continues with the min()min() and and max()max() functionsfunctions
min(Amin(A) ) picks out the smallest picks out the smallest element in the matrix andelement in the matrix andmax(Amax(A) ) the biggestthe biggest
min(Amin(A, , ‘‘rr’’)) returns a row vector returns a row vector consisting of the smallest consisting of the smallest elements in each columnelements in each column
max(Amax(A, , ‘‘cc’’)) returns a column returns a column vector containing the biggest vector containing the biggest elements in each rowelements in each row
A variation of the A variation of the min()min() and and max()max()functions allow us to determine the functions allow us to determine the position and value of the smallest alt. position and value of the smallest alt. largest matrix elementlargest matrix element
[[min_valuemin_value min_posmin_pos] = ] = min(Amin(A) ) picks out the position and value picks out the position and value ((in this order!in this order!) of the smallest ) of the smallest element in the matrix, element in the matrix, [[max_valmax_valmax_posmax_pos] = ] = max(Amax(A) ) the largestthe largest
Note 1:Note 1: The designation of vector The designation of vector elements (here elements (here min_valmin_val etc.) is etc.) is irrelevantirrelevant
Note 2:Note 2: If the matrix contains If the matrix contains multiple min/max values only the multiple min/max values only the position of the first is returnedposition of the first is returned
mean()mean()
And the previously mentioned logic And the previously mentioned logic a final time with the a final time with the mean()mean()functionfunction
mean(Amean(A) ) returns the mean returns the mean value of all matrix elementsvalue of all matrix elements
mean(Amean(A, , ‘‘rr’’)) returns a row returns a row vector consisting of the mean vector consisting of the mean of each columnof each column
mean(Amean(A, , ‘‘cc’’)) returns a column returns a column vector containing the mean of vector containing the mean of each roweach row
-->A=[1 2 3; 4 5 6] A = 1. 2. 3. 4. 5. 6. -->mean(A) ans = 3.5 -->mean(A, 'r') ans = 2.5 3.5 4.5 -->mean(A, 'c') ans = 2. 5.
size()size()
The function The function size()size() can be can be used to find out the size of a used to find out the size of a matrixmatrix
The answer is given as the The answer is given as the number of rows and columns number of rows and columns (in that order)(in that order)
When row and column When row and column variables are named, the variables are named, the answer is given in alphabetic answer is given in alphabetic order (here columns first)order (here columns first)
Matrices with string elements Matrices with string elements (strings were used in the dialog (strings were used in the dialog box in Ex 1box in Ex 1--3 and will be 3 and will be discussed in detail later) are discussed in detail later) are treated the same waytreated the same way
-->size(['You' 'Me'; 'Alpha' 'Beta'; 'Two' 'Three']) ans = 3. 2.
length()length()
The function The function length()length() is is related to related to size()size(). For a matrix . For a matrix with numeric elements with numeric elements length()length() returns the number returns the number of elementsof elements
For a matrix with string For a matrix with string elements elements length()length() returns the returns the number of characters in each number of characters in each element element
Note that matrices with mixed Note that matrices with mixed numeric and string elements numeric and string elements are are not allowednot allowed
The function The function find()find() identifies and identifies and returns the row locations of those returns the row locations of those matrix elements that satisfy the matrix elements that satisfy the Boolean condition stated in the Boolean condition stated in the argument argument
An empty matrix ([]) is returned in An empty matrix ([]) is returned in case no element satisfies the given case no element satisfies the given condition condition
The statement The statement X=3 X=3 is not a valid is not a valid Boolean condition. Although a Boolean condition. Although a numeric answer is returned, it is numeric answer is returned, it is not legitimate not legitimate
Later we shall se that Later we shall se that find()find() can can also be used with stringsalso be used with strings
-->X = [9 1 8; 2 7 3; 6 3 5];
-->find(X<5) ans =
2. 4. 6. 8.
-->find(X==3) ans =
6. 8.
-->find(X=3) ans =
1.
-->find(X~=3) ans =
1. 2. 3. 4. 5. 7. 9.
-->matr = [-1 4 -2 2; 1 0 -3 3; -4 5 0 -5] matr =
- 1. 4. - 2. 2.1. 0. - 3. 3.
- 4. 5. 0. - 5.
-->s_matr = gsort(matr) s_matr =
5. 2. 0. - 3.4. 1. - 1. - 4.3. 0. - 2. - 5.
gsortgsort()()
Scilab does not recognize Scilab does not recognize MatlabMatlab’’sssort()sort() function (it used to before function (it used to before version 5.3). Instead we must use version 5.3). Instead we must use gsortgsort()(), which is different but , which is different but serves the same purpose serves the same purpose
As shown to the right,As shown to the right, gsortgsort()()picks out matrix elements in picks out matrix elements in decreasing order and returns them decreasing order and returns them column by column column by column
We achieve We achieve MatlabMatlab--like sorting by like sorting by adding the arguments adding the arguments ‘‘rr’’ (row) and (row) and ‘‘ii’’ (increase) to(increase) to gsortgsort()()
Check with Check with Help Help for details on for details on arguments arguments
Magic squares of different sizes can Magic squares of different sizes can be produced with the be produced with the testmatrix(testmatrix(‘‘magimagi’’,n,n)) function. It is function. It is the same as the the same as the magic(nmagic(n)) function in function in MatlabMatlab
Additional matrices that can be Additional matrices that can be produced by the produced by the testmatrixtestmatrix()()function is function is testmatrix(testmatrix(‘‘frkfrk’’,n,n))which returns the Franck matrix, and which returns the Franck matrix, and testmatrix(testmatrix(‘‘hilbhilb’’,n,n)) that is the that is the inverse of the inverse of the nxnnxn Hilbert matrix. Hilbert matrix. Check with Check with HelpHelp for details for details
det(Mdet(M) & rounding errors) & rounding errors
Practical problems often require the Practical problems often require the determinant of a (square) matrix to be determinant of a (square) matrix to be calculatedcalculated
The command The command detdet ()() returns the returns the determinantdeterminant
The determinant of The determinant of DDüürerrer’’ss magic magic square is zero (the matrix is square is zero (the matrix is singularsingular), ), but as shown, the rounding error but as shown, the rounding error prevents Scilab from returning the prevents Scilab from returning the exact answer (recall that we exact answer (recall that we encountered this problem encountered this problem beforebefore))
To get rid of the rounding error we To get rid of the rounding error we can use the can use the clean()clean() function. It function. It returns zero for values below 1ereturns zero for values below 1e--1010
-->M = testmatrix('magi',4) M = 16. 2. 3. 13. 5. 11. 10. 8. 9. 7. 6. 12. 4. 14. 15. 1. -->det(M) ans = - 1.450D-12 -->clean(det(M)) ans = 0.
Deleting rows and Deleting rows and
columnscolumns
Rows and columns can be deleted by using a pair of square brackets
We start with the 4x4 magic square, denoted “m” because we shall distort it
We first delete the third column. The Colon Operator argument is used to retain all rows, the argument 3 points to the third column. The result is a 3x4 matrix
In the second instance we delete the second row, to end with a 3x3 matrix
Concatenation is the process of joining Concatenation is the process of joining small matrices to make bigger onessmall matrices to make bigger ones
In fact, even the simplest matrix is In fact, even the simplest matrix is formed by concatenating its individual formed by concatenating its individual elementselements
The pair of square brackets, [], is the The pair of square brackets, [], is the concatenation operatorconcatenation operator
The examples illustrate two basic The examples illustrate two basic cases of concatenation (the only cases of concatenation (the only difference are the transposed matrices difference are the transposed matrices in the second case)in the second case)
Note that if a semicolon (;) is placed Note that if a semicolon (;) is placed after a command the result is after a command the result is suppressed, but with a comma (,) it is suppressed, but with a comma (,) it is displayed (top case)displayed (top case)
-->A = [1 2 3]'; B = [4 5 6]'; C = [A,B] C = 1. 4. 2. 5. 3. 6.
-->A = [1 2 3]; B = [4 5 6], C = [A,B] B = 4. 5. 6. C = 1. 2. 3. 4. 5. 6.
Concatenation (2/2)Concatenation (2/2)
In this example a 4x4 matrix has been created by concatenating four 2x2 matrices
Lines have been overlaid to highlight the fused parts
Alternatively, we could have concatenated four row or column vectors, a 3x3 matrix plus a row and column vector, etc.
E can be treated as a normal 4x4 matrix. For instance, the command A = E(2:3, 2:3) picks out the submatrix
22 2332 33
-->A = [11 12; 21 22];
-->B = [13 14; 23 24];
-->C = [31 32; 41 42];
-->D = [33 34; 43 44];
-->E = [A B; C D]
E =
11. 12. 13. 14.21. 22. 23. 24.
31. 32. 33. 34.41. 42. 43. 44.˥
˩
˥˩
Operators (1/4): Operators (1/4):
the Colon Operator (:)the Colon Operator (:) The Colon Operator, (:), The Colon Operator, (:),
emerged in the earlier examplesemerged in the earlier examples It is one of the most important It is one of the most important
operators in Scilaboperators in Scilab A typically use is in the form:A typically use is in the form:
0:%pi/36:%pi0:%pi/36:%pi
Meaning: Meaning: ““Starting at 0, step by Starting at 0, step by π/36 up to /36 up to π””
The first example shows that The first example shows that the truncated form 1:8 the truncated form 1:8 produces a row vector with produces a row vector with increment 1. The second shows increment 1. The second shows how to refer to rows 3how to refer to rows 3--4, 4, column 2, of the magic square column 2, of the magic square
The second example on the previous slide was a case of The second example on the previous slide was a case of subscriptsubscriptmanipulation of the type manipulation of the type M(i:j,kM(i:j,k)),, where where i:ji:j refers to the refers to the i:thi:th to to j:thj:throws and rows and kk to the to the k:thk:th columncolumn
There is often need to address part of a matrix. The idea shouldThere is often need to address part of a matrix. The idea should be be understood well. Below are three more examplesunderstood well. Below are three more examples
Note that the Colon Operator alone refers to the Note that the Colon Operator alone refers to the entire row or columnentire row or column
The The $$ Operator refers to the last Operator refers to the last value, value, $$--11 to the value next to the to the value next to the last, etc.last, etc.
The example to the right shows some The example to the right shows some uses of the uses of the $$ OperatorOperator
The The $$ Operator can be used to flip the Operator can be used to flip the order of elements in a vector, as order of elements in a vector, as shown below (an alternative method shown below (an alternative method was demonstrated in Ex 1was demonstrated in Ex 1--3, Task 1)3, Task 1)
Operators (4/4): the Operators (4/4): the
Backslash Operator (Backslash Operator (\\))
Backslash (Backslash (\\) denotes left matrix division. ) denotes left matrix division. x=Ax=A\\bb is a solution to is a solution to A*x=bA*x=b , which is important e.g. in control engineering, which is important e.g. in control engineering
If A is If A is square and nonsingularsquare and nonsingular, , x=Ax=A\\bb is equivalent to is equivalent to x=x=inv(Ainv(A)*b)*bbut the computation burden is smaller and the result is more but the computation burden is smaller and the result is more accurateaccurate
Here you can see theHere you can see thewarning given whenwarning given whenScilab sees singularityScilab sees singularityin left division.in left division.
In this case In this case MatlabMatlabproduces a differentproduces a differentanswer than Scilabanswer than Scilab(Example from book by(Example from book byHunt et al.)Hunt et al.)
-->A = [3 -9 8; 2 -3 7; 1 -6 1]; b = [2 -1 3]'; -->x = A\b Warning : matrix is close to singular or badly scaled. rcond = 4.1895D-18 computing least squares solution. (see lsq).
x = 0. - 0.5641026 - 0.3846154
Duplicating an mx1 Duplicating an mx1
vector to an vector to an mxnmxn matrixmatrix
The Colon Operator allows us to The Colon Operator allows us to duplicate vectors to form a matrixduplicate vectors to form a matrix
Assume that we have the column Assume that we have the column vector m = (2:2:6)vector m = (2:2:6)’’; meaning that ; meaning that it has three rowsit has three rows
We want to form a 3x4 matrix We want to form a 3x4 matrix where each column consists of the where each column consists of the vector mvector m
-->m = (2:2:6)';
-->n = 4;
-->A = m(:, ones(n,1)) A =
2. 2. 2. 2.4. 4. 4. 4.6. 6. 6. 6.
Pay attention to the command m(:, ones(n,1). Verbally it can be interpreted as: “Form a matrix with the number of rows defined by the column vector m and the number of columns defined by the variable n. Fill the matrix with ones and multiply each row by the corresponding value of m. Repeat just once.”
Singularities and left Singularities and left
divisiondivision
The terms The terms ““singularsingular”” and and ““nonsingularnonsingular”” emerged on the previous emerged on the previous slide slide
A requirement of nonsingular A requirement of nonsingular square matricessquare matrices is that the determinant is that the determinant is nonzero. Consider the following cases:is nonzero. Consider the following cases:
Earlier we found that Earlier we found that DDüürerrer’’ss magic square is singular, so is magic square is singular, so is e.ge.g the the matrix A = [1 2 3; 4 5 6; 7 8 9]matrix A = [1 2 3; 4 5 6; 7 8 9]
Before performing left division with square matrices one should Before performing left division with square matrices one should check that the determinant of the coefficient matrix is nonzerocheck that the determinant of the coefficient matrix is nonzero, e.g. , e.g. by testing that by testing that clean(det(Aclean(det(A)) ~= 0)) ~= 0
6 25 3
= 6·3 – 2·5 = 8 , it is therefore nonsingular
6 32 1
= 6·1 – 3·2 = 0 , meaning that it is singular
˥˩
˥˩
˥˩
˥˩
Strings (1/6): they are Strings (1/6): they are
matrices toomatrices too Character (letters, text, special characters) strings can be creCharacter (letters, text, special characters) strings can be created by ated by
using single or double quotes:using single or double quotes:
’’This is a &#ck2 stringThis is a &#ck2 string’’, , ””and so is thisand so is this””
Typical use of strings is in plot commands, to define the title Typical use of strings is in plot commands, to define the title and x and x and yand y--labels. Other uses are interactive inputs and outputs (labels. Other uses are interactive inputs and outputs (input()input(), , dispdisp()(),, etc.), and write commands (etc.), and write commands (write(%io(2),.....)write(%io(2),.....)) )
Strings are considered as 1x1 matrices (scalars) in Scilab, but Strings are considered as 1x1 matrices (scalars) in Scilab, but mixed mixed character/numeric strings are typically 1x3 matrices. It is showcharacter/numeric strings are typically 1x3 matrices. It is shown on n on the next slid with the commandthe next slid with the command
disp(['Was it €' string(a) 'that you said?'])
Elements: 1 2 3Elements: 1 2 3
Example 2Example 2--44 shows an additional application of stringsshows an additional application of strings
Strings (2/6): Strings (2/6): dispdisp(), (),
string()string() The most usual string display The most usual string display
command is command is dispdisp()(), where the , where the text has to be in quotation text has to be in quotation marks: marks: disp(disp(‘‘texttext’’)) or or disp([disp([‘‘texttext’’])])
Numeric dataNumeric data can be added to can be added to dispdisp([])([]), but has to be , but has to be converted to stringsconverted to strings using the using the function function string()string()
Scilab knows Scilab knows MatlabMatlab’’ss conversion conversion command command num2str()num2str(),, but in the but in the form form mtlb_num2str()mtlb_num2str()
Leave out the square brackets Leave out the square brackets and the elements are displayed and the elements are displayed as a column, starting with the last as a column, starting with the last (Last In First Out)(Last In First Out)
Commas are optional with square Commas are optional with square brackets, but not with brackets brackets, but not with brackets onlyonly
-->a = 125; -->disp(['Was it €' string(a) 'that you said?']) !Was it € 125 that you said? !
-->b = 521; -->disp(['No, I said €' mtlb_num2str(b) '!']) !No, I said € 521 ! !
-->disp('in action', 'LIFO', 'This is') This is LIFO in action
Strings (3/6): Strings (3/6): dispdisp() vs. () vs.
mprintfmprintf()()
As seen on the previous slide, As seen on the previous slide, dispdisp()() gives LIFO output with an gives LIFO output with an empty line between the elementsempty line between the elements
To avoid the empty line, we can To avoid the empty line, we can use the use the mprintfmprintf()() function with function with the line declaration the line declaration \\nn . In this . In this case the output is First In First case the output is First In First Out. Note that the argument is a Out. Note that the argument is a single stringsingle string
Check with the Help Browser for Check with the Help Browser for other applications of other applications of mprintfmprintf()()
-->disp('in action', 'LIFO', 'This is') This is LIFO in action
-->mprintf(‘\nThis is \nFIFO \nin action')
This is FIFO in action
// strings.sce /
// Demo of write() and input() functions /
clear,clc; write(%io(2),'This is an interactive demo.'); write(%io(2),'You will be asked to give the base length'); write(%io(2),'and height of a triangle. Scilab then'); write(%io(2),'computes the area.'); write(%io(2),' '); // Empty rowb = input('Give length of triangle base: '); h = input('Give height of triangle: '); write(%io(2),' '); // Empty rowdisp(['triangle_area = ' string(b*h/2)])
Strings (4/6): write(), Strings (4/6): write(),
input()input() String arguments in the String arguments in the
write()write() and and input()input()functions allow us to build functions allow us to build interactive codesinteractive codes
In the shown example In the shown example write()write() is first used to give is first used to give general information to the general information to the user, after which user, after which input()input()prompts for data required in prompts for data required in the calculationthe calculation
The The %io(2)%io(2) argument of the argument of the write()write() function tells that function tells that the target is the Console. All the target is the Console. All actions after the script is actions after the script is loaded into Scilab take place loaded into Scilab take place on the Consoleon the Console
This is an interactive demo. You will be asked to give the base length and height of a triangle. Scilab then computes the area. Give length of triangle base: 5 Give height of triangle: 4 !triangle_area = 10 !
Strings(5/6): other useful Strings(5/6): other useful
commandscommands
Some of the functions discussed earlier in this chapter can have string matrices (below S) as arguments:
Returns the number of characters in each string elementlength(S)
Returns the number of rows and columns in Ssize(S)
Returns the Returns the columnwisecolumnwiselocation of a string element in the location of a string element in the matrix*matrix*find(condition)
Returns S with elements rearranged column-by-column in alphanumerically descending order* gsort(S)
Not defined for stringsNot defined for stringsprod(), min(), max(), mean()
To the right is a 3x2 matrix To the right is a 3x2 matrix called called ““carscars””
The function The function find()find() identifies identifies and returns the location of a and returns the location of a specified string within the specified string within the matrixmatrix
In case there is no match, In case there is no match, an empty matrix is returned an empty matrix is returned
The function The function sort()sort() orders orders string elements columnstring elements column--byby--column in alphanumerically column in alphanumerically descending order (note that descending order (note that the number 343 is accepted the number 343 is accepted without being declared without being declared string)string)
-->sc = ['x' 'y'; 'z' 'v+w'] sc =
! x y !! !! z v+w !
-->tsc = trianfml(sc) tsc =
! z v+w !! !! 0 z*y-x*(v+w) !
-->x=1; y=2; z=3; v=5; w=4;
-->evstr(tsc) ans =
3. 9.0. - 3.
Symbolic computingSymbolic computing
Matrices of Matrices of character stringscharacter strings are are constructed as ordinary matrices, e.g. constructed as ordinary matrices, e.g. using square bracketsusing square brackets
A very important feature of matrices of A very important feature of matrices of character strings is the capacity to character strings is the capacity to manipulate and create functionsmanipulate and create functions
Symbolic manipulation of mathematical Symbolic manipulation of mathematical objects can be performed using objects can be performed using matrices of character stringsmatrices of character strings
In the shown cases the function In the shown cases the function trianfmltrianfml()() performs symbolic performs symbolic triangularizationtriangularization of the matrix of the matrix scsc, and , and the function the function evstrevstr()() evaluates the evaluates the expression expression tsctsc
Arrays: generalArrays: general
The term The term ““arrayarray”” refers to any refers to any systematic arrangement of systematic arrangement of objects, usually in rows and objects, usually in rows and columns (numeric arrays, diode columns (numeric arrays, diode arrays, antenna arrays, etc.) arrays, antenna arrays, etc.)
Arrays have some important Arrays have some important uses, e.g. for uses, e.g. for building tablesbuilding tables
Arithmetic operations on arrays Arithmetic operations on arrays are done are done elementelement--byby--elementelement, , meaning that addition and meaning that addition and subtraction are the same for subtraction are the same for arrays and matricesarrays and matrices
Scilab uses the Scilab uses the Dot Operator (.)Dot Operator (.)for array operationsfor array operations
The table to the right is a list of The table to the right is a list of array operatorsarray operators
Assume that we have a Assume that we have a column vector column vector n=(0 9)n=(0 9) ’’
We can then build a table We can then build a table with a simple functionwith a simple function——in in the shown case with the shown case with columns for columns for nn, , n^2n^2 and and 2^n2^n
This type of tables are This type of tables are useful e.g. when useful e.g. when processing measurement processing measurement datadata
The second example The second example shows that Scilab treats shows that Scilab treats the created table as a the created table as a normal matrixnormal matrix
-->p = powers(4:5,1:2)p =
3. 9.4. 16.
-->q = powers(3,2)*powers(4,3)q =
32.
ElementElement--byby--element element
multiplication and divisionmultiplication and division
ElementElement--byby--element element multiplication with the use of multiplication with the use of the the Dot OperatorDot Operator can also be can also be performed on twoperformed on two--dimensional dimensional matricesmatrices
In the first example we In the first example we multiply, elementmultiply, element--byby--element, element, two 2x2 matrices to form a 2x2 two 2x2 matrices to form a 2x2 product matrix Cproduct matrix C
Note the different result with Note the different result with ordinary matrix multiplicationordinary matrix multiplication
And here we divide the same And here we divide the same matrices elementmatrices element--byby--element to element to form a 2x2 matrix of quotientsform a 2x2 matrix of quotients
-->A = [1 2; 3 4]; B = [5 6; 7 8]; C = A.*B C =
5. 12.21. 32.
-->D = A*BD =
19. 22.43. 50.
-->E = A./BE =
0.2 0.33333330.4285714 0.5
Right and left divisionRight and left division
As As shown in the table aboveshown in the table above, Scilab , Scilab allows left and right elementallows left and right element--byby--element division (.element division (.\\ and ./ and ./ respectively)respectively)
The difference between the two is The difference between the two is which of the two division elements is which of the two division elements is the numerator and which the the numerator and which the denominatordenominator
As shown by the examples, left As shown by the examples, left division means that the element in the division means that the element in the left matrix becomes the denominator, left matrix becomes the denominator, with right division it is the nominatorwith right division it is the nominator
-->A = [1 2; 3 4]A =
1. 2.3. 4.
-->B = [5 6; 2 -3]B =
5. 6.2. - 3.
-->A.\Bans =
5. 3.0.6666667 - 0.75
-->A./Bans =
0.2 0.33333331.5 - 1.3333333
The exponent function exp() is a special case in being defined as an element-by-element operation
Dot Operator pitfallsDot Operator pitfalls
In practical simulations Scilab often In practical simulations Scilab often flashes error messages due to wrong flashes error messages due to wrong use of the Dot Operatoruse of the Dot Operator——or the absence or the absence of itof it
A particular problem is division with an A particular problem is division with an integer in the nominator. As shown to integer in the nominator. As shown to the here, the first case is interpreted by the here, the first case is interpreted by Scilab as B = (1.0)/A and the second as Scilab as B = (1.0)/A and the second as C = (1.0)./A C = (1.0)./A Try to remember!Try to remember!
Those with experience of Those with experience of MatlabMatlab should should be aware that the priority of the Dot be aware that the priority of the Dot Operator is Operator is different indifferent in ScilabScilab
This is not an issue with multiplicationThis is not an issue with multiplication
-->A = [1 2 3 4];
-->B = 1./AB =
0.03333330.06666670.10.1333333
-->C = (1)./AC =
1. 0.5 0.3333333 0.25
-->D = 2.*AD =
2. 4. 6. 8.
-->E = (2).*AE =
2. 4. 6. 8.
x=input('Give a number :'); if modulo(x,2)==0 then
disp('Number is even'); else
disp('Number is odd'); end
A few more functions A few more functions
(1/5): modulo()(1/5): modulo()
Then command Then command modulo(n,mmodulo(n,m))computes the reminder of computes the reminder of nndivided by divided by mm (where (where nn and and mmare integers)are integers)
With matrices With matrices modulo()modulo()computes the reminder computes the reminder elementelement--byby--elementelement
modulo()modulo() comes handy e.g. comes handy e.g. when we need to check if a when we need to check if a number is even or odd (the number is even or odd (the ifif--thenthen--elseelse--end end construct will construct will be discussed in Chapter 11)be discussed in Chapter 11)
There is a related function There is a related function pmodulopmodulo()(). Check with Help. Check with Help
-->modulo(3,2) ans = 1.
-->n=[1,2; 10,15]; m=[2,2; 3,5];
-->modulo(n,m) ans = 1. 0. 1. 0.
Give a number :1443 Number is odd
Give a number :24 Number is even
A few more functions A few more functions
(2/5): (2/5): getdategetdate()() We saw We saw getdategetdate()() in action in action
already in Example 1already in Example 1--3, 3, where it was used towhere it was used toimprove randomnessimprove randomness
Another use ofAnother use of getdategetdate()() is to is to put a date stamp on the put a date stamp on the printout of a simulationprintout of a simulation
getdategetdate()() has numerous has numerous alternative arguments. In alternative arguments. In addition to those used in Ex. addition to those used in Ex. 11--3 there are e.g. the ones 3 there are e.g. the ones shown to the right. Check shown to the right. Check with Help for detailswith Help for details
The starting point of the The starting point of the ““clockclock”” of of getdategetdate()() is UTC is UTC 00:00 on 1 January 197000:00 on 1 January 1970
-->xp=getdate();
-->xp(1),xp(2),xp(3),xp(4),xp(5),xp(6),xp(7) ans =
2011. ans =
3. ans =
12. ans =
83. ans =
5. ans =
24. ans =
11.
(1) present year
(2) present month
(3) present week
(4) day of the year
(5) weekday (Thu)
(6) day of the month
(7) hour of the day
A few more functions A few more functions
(3/5): unique()(3/5): unique()
Recall that Recall that unique()unique() was used was used in Ex. 1in Ex. 1--3 in the condition 3 in the condition length(unique(numberslength(unique(numbers))<7))<7to ascertain that the lotto row to ascertain that the lotto row contained only unique numberscontained only unique numbers
Here Here unique()unique() is used to is used to identify generated integers in identify generated integers in the range [1,5] the range [1,5]
In the second case In the second case unique()unique()picks out unique rows in a picks out unique rows in a matrix. Change matrix. Change ‘‘rr’’ to to ‘‘cc’’ to find to find unique columnsunique columns
Compare Compare unique()unique() with with find()find()that was discussed earlierthat was discussed earlier
(4/5): rand()(4/5): rand() We have seen the random We have seen the random
number generatornumber generator rand()rand()several times alreadyseveral times already
rand()rand() can generate two can generate two types of numbers, either types of numbers, either with with uniformuniform or or GaussianGaussiandistribution. Uniform is the distribution. Uniform is the default, Gaussian (normal) default, Gaussian (normal) is selected with the is selected with the argument argument ‘‘normalnormal’’ (or (or ‘‘nn’’))
To the right are To the right are histograms of 2000 histograms of 2000 random numbers random numbers generated with uniform generated with uniform and Gaussian distribution and Gaussian distribution (the latter with mean 0, (the latter with mean 0, variance 1) variance 1)
The function The function grand()grand() is is more more versatileversatile than than rand()rand(). It allows . It allows most existing distributions to most existing distributions to be generated. Shown here is be generated. Shown here is an example with Chian example with Chi--square, square, exponential, and Poisson exponential, and Poisson distribution histogramsdistribution histograms
Dr.EWJohnny Heikell
Dr.EWJohnny Heikell
6. Examples, Set 2 6. Examples, Set 2
Adds to what we have learned Adds to what we have learned so farso far
Return to Contents
Example 2Example 2--1: solving an 1: solving an
equation systemequation system
The task is to solve the following system of equations:The task is to solve the following system of equations:
x1 + 2x 2 – x 3 = 1-2x 1 – 6x 2 + 4x 3 = -2
-x 1 – 3x 2 + 3x 3 = 1
We can write it in the matrix form Ax = b, where:We can write it in the matrix form Ax = b, where:
Next we set up the equations in Scilab to find the solution x:Next we set up the equations in Scilab to find the solution x:
1b = -2
1
1 2 –1A = -2 –6 4 ,
-1 –3 3
Ex 2Ex 2--1: script & solution1: script & solution
-->exec algebra1.sce
-->// algebra1.sce / -->// -->// Find the solution x in / -->// Ax = b / -->//
// algebra1_check.sce /// Make sure that b - Ax = 0 /
residual = b - A*x
Ex 2Ex 2--1: checking the 1: checking the
resultresult
It is good practice to check It is good practice to check oneone’’s solutionss solutions
In this case it can be done by In this case it can be done by making sure that the residual making sure that the residual B B –– AxAx is exactly zerois exactly zero
The altered code is renamed The altered code is renamed algebra1_check.sce and algebra1_check.sce and saved before being executedsaved before being executed
The result is 0, as hoped for The result is 0, as hoped for (note that there is no (note that there is no rounding error here; the rounding error here; the result is exactly zero)result is exactly zero)
Ex 2Ex 2--1: what should have 1: what should have
been done beforebeen done before
In line with what has been said In line with what has been said earlier, we should start by earlier, we should start by checking that the determinant of checking that the determinant of the coefficient matrix A is the coefficient matrix A is nonsingular (ok, Scilab would nonsingular (ok, Scilab would have yelled if that had been the have yelled if that had been the case)case)
We can test it in hindsight and We can test it in hindsight and see that this is not the casesee that this is not the case
When writing a program for When writing a program for practical applications we must practical applications we must include the zero check in the include the zero check in the script. This, however, requires script. This, however, requires flow control flow control (conditional (conditional branching) that will be discussed branching) that will be discussed in in Chapter 11 Chapter 11
Problem: The determinant of the coefficient matrix A must be non-zero
Example 2Example 2--2: solving 2: solving
currents in a DC circuitcurrents in a DC circuit
Task: Determine the four currents i1, i2, i3, and i4 for the shown DC circuit
As drawn, the figure allows Kirchhoff’s voltage law to be applied. However, the method leads to a non-square matrix and tools like the Backslash Operator (\) and multiplication with inverse matrices cannot be applied
ΩΩ
Ω
Ω
Ex 2Ex 2--2: mesh2: mesh--currentscurrents
Instead, superposition of currents with mesh-current equations can be used. Along the current loops the diagonal term resistances are:
R11 = 10 ΩR22 = 12 ΩR33 = 18 Ω
The common (off-diagonal) resistances are:
R12 = -8 Ω, R13 = -2 Ω, R21 = -8 Ω, R23 = -4 Ω, R31 = -2 Ω, R32 = -4 Ω (You should be able to figure out the logic)
Ω
Ω
Ω
Ω
Ex 2Ex 2--2: solution2: solution
These values allow us to write the following mesh-current equations:
We execute the script in the Console and compute manually the current values that we are looking for:
The example shows that we have to find the right method to The example shows that we have to find the right method to be able to use matrix operationsbe able to use matrix operations
Is there reason to use matrices, which are the alternatives?Is there reason to use matrices, which are the alternatives? The first alternative would be to proceed from the initial The first alternative would be to proceed from the initial
diagram and apply Kirchhoffdiagram and apply Kirchhoff’’s voltage law, and solve the s voltage law, and solve the problem manually. It is a quite tedious taskproblem manually. It is a quite tedious task
Another alternative is to start manual calculations from the Another alternative is to start manual calculations from the set of meshset of mesh--current equations by using current equations by using CramerCramer’’s rules rule. . However, it also requires a good dose of algebra since we However, it also requires a good dose of algebra since we have to compute determinants for several equations before have to compute determinants for several equations before we can divide the results to find the solutions we can divide the results to find the solutions
In short, using Scilab to manipulate matrices simplifies the In short, using Scilab to manipulate matrices simplifies the undertaking. With more complicated circuits the difference is undertaking. With more complicated circuits the difference is even more pronouncedeven more pronounced
Example 2Example 2--3: continuous3: continuous--
time statetime state--space modelspace model
The figure shows a typical a The figure shows a typical a continuouscontinuous--time statetime state--space space model, defined by the matrix model, defined by the matrix equationsequations
xx’’= Ax + Bu= Ax + Buy = y = CxCx + Du+ Du
whereA A = system matrix = system matrix B B = input matrix= input matrixC C = output matrix= output matrixD D = = feedforwardfeedforward matrixmatrixx x = state vector= state vectorxx’’= = dx/dtdx/dtu u = input vector= input vectory y = output vector= output vector
Ex 2Ex 2--3: the task3: the task
Assume a system given by:Assume a system given by:
The input u is constant at 0.5The input u is constant at 0.5
The initial state vector The initial state vector x0 = [0 0]x0 = [0 0], i.e., x = 0 at t = 0, i.e., x = 0 at t = 0
The task is to plot the output y and state variable responses The task is to plot the output y and state variable responses (x, x(x, x’’) for t = 0 ) for t = 0 …… 3030
B = 0 10 1
-1 –0.5 A = ,
C = 1 0 , D = 0
Ex 2Ex 2--3: script3: script
First the stateFirst the state--space model is space model is defineddefined
Note the Note the syslinsyslin()()function that function that defines a linear defines a linear system system
Next, the Next, the responses due to responses due to initial state and initial state and external input external input signal signal uu are are simulated using simulated using csimcsim()()
To finish, the To finish, the responses at responses at outputoutput yy and state and state variables variables xx andandxx’’areare plotted in plotted in separate windows separate windows
// state_space.sce
// Simulates a continuous-time state-space /// system model /
clear,clc;A=[0,1;-1,-0.5]; // System matricesB=[0;1];C=[1,0];D=[0];x0=[0;0]; // Initial statesys=syslin('c',A,B,C,D,x0); // Create cont.-time ('c') system modelt=[0:0.1:30]; // Time vectoru=0.5*ones(1,length(t)); // Create constant input signal
[y,x]=csim(u,t,sys); // Compute with u=input, y=output, x=states
scf(1); clf; // Open and clear figure 1plot(t,y); // Plot response in y
xtitle('RESPONSE AT OUTPUT y','t');ax1=gca(); ax1.grid=[2,5]; // Handle: add grid to y-plot
scf(2); clf; // Open and clear figure 2plot(t,x); // Plot response in x
xtitle('RESPONSE OF STATE VARIABLES','t');legend('x','dx/dt',1); // Add legend to x-plotax1=gca(); ax1.grid=[2,5]; // Handle: add grid to x-plot
Ex 2Ex 2--3: plots3: plots
Note the use of the function scf(number) (set current figure) to produce two plots
Ex 2Ex 2--3: comments (1/3)3: comments (1/3)
Apart from demonstrating matrix operations, this example Apart from demonstrating matrix operations, this example introduced a number of new concepts:introduced a number of new concepts:–– definition of a linear system with the definition of a linear system with the syslinsyslin()() function, in which function, in which
the string the string ‘‘cc’’ as input argument denotes as input argument denotes ““continuous.continuous.”” The The initial state initial state x0=[0;0]x0=[0;0] is not needed since x0=0 is the default is not needed since x0=0 is the default value, but it is there if we want to make changesvalue, but it is there if we want to make changes
–– Scilab Scilab lacks a unit step functionlacks a unit step function; the constant input signal is ; the constant input signal is constructed with a unit vector (using constructed with a unit vector (using ones()ones())) of length = of length = tt
–– simulation of the defined system was done by the simulation of the defined system was done by the csimcsim()()function, with function, with uu, , tt, and , and syssys as input argumentsas input arguments
–– csimcsim()() produces the output arguments produces the output arguments yy and and xx, which are used , which are used by the plotting commands. Check by the plotting commands. Check HelpHelp for a detailed explanationfor a detailed explanation
–– two plots are created since, with this particular system, two plots are created since, with this particular system, xx and and yywould otherwise overlap. would otherwise overlap. xx and and xx’’ are plotted automaticallyare plotted automatically
–– the the ax1=ax1=gcagca()() and and ax1.grid=[2,5]ax1.grid=[2,5] pair of commands tells that pair of commands tells that we want a grid with blue vertical and red horizontal lines we want a grid with blue vertical and red horizontal lines
Ex 2Ex 2--3: comments (2/3)3: comments (2/3)
For a linear system, we can use either a transfer function or state-space representation. Their differences:
Time response methodFrequency response method
MatrixLaplace transform
State variables are shownSome internal couplings are hidden
Representation with more parameters
System representation becomes more compact with fewer parameters
Multiple input / Multiple outputSingle input / Single output
State descriptionsInput/Output descriptions
Internal descriptionExternal description
StateState--spacespaceTransfer functionTransfer function
In common are block diagrams and their manipulations, poles and zeros
Ex 2Ex 2--3: comments (3/3)3: comments (3/3)
It is possible to shift between transfer functions and stateIt is possible to shift between transfer functions and state--space representation:space representation:
–– tf2ss()tf2ss(), transfer function to state, transfer function to state--spacespace–– ss2tf()ss2tf(), state, state--space to transfer functionspace to transfer function
These functions are needed e.g. when These functions are needed e.g. when discretizingdiscretizing continuouscontinuous--time models, for which Scilab has the function time models, for which Scilab has the function dscrdscr()() but but which is valid only for statewhich is valid only for state--space modelsspace models
See tutorial by Haugen, section 9.6, for a brief discussion. A See tutorial by Haugen, section 9.6, for a brief discussion. A detailed discussion is given in the obsolete detailed discussion is given in the obsolete Signal Processing Signal Processing With ScilabWith Scilab, sections 1.5, 1.7, and 2.1 (you can access both , sections 1.5, 1.7, and 2.1 (you can access both through through <http://wiki.scilab.org/Tutorials>))
Example 2Example 2--4: string 4: string
functions, scriptfunctions, script
// conv_seconds.sce
// The script asks for a number of seconds, / // checks that the given number is positive, / // then converts the number into hours, / // minutes, and seconds /
clear,clc; time = input("Give time in seconds: "); if time < 0 // Check if time >= 0
The if...else...end construct will be discussed in Chapter 11
This example relates to the discussion on strings in Chapter 5
Strings as disp()arguments
Note interplay between floor() and modulo()
String as input()argument
Ex 2Ex 2--4: string functions, 4: string functions,
execution & commentsexecution & comments
Give time in seconds: 0 0 hour(s) 0 minute(s) 0 second(s)
Give time in seconds: -3600 ERROR, negative number
Give time in seconds: 7465.33 2 hour(s) 4 minute(s) 25.33 second(s)
Below is the result of three different runs
In the script, the initial cleaning command is clear,clc;. If clf was included it would cause the Graphics Window to pop up unnecessarily (in Ex 2-3 it would have produced an extra empty window)
In a case like this it is irritating that the Console does not become active after the execution command is given on the Editor. You automatically begin to type in the response once the string command pops up, but the cursor is still on the Editor…
In this example we for the first time use a sanity check (if time < 0 ...) to make certain that the user does not cause problems by wrong inputs
Dr.EWJohnny Heikell
Dr.EWJohnny Heikell
7. Graphics & plotting7. Graphics & plotting
2D & 3D plots, subplots & other 2D & 3D plots, subplots & other types of plots; editing plotstypes of plots; editing plots
Return to Contents
The Graphics WindowThe Graphics Window
The toolbar allows rotation and The toolbar allows rotation and zoom of a plotzoom of a plot
Of real interest is Of real interest is EditEdit in the menu bar, in the menu bar, and the and the Figure propertiesFigure properties and and Axes Axes propertiesproperties, that are shown when clicking , that are shown when clicking on on EditEdit
However, However, Figure propertiesFigure properties is is ambiguous, all options can be found ambiguous, all options can be found under under Axes propertiesAxes properties
Note: The Demonstrationfeature has a good presentation of plotting functions, but it also contains obsolete ones
getcolorgetcolor()()
When working with graphics When working with graphics you may want to check which you may want to check which colors are available in Scilab colors are available in Scilab and which their codes or and which their codes or names arenames are
ScilabScilab’’s color palette can be s color palette can be brought up by entering the brought up by entering the command command getcolorgetcolor()() on the on the ConsoleConsole
By clicking on a color in the By clicking on a color in the palette its number, RGB palette its number, RGB composition, and name are composition, and name are displayed at the bottom of displayed at the bottom of the window (the window (ScilabScilab 5.3.x 5.3.x does not display the last two, does not display the last two, 33 33 ““greengreen”” and 34 and 34 ““greygrey””).*).*
*) I miss more light colors for use as plot backgrounds.
Plot function demosPlot function demos
You get a demo of certain plot You get a demo of certain plot functions by entering the functions by entering the function name on the Console. function name on the Console. Examples:Examples:
edited plotedited plot To change sine and cosine To change sine and cosine
colors, Click: colors, Click: Figure Figure objectobject\\ColormapColormap, mark a , mark a one (1) for: one (1) for: 1 1 RED, RED, 22 BLUEBLUE
Sine/cosine style: Sine/cosine style: AxesAxes\\CompoundCompound\\PolylinePolyline, select , select Line solidLine solid 3 for both3 for both
x/yx/y axes: axes: AxesAxes\\TextText ““x/yx/yaxisaxis””, , File modeFile mode on, on, Fore Fore colorcolor 13, 13, Font sizeFont size 3, 3, Axis Axis locationlocation middle, middle, Grid colorGrid color1313
Title: Title: TextText ““SINE AND SINE AND COSINECOSINE””, , Font sizeFont size 3, 3, Font ColorFont Color 1313
Style: Style: Font sizeFont size 2 (Axes labels)2 (Axes labels)
Editing the Graphics Editing the Graphics
WindowWindow
The Figure Editor allows us to give the Graphics Editor a more The Figure Editor allows us to give the Graphics Editor a more colorful appearance. Play for a while with the Editorcolorful appearance. Play for a while with the Editor’’s object s object properties and you can find e.g. the following alternatives:properties and you can find e.g. the following alternatives:
Graphics Window Graphics Window
commandscommands
The command for The command for creatingcreating a a new Graphics Window for new Graphics Window for plots is:*plots is:*
scfscf ()()
for figures:for figures:
show_windowshow_window ()()
and the obsolete:**and the obsolete:**
xsetxset ()()
Scilab commands starting with x are usually associated with Graphics Window. The history of the x goes back to the X window system in Unix
WindowsWindows--related clear/ related clear/ delete commands are e.g.:delete commands are e.g.:
**) Obsolete functionscan be seen in most Scilab tutorials, but they should be avoided.
*) Single plots can be created without the scf() command.
Why Why plot()plot() and and plot2d()plot2d()??
Both Both plot()plot() and and plot2d()plot2d() create 2D plotscreate 2D plots plot()plot() is borrowed from is borrowed from MatlabMatlab. Persons with . Persons with MatlabMatlab experience may experience may
want to use it (and frankly, want to use it (and frankly, the benefits of the benefits of plot2d() plot2d() are doubtfulare doubtful)) Scilab has the added Scilab has the added plot2d()plot2d() function. It offers more options to function. It offers more options to
tailor the plot. Multiple plots, for instance (recall however thtailor the plot. Multiple plots, for instance (recall however that at multiple plots were done with multiple plots were done with plot()plot() in Ex 1in Ex 1--2):2):
// multiple_plot.sce
// Demonstrates one alternative offered /// by the plot2d() function /
clear,clc,clf;
x = [0:0.01:2*%pi]';plot2d(x,[sin(x) sin(2^x) sin(3*x)],rect=[0,0,6,1])legend('sin(x)','sin(2^x)','sin(3*x)')
plot2d(): syntaxplot2d(): syntax
The The plot2d()plot2d() syntax can be used as a guide for some other plot syntax can be used as a guide for some other plot commands, e.g. for commands, e.g. for fplot2d()fplot2d()and and histplothistplot()()
plot2d()plot2d() has the following arguments:has the following arguments:
x x and and yy can be either vectors or matrices but with different can be either vectors or matrices but with different outcomes for the plot. outcomes for the plot. logflaglogflag is used only with logarithmic plots, is used only with logarithmic plots, wewe’’ll se it in a demo laterll se it in a demo later
The set of optional arguments is:The set of optional arguments is:
style2 = -9; // “style” for cosstrf2 = ‘000’; // No axes changesleg = ‘sin@cos’; // Legend definitionplot2d(x,y2,style2,strf2,leg)
Scilab may not accept the legend command as it has done here (bug?)
plot2d(): multiple plotsplot2d(): multiple plots
The previous slide showed how The previous slide showed how to create multiple graphs in a to create multiple graphs in a single window with two single window with two separate separate plot2d()plot2d() commandscommands
Multiple graphs can be declared Multiple graphs can be declared in a single in a single plot2d()plot2d() statement statement using a using a vector argumentvector argument
The case shown here also The case shown here also differs from the previous one differs from the previous one by having argument by having argument declarations declarations ‘‘in situin situ’’
Scilab does not properly adjust Scilab does not properly adjust the plot to the window; only the plot to the window; only the first legend showsthe first legend shows
// plot2d_multiple.sce
// Multiple graph declarations in a single /// plot2d() command /
We have several times come across number codes for graph colors We have several times come across number codes for graph colors (style, the number after the x and y arguments in (style, the number after the x and y arguments in plot2d()plot2d()))
Color codes are those that can be found with the Color codes are those that can be found with the getcolorgetcolor()()command on the Console. The most important ones are 1=black, command on the Console. The most important ones are 1=black, 2=blue (9=dark blue), 3=green (13=dark green), 5=red, 8=white, 2=blue (9=dark blue), 3=green (13=dark green), 5=red, 8=white, and 25=brownand 25=brown
On the previous slide we saw that the code On the previous slide we saw that the code --9 creates circles. Plug 9 creates circles. Plug in in getmarkgetmark()() on the Console to see the whole list, including codes on the Console to see the whole list, including codes for mark sizes that you can use with handle commands. There are for mark sizes that you can use with handle commands. There are in in all 15 of these marks (always black):all 15 of these marks (always black):
The simple script below demonstrates the plot2d() command when arguments x and y are matrices, and the style is 1 and -1
scf() is used to open a new Graphics Window. Otherwise the +marks of the second plot2d()command would be on top of the first one
The command is clearer if arguments are written in plain (style=-1) but, a shown in earlier demos, the number alone is enough
fplot2d() fplot2d()
fplot2d()fplot2d() is a variant of is a variant of plot2d()plot2d()
With With fplot2d()fplot2d() a a functionfunction and its and its definitions can be definitions can be included in the included in the argumentsarguments
The general form of The general form of fplot2d()fplot2d() is:is:
The demo to the right shows a The demo to the right shows a case wherecase where–– x = linspace(x = linspace(--10,10,100)10,10,100)–– f = Scilabf = Scilab’’s ins in--built built sincsinc functionfunction–– style=5 is an optional argumentstyle=5 is an optional argument
There is also a There is also a 3D alternative3D alternative, , fplot3d()fplot3d()
offers a simpler way to distinguish offers a simpler way to distinguish between multiple plots than does between multiple plots than does plot2d()plot2d(). It is by using keyboard . It is by using keyboard characters, the way it was done characters, the way it was done on on teleprintersteleprinters half a century ago half a century ago
Here three graphs are plotted with Here three graphs are plotted with one one plot()plot() command. The style command. The style definitions are definitions are ''oo'', , ''x,x,'' and and ''<.<.'' Note Note that that tt is repeated for each graphis repeated for each graph
It can be seen that It can be seen that ''<<'' (red) gives (red) gives a triangle that points in the a triangle that points in the direction of the path of the linedirection of the path of the line
// plot()_demo.sce
// Demonstration of plot() syntax /
clf();
t=0:0.1:2*%pi; plot(t,sin(t),'o',.. // Plot with 'o'
t,cos(t),'x',.. // Plot with 'x't,abs(sin(t+%pi/4)),'<') // Plot with '<‘
*) Scilab’splot() function does not support all properties of its Matlabcounterpart
CrossCrossSolid line (default)Solid line (default)--
The following list contains main line style codes for plot():
Color arguments are: k – Black, w – White, r - Red, g - Green, b – Blue, c – Cyan, m – Magenta, y – Yellow (the letter should be in front of the style code, inside single or double quotes, e.g. ''r+'')
3D graphs: plot3d()3D graphs: plot3d()
The syntax of The syntax of plot3d()plot3d() is quite similar to that of is quite similar to that of plot2d()plot2d(). . In In addition to the mandatory addition to the mandatory x,y,zx,y,z arguments, the arguments, the plot 3d()plot 3d() function function cancan——among other possibilitiesamong other possibilities——have following arguments:have following arguments:
Check with Check with HelpHelp for an explanationfor an explanation
Below weBelow we’’ll plot a 3D graph of the ll plot a 3D graph of the sincsinc function function sin(x)/xsin(x)/x, using , using some of the surface definition capabilities of some of the surface definition capabilities of plot3d()plot3d()
Scilab defines only the 2D Scilab defines only the 2D sinc(xsinc(x)) function so to shift to 3D we will function so to shift to 3D we will apply the expressionapply the expression
r = r = √√(x(x22 –– yy22))
Of the above mentioned arguments weOf the above mentioned arguments we’’ll use ll use leg=leg=““X@Y@ZX@Y@Z”” to to label label x,yx,y, and z axes and , and z axes and flag=[flag=[mode,type,boxmode,type,box]] to define surface to define surface color, scaling and frame of the plotcolor, scaling and frame of the plot
3D graphs: plot3d(),3D graphs: plot3d(),
script & plot for 3D script & plot for 3D sincsinc()()
// sinc3D.sce
// Plot the sinc function (sin(x)/x) using plot3d() /// with surface definition arguments /
clear,clc,clf;
x = linspace(-10,10,50);y = linspace(-10,10,50);[X,Y] = ndgrid(x,y); //Create array for xy gridZ = 50*sin(sqrt(X.^2 + Y.^2))./sqrt(X.^2 + Y.^2);plot3d(x,y,Z,leg=“X@Y@Z",flag=[4,2,4])
Pay attention to [X,Y] = ndgrid(x,y)& use of the Dot Operator in Z
Change plot3d() for plot3d1()to get a different texture
A different approach to this task is shown in Example 3-5. There is a bug in the script given in Help/meshgrid
// surf_ex1.sce
// Plot the function /// z=(2x^2 - y^2)exp(-x^2 - 0.5y^2) /// for -2<x<2, -3<y<3, where < indicates /// "less than or equal to" /
clear,clc,clf;x=linspace(-2,2,30); // Linear spacingy=linspace(-3,3,30);[X,Y]=meshgrid(x,y); // Surface meshZ=(2*X.^2-Y.^2).*exp(-X.^2-0.5*Y.^2);surf(X,Y,Z) // Plot 3D surface
3D graphs: surf(), 3D graphs: surf(),
task & scripttask & script
The function The function linspace(a,b,mlinspace(a,b,m))creates linearly spaced x and y creates linearly spaced x and y row vectors (row vectors (““from a to b with m from a to b with m equal incrementsequal increments””))
Using vectors x and y, the Using vectors x and y, the [X,Y] [X,Y] = = meshgrid(x,ymeshgrid(x,y)) command command creates a 2D matrix in the creates a 2D matrix in the xyxy--planeplane
Generate ZGenerate Z--values for each values for each element of the 2D matrixelement of the 2D matrix
Plot the resulting 3D functionPlot the resulting 3D function
Write a script that plots the functionWrite a script that plots the functionz = (2*xz = (2*x22 –– yy22)exp()exp(--xx22 -- 0.5*y0.5*y22)), ,
where where --2 2 ≤≤ x x ≤≤ 2 and 2 and --3 3 ≤≤ y y ≤≤ 33
3D plots: surf(), plot3D plots: surf(), plot
Ain’t that cute!
The colors may not be all that great but they can be changed with handle commands. This will be shown in Example 3-5
surf() has a parallel form called mesh()that is used in the same way as surf()but it lacks shading
If you click on the display button for surf() in the Help Browser, Scilabfirst displays a number of alternatives and then crashes.
Contour plots: contour()Contour plots: contour()
LetLet’’s return to the expression s return to the expression z = (2*xz = (2*x22 –– yy22)exp()exp(--xx22 –– 0.5*y0.5*y22)), , and plot its 2D contour (level/height curves)and plot its 2D contour (level/height curves)
It only requires the scriptIt only requires the script’’s plot command to be changeds plot command to be changed
// contour.sce
// Plot the 2D height curves for the / // function /// z=(2x^2 - y^2)exp(-x^2 - 0.5y^2) /// for -2<x<2, -3<y<3, where < indicates /// "less than or equal to" /
The 2D vector field for the expression The 2D vector field for the expression z = (2*xz = (2*x22 –– yy22)exp()exp(--xx22 --0.5*y0.5*y22)) can be visualized by changing the plot expression to can be visualized by changing the plot expression to champ()champ(), and adjusting the intervals in the , and adjusting the intervals in the linspacelinspace()() functions:functions:
// vector_field.sce
// Plot the 2D vector fields for the function / // z=(2x^2 - y^2)exp(-x^2 - 0.5y^2) /// for -2<x<2, -3<y<3, where < indicates /// "less than or equal to" /
Vector fields are not very informative per se, but the situationVector fields are not very informative per se, but the situationimproves when they are fused with contoursimproves when they are fused with contours
In the previous case, just insert the In the previous case, just insert the champ()champ() and and contour()contour()commands into the same script and you get them in one plot:commands into the same script and you get them in one plot:
Cutting a 3D surfaceCutting a 3D surface
// cutting.sce
// Cut the the function / // z=(2*x^2 - y^2)exp(-x^2 - 0.5*y^2) /// along the plane y = -1 /
We can see the outline of the 3D surface We can see the outline of the 3D surface z = (2*xz = (2*x22 –– yy22)exp()exp(--xx22 --0.5*y0.5*y22)) at a certain plane by defining the plane in case (below y = at a certain plane by defining the plane in case (below y = --1) and by returning to 2D plotting:1) and by returning to 2D plotting:
Mixed 2D/3D plots (1/2): Mixed 2D/3D plots (1/2):
scriptscript
Question: Should contour()come before or after plot3d()?
Answer: Scilab accepts both alternatives, but with dramatically different results
Only the first flag[]argument of contour() has an influence on the plot
// plot3d-contour.sce
// Plot the combined 3D graph and contour /// of the function /// z=(2x^2 - y^2)exp(-x^2 - 0.5y^2), /// for -2<=x<=2 and -3<=y<=3 /
clear,clc,clf;x=linspace(-2,2,30);y=linspace(-3,3,30);[X,Y]=meshgrid(x,y);Z=(2*X.^2-Y.^2).*exp(-X.^2-0.5*Y.^2); // Same as beforecontour(x,y,Z,10,flag=[0,0,0]); // First flag[] argumentplot3d(x,y,Z,theta=60,alpha=80); // Turn 60 and 80 deg
Scilab has its own ideas of what it should do if a Scilab has its own ideas of what it should do if a contour()contour() command command is added to the script of a 3D plot command (is added to the script of a 3D plot command (plot3d()plot3d(), , surf()surf()). Trial ). Trial and error is neededand error is needed
Mixed 2D/3D plots (2/2): Mixed 2D/3D plots (2/2):
plotplot
The surface looks different from when it was plotted using surf().The reason is that the x and y axes are invertedcompared with the earlier case
No point in denying, there remains unsolved issues regarding the behavior of Scilab in this case
3D plot with hole3D plot with hole
The The %%nannan function allows certain z values to be excluded from a 3D function allows certain z values to be excluded from a 3D plot:plot:
// hole.sce
// 3D surface with a hole punched / // into it with the %nan command / // (z values not to be represented) /
clear,clc,clf;
function z = f(x, y) z=2*x^2+y^2;
endfunction
x = linspace(-1,1,50); y = linspace(-2,2,100); z = (feval(x,y,f))'; // Evaluate functionz(75:90,20:35) = %nan; // Definition of holesurf(x,y,z) // Plot surface
There is “Polish logic” behind the z arguments that asks for trial & error to get it right
subplot()subplot()
Subplots are a way of presenting multiple graphs on a single fraSubplots are a way of presenting multiple graphs on a single frameme The function The function subplot(m,n,psubplot(m,n,p)), or , or ((mnpmnp)), splits the Graphics Window , splits the Graphics Window
into m rows and n columns, and the subplot in case occupies into m rows and n columns, and the subplot in case occupies position p. In the case of four position p. In the case of four subwindowssubwindows, , subplot(22p)subplot(22p), the , the position of p is as shown:position of p is as shown:
WeWe’’ll do it for the ll do it for the z = (2*xz = (2*x22 –– yy22)exp()exp(--xx22 -- 0.5*y0.5*y22)), by fusing the , by fusing the four earlier cases into a single framefour earlier cases into a single frame
p=1 p=2
p=3 p=4
subplot(): demo scriptsubplot(): demo script
// subplot.sce
// Presents different aspects of /// the function /// z=(2x^2 - y^2)exp(-x^2 - 0.5y^2) /// in four subplots /
The The plot2d()plot2d() function has function has three variants:three variants:
plot2d2()plot2d2() for step functionsfor step functions
plot2d3()plot2d3() for vertical barsfor vertical bars
plot2d4()plot2d4() for arrow style linesfor arrow style lines
The effect of these plotting The effect of these plotting commands on the commands on the sincsinc()()function is shown on the next function is shown on the next slideslide
plot2d2(), plot2d3(), plot2d2(), plot2d3(),
plot2d4(): demo, plotplot2d4(): demo, plot
Note: You can still see the obsolete plot2d1() in manuals. plot2d()should be used instead (In contrast, plot3d1() is not declared obsolete)
Histograms: functions to Histograms: functions to
create them withcreate them with
Histograms are graphical presentationHistograms are graphical presentation——typically rectanglestypically rectangles——of oneof one--dimensional datadimensional data
ScilabScilab’’s main function for plotting histograms is:s main function for plotting histograms is:histplot(x,data,opt_argumentshistplot(x,data,opt_arguments))
Bar diagrams, a common form of histograms, are given by:Bar diagrams, a common form of histograms, are given by:bar(x,y,width,color,stylebar(x,y,width,color,style))
or, for or, for horizontal bars:horizontal bars:barh(x,y,width,color,stylebarh(x,y,width,color,style))
33--dimensional bar diagrams can be created by the command:dimensional bar diagrams can be created by the command:hist3d(z,opt_arguments)hist3d(z,opt_arguments)
and with added and with added xx and and yy vectors:vectors:hist3d(list(z,x,y),opt_arguments)hist3d(list(z,x,y),opt_arguments)
Check Check HelpHelp for more detailsfor more details
Histograms: demo, scriptHistograms: demo, script
The The script(sscript(s) below are intended to demonstrate different ) below are intended to demonstrate different types of histograms, presented as (22p) subplotstypes of histograms, presented as (22p) subplots
// Demonstration of histogram types /// using subplots /
clear,clc,clf;subplot(221)data=rand(1,10000,'normal');histplot(20,data) // Traditional histogram
subplot(222)y=[1 3 5 6 8];z=[y;4 3 2 2 1]'; // Transpose necessary!bar(z,0.7,'stacked') // “on top of each other”
The list() argument defines the distribution of random z values over the x,y plane
Histograms: demo, plotHistograms: demo, plot
Old graphics syntax Old graphics syntax
(1/2): demo, script(1/2): demo, script
// multiple_plots2.sce
// Demonstration of a method for producing /// three plots y1=f(x1), y2=f(x2),y3=f(x3) /// in the same frame. Note how the frame /// is defined /
clear,clc,clf;x1 = linspace(0,1,61);x2 = linspace(0,1,31);x3 = linspace(0.1,0.9,12);y1 = x1.*(1-x1).*cos(2*%pi*x1); // First graphy2 = x2.*(1-x2); // Second graphy3 = x3.*(1-x3) + 0.1*(rand(x3)-0.5); // Third, as y2 with disturbance
ymin = min([y1,y2,y3]); // Select minimum to define frame bottomymax = max([y1,y2,y3]); // Select maximum to define frame topdy = (ymax - ymin)*0.1; // Border for min/maxrect = [0,ymin - dy,1,ymax+dy]; // Frame limits, start at 0
plot2d(x1,y1,5,"011"," ",rect) // First call with frame definitionsplot2d(x2,y2,2,"000") // Second call, only type/color (2) definitionplot2d(x3,y3,-1,"000") // Third call, defines marks(-1)xtitle("THREE GRAPHS PLOTTED IN THE SAME FRAME","Abscissa","Ordinate")
ScilabScilab’’s graphics s graphics syntax changed with syntax changed with version 3.1.version 3.1. This This demo shows the old demo shows the old plot2d()plot2d() syntax for syntax for a case with three a case with three plots,plots,
The rotation surface is created by multiplying the original function, which is redefined as 2+sin(T), by .*sin(PHI)and .*cos(PHI)
// log_plot.sce
// Plot the Bode diagram for the function / // G(s) = 100/((s-10)(s-90)). Use the normal / // logarithmic x-axis and decibel scale on / // the y-axis /
clear,clc,clf; w = logspace(-1,3,100); // Define log scale for w s = %i*w; // Define imaginary sG = 100../((s-10).*(s-90)); // Define G(s) y = 20*log10(abs(G)); // Define dB scale for yplot2d(w,y,5,logflag='ln') // Plot y=f(w)xtitle("Bode plot for G(s)=100/((s-10)(s-90))","w,...
log scale","y, dB scale") xgrid() // Add grid
Logarithmic scale:Logarithmic scale:
task & scripttask & script
Plot the Bode diagram for the Plot the Bode diagram for the functionfunction
where s = iwhere s = iωω and the angular and the angular frequency frequency ωω = 0.1 = 0.1 …… 10001000
Note double dots Note double dots 100../(s100../(s--10)10) in the G command. First in the G command. First dot is a decimal point, then dot is a decimal point, then comes the Dot Operator comes the Dot Operator
Put the logarithmic Put the logarithmic ωω--axis axis horizontally and the decibel horizontally and the decibel scale y=20(scale y=20(||G(G(ωωi)i)||) vertically) vertically
(s-10)(s-90)
100G(s) =
logspace(-1,3,100) = “from 10-1 to 103 in 100 logarithmically spaced increments”
Logarithmic scale:Logarithmic scale:
the plotthe plot
The graph has been edited after plotting
We have not before mentioned the argument logflag ‘ln’ in plot2d(). Change ‘ln’ to ‘nn’ (‘ll’ is not possible here) and see how the plot changes (n=normal, l=logarithmic)
Note: Scilab has a special function for Bode plots, bode(). See Example 3-1
Polar coordinatesPolar coordinates
Polar coordinates are used Polar coordinates are used frequently in some areas of frequently in some areas of engineering, e.g. to present engineering, e.g. to present antenna lobe diagramsantenna lobe diagrams
Plotting in polar coordinates is Plotting in polar coordinates is done by the command done by the command polarplotpolarplot()()
The demo shows the simple The demo shows the simple script for a script for a cardioidcardioid,,y = 1y = 1--cos(x)cos(x), and its plot, and its plot
Note the markers related to Note the markers related to the the style= [style= [--3]3] argument argument
The plot has been edited, The plot has been edited, which is time consuming for which is time consuming for polar plotspolar plots
//cardioid.sce
// The script plots the cardioid /// r = 1 - cos(x), for x = 0...2pi /
Scilab plots can be exported in various picture formats (PNG, SVG, GIF, Bitmap, etc.) for use in documents
To export, Click To export, Click File/Export to...File/Export to... in the Graphics Window and in the Graphics Window and select the target file as well as the wished formatselect the target file as well as the wished format
An alternative way is to use the An alternative way is to use the xs2*()xs2*() function which for PNG function which for PNG takes the formtakes the form
The following The following vectorialvectorial and and bitmapbitmap formats are possible:formats are possible:
xs2png() export to PNGxs2pdf() export to PDFxs2svg() export to SVGxs2eps() export to EPSxs2ps() export to Postscriptxs2emf() export to EMF (Windows)
xs2fig() export to FIGxs2gif() export to GIFxs2jpg() export to JPGxs2bmp() export to BMPxs2ppm() export to PPM
Handles (1/12): Handles (1/12):
introduction*introduction*
*) Recall the introduction to handles in Chapter 2. Handles were already used in Example 2-3and when discussing polylines. This discussion is based on Kubitzki: Grafik, Eigenschaften verwalten in Scilab, section 2.4.3 in Champbell et al., and Steer: Scilab Graphics, 2007.
Handles are a thorny subject to Scilab Handles are a thorny subject to Scilab newbiesnewbies. Existing texts give . Existing texts give only an incoherent treatment of the topic. The user is left withonly an incoherent treatment of the topic. The user is left with the the option option ““try and crytry and cry””
We shall limit this discussion to the most essential handle propWe shall limit this discussion to the most essential handle properties, erties, aiming at gaining a basic understanding of how plots are edited aiming at gaining a basic understanding of how plots are edited with with handleshandles
It may help to view handles as an alternative to the Figure EditIt may help to view handles as an alternative to the Figure Editor or that we already have used. The idea is the same in boththat we already have used. The idea is the same in both
The The Help BrowserHelp Browser discusses the subject under the heading discusses the subject under the heading graphics_entitesgraphics_entites. Check also . Check also object_editorobject_editor
Handles (2/12): Handles (2/12):
introduction*introduction*
The Graphics Window is built as a The Graphics Window is built as a hierarchyhierarchy of objects. See the of objects. See the hierarchic tree presented on the next slide, which also gives tyhierarchic tree presented on the next slide, which also gives typical pical commands for each entitycommands for each entity
The topmost object in the window is called The topmost object in the window is called FigureFigure. We use the . We use the function function gcfgcf()() , , get current figureget current figure, to influence the window as it pops , to influence the window as it pops up on the screen. This is done with the handle up on the screen. This is done with the handle f = f = gcfgcf()()
Figure has a child called Figure has a child called AxesAxes, which in turn has several , which in turn has several childrenchildren, and , and these again may have own children. Axes is called by the functiothese again may have own children. Axes is called by the function n gcagca()(), , get current axesget current axes. The handle in case is . The handle in case is a = a = gcagca()(), but the , but the alternative alternative a = a = f.childrenf.children also works also works
Pay attention to Pay attention to CompoundCompound, which has the important children , which has the important children LabelLabeland and PolylinePolyline. The latter refers to the actual graph that we plot. The latter refers to the actual graph that we plot
Figure can have other children beside Axes. These are created byFigure can have other children beside Axes. These are created byScilab when we use certain commandsScilab when we use certain commands
Compare with the structure of the Graphics Editor’s Object Browser that we have used to edit plots
Handles (3/12): basic Handles (3/12): basic
graphics hierarchygraphics hierarchy
h = gcf(); // Get figure handle
a = gca(); // Get axes handle ora = h.children;
x = a.x_label // Get x_label handle
y = a.y_label // Get y_label handle
z = a.z_label // Get z_label handle (3D graphics)
t = a.title // Get title handle
c = a.children // Get compound handle
leg = c.children(1) // Get legend handle (if any)
pol = c.children(2) // Get polyline handle (first graph in plot)
legend
polyline
x_label
y_label
z_label
title
compound
Figure
Axes
etc.
Handles (4/12): demo, Handles (4/12): demo,
starting pointstarting pointAs a first exercise, let’s start from the script that was used in the introduction to handles in Chapter 2:
// handles_demo1.sce
// Basic script to demonstrate handles /
x = linspace(0, 4*%pi, 100); plot2d(x, 0.5*cos(x))
Lessons learned:1) You have to be systematic when working with handles2) The existing literature is not always correct. For instance, the
method suggested by Steer for changing axes ticks & marks simplydoes not work (took me hours to figure out)
Handles (5/12): demo, Handles (5/12): demo,
behind the scenebehind the scene
When we call up the Axes handle on the Console, it turns out to be really long. On the top of the list we find that Axes has a child, Compound
-->gca() ans = Handle of type "Axes" with properties: ================================= parent: Figure children: "Compound“…
-->gce() ans = Handle of type "Compound" with properties: ==================================== parent: Axes children: "Polyline" visible = "on" user_data = []
A check with gce() reveals that Compound in turn has a child, Polyline. This matches the hierarchy that we have seen on the Figure Editor
Handles (6/12): demo, Handles (6/12): demo,
step 1step 1We first define some changes to the window:
- Adjust the window size- Add background color- Give the window a name
// handles_demo1.sce
// Basic script to demonstrate handles /
clear,clc,clf;
x = linspace(0, 4*%pi, 100); plot2d(x, 0.5*cos(x))
step 4step 4Title and axis labels have been added, the next step is to edit them
In each case we must first call the respective handle (or skip this stage by writing editing commands in the form a.title.font_style … etc.), then edit the handle properties
The plot isn’t exactly a beauty, but we’ll add a grid and edit axes ticks & marks
xtitle('COSINE PLOT',... // Add title & labels'X-axis','Y-axis');
t=a.title; // Get title handlet.font_style = 5; // Times bold, italict.font_size = 3; // Increase font size
xL=a.x_label; // Get x_label handlexL.font_style = 5; // Times bold, italicxL.font_size = 2; // Increase font size
yL=a.y_label; // Get y_label handleyL.font_style = 5; // Times bold, italicyL.font_size = 2; // Increase font size
Check for details under label_properties in the Help Browser
Note: There were problems with ticks & marks. Only the presented syntax worked
Handles (11/12): Handles (11/12):
comments (1/2)comments (1/2)
With handles we must observe the order of Scilab commands. For With handles we must observe the order of Scilab commands. For instance, a script of the following type causes an error messageinstance, a script of the following type causes an error message from from Scilab:Scilab:
The The error message confuseserror message confuses by referring to a by referring to a submatrixsubmatrix
The real reason is that we try to change the color of the plotteThe real reason is that we try to change the color of the plotted d graph after the legend was declared. Scilab cannot jump back to graph after the legend was declared. Scilab cannot jump back to the the legend and change it. legend and change it. The legend command has to come after The legend command has to come after related handle declarationsrelated handle declarations. But there exceptions..... But there exceptions....
at line 6 of function %h_get called by : at line 16 of function generic_i_h called by : at line 2 of function %s_i_h called by : children(1).foreground = 5; // Sum pattern reat line 68 of exec file called by : opulse_a-pattern.sce', -1
Handles (12/12): Handles (12/12):
comments (2/2)comments (2/2)
Handle commands are valid only Handle commands are valid only specific levels (Figure, Axes, Entity, specific levels (Figure, Axes, Entity, etc.). etc.). Help/Help/axes_propertiesaxes_properties gives gives some hints but mostly you try & some hints but mostly you try & cry and get error messagescry and get error messages
ScilabScilab has a has a hidden agendahidden agenda when it comes to handles. For instance, when it comes to handles. For instance, the the polylinepolyline numbering works in quite strange ways...numbering works in quite strange ways...
Visual edition with handles undoubtedly improves the look of a Visual edition with handles undoubtedly improves the look of a figure, but is the method an figure, but is the method an ““overkill?overkill?”” The amount of code needed The amount of code needed to edit the plot can be larger that used to create the actual plto edit the plot can be larger that used to create the actual plotot
We should consider that We should consider that time = moneytime = money. The important thing is to . The important thing is to come up with a script that is come up with a script that is ““fit for purposefit for purpose..”” The rest is luxuryThe rest is luxury
It is possible to change ScilabIt is possible to change Scilab’’s default settings, but information on s default settings, but information on the subject is hard to come by (the subject is hard to come by (KubitzkiKubitzki discusses it briefly)discusses it briefly)
!--error 999 This object has no auto_clear property.at line 4 of function generic_i_h called by : at line 2 of function %c_i_h called by :
e2.auto_clear = "on";at line71 of exec file called by : examples\planet_moon1.sce', -1
scriptscript This is an This is an attemptattempt to see how to see how
well we can work without well we can work without ordinary plot functionsordinary plot functions
Compare with the Compare with the xpolyxpoly()()example given in example given in Help Help and which and which uses the obsoleteuses the obsolete xsetxset() () functionfunction
The The xpolyxpoly()() function draws a function draws a polylinepolyline; the ; the polylinepolyline is a closed is a closed polygon if the numeric argument polygon if the numeric argument of of xpolyxpoly()() is >0is >0
Note the Note the e.parente.parent..... definition ... definition that refers one step up in the that refers one step up in the hierarchy, to Figurehierarchy, to Figure
With With e.childrene.children..... we move one ... we move one step down in the hierarchystep down in the hierarchy
// xpoly.sce
// Attempt to plot a hexagon with xpoly() & edit / // with handles. Causes erroneous behavior in / // Scilab. The script must be closed to get rid of /// the grey background color /
Scilab showed unexpected behavior with this script:Scilab showed unexpected behavior with this script:–– The background color could The background color could turn blackturn black with the command with the command e=e=gcegce();();
e.parent.backgrounde.parent.background=34 =34 . The . The gcfgcf()() handle revealed that the setting handle revealed that the setting was was background=background=--22 and the handle command had no effect. The and the handle command had no effect. The definition definition color(color(‘‘greygrey’’)) feels more stabile than its numeric counterpartfeels more stabile than its numeric counterpart
–– The Graphics Window did not always change when the script was The Graphics Window did not always change when the script was changed and executed. The background stayed grey even if changed and executed. The background stayed grey even if e.parent.backgrounde.parent.background==color(color(‘‘greygrey’’)) was deleted. When shifting was deleted. When shifting between two scripts on the Editor, the background color was expobetween two scripts on the Editor, the background color was exported to rted to the second script. The script had to be closed to get rid of thethe second script. The script had to be closed to get rid of the gray color gray color
–– I found I found no way to add ticksno way to add ticks & marks to the box. The Axes handle & marks to the box. The Axes handle gcagca()()showed them as defined, but for some reason they are suppressed.showed them as defined, but for some reason they are suppressed.Help/Help/axes_propertiesaxes_properties gives no explanationgives no explanation
Lessons learnedLessons learned: Do not exaggerate the extent to which you trade : Do not exaggerate the extent to which you trade ordinary plot functions (ordinary plot functions (plot()plot(), , plot2d()plot2d()) for handle commands) for handle commands
Change and rerun
Programming pitfalls: Programming pitfalls:
dondon’’t forget t forget clfclf;;
// ptifalls_1.sce
// Clear commands /
K = 10; a = 0; b = 0;x = zeros(1,K); y = zeros(1,K);for k = 1:Kx(k) = a+k;y(k) = b-k^(0.5);
endplot2d3(x,y,style=-1)
// ptifalls_1.sce
// Clear commands /
K = 100; a = 0; b = 0;x = zeros(1,K); y = zeros(1,K);for k = 1:Kx(k) = a+k;y(k) = b+k^(0.5);
endplot2d3(x,y,style=-1)
Plots are superposed without the clf command
What to do with What to do with xsetxset()?()?
Examples in Scilab literature—and in blog discussions—frequently use the function xset(). It’s handy but obsolete, so what should we do about it?
The Help Browser recommends using the graphic objects representation instead ((set()set(), , get()get(), handle commands), handle commands)
Below are examples of how to substitute xset(). Note that xset() operates on the current Entity level and gives the blue axes color, not the red graph
Example 6-2 (last set of examples) is adapted from PinPinççonon. The original contained obsolete commands, in particular xset(). I substituted the xset() commands with the following handle commands:
But frankly, it can be a pain and you want to throw the computer out the window. If so, check if the gca() handle has any children at all...
Flawed error messagesFlawed error messages
ScilabScilab’’s debugger shows strengths and flaws in the error messages s debugger shows strengths and flaws in the error messages that invariably pop up before onethat invariably pop up before one’’s plot commands are rights plot commands are right
Here are two error messages that I have got:Here are two error messages that I have got:
clc(); !--error 13 Redefining permanent variable.
while executing a callback
Bogus warning, Scilab crashed and had to be reloaded to erase the Console. This occurred when I used two deff() functions in tandem
first and second arguments have incompatible dimensions.at line 16 of exec file called by :
exec("H:/Dr.EW/Writings/Scilab examples/derviative_2.sce");while executing a callback
The real problem was that I had not used the Dot Operator in the equation for y1
More info on plottingMore info on plotting
In the Help Browser, Click: Graphics Library, and under it you find info on e.g.
- 2D plots- 3D plots- axes_operations/axes_properties
etc.
Now at least is the time to get familiar with the Help Browser
Dr.EWJohnny Heikell
Dr.EWJohnny Heikell
8. Examples, Set 38. Examples, Set 3
On plotting, handles, control On plotting, handles, control engineering, and user defined engineering, and user defined functionsfunctions
Return to Contents
Example 3Example 3--1: More 1: More
control engineering plotscontrol engineering plots Example 2Example 2--3 3 and the log scale demo were typical control engineering and the log scale demo were typical control engineering
tasks. tasks. Recall also the pages on polynomials in Recall also the pages on polynomials in Chapter 3Chapter 3 Here weHere we’’ll look at examples with Bode and ll look at examples with Bode and NyquistNyquist plots, Nichols plots, Nichols
chart (Blackchart (Black’’s diagram), and an Evans root locus plots diagram), and an Evans root locus plot The first cases use the secondThe first cases use the second--order transfer functions order transfer functions
The Evans root locus is plotted forThe Evans root locus is plotted for
G2(s) = *s2 + 20s + 100
s2 + 6s + 100
s2 + 3s + 220
s2 + 25s + 225
5 + s
2000s2 + 200s3 + 25s4 + s5G4(s) = 352 *
Ex 3Ex 3--1:1:
scriptscript
// control_eng.sce
// Plot Bode, Nyquist, Nichols & Black's, /// and Evans for defined equations /
// Evans root locus://-------------------------subplot(224)evans(Gain4,100) // Evans root locus for sys4
The first two gain equations The first two gain equations are given as ordinary are given as ordinary polynomial expressionspolynomial expressions
The third gain equation, to The third gain equation, to be used in plotting Evans be used in plotting Evans root loci, is defined through root loci, is defined through its its rootsroots
The Bode plot is only for the The Bode plot is only for the gain, later the alternative gain, later the alternative bode()bode() will be demonstratedwill be demonstrated
Scilab talks about BlackScilab talks about Black’’s s diagram rather than Nichols diagram rather than Nichols chart. Example 3chart. Example 3--2 highlights 2 highlights the difference between the the difference between the twotwo
Ex 3Ex 3--1: plot1: plot
The plot has not been edited, everything shown is the result of the script. Note the red iso-curves on the Bode-Nichols subplot
The next slide looks at how alternative Bode plot commands operate
// bode_comparison.sce
// Compare the how the bode() and gainplot() /// functions operate in Example 7 /
// Plot with the bode() function://------------------------------------------subplot(121)bode([Gain2;Gain1],0.01,100)legend(‘Gain1',‘Gain2')xtitle('PLOTTED WITH bode()')
// Plot with the gainplot() function://-----------------------------------------------subplot(122)gainplot([Gain2;Gain1],0.01,100)legend(‘Gain1',‘Gain2')xtitle('PLOTTED WITH gainplot()')
Ex 3Ex 3--1: alternative Bode 1: alternative Bode
plot functionsplot functionsThis example demonstrates the bode() and gainplot()functions when operating on the earlier Gain1 and Gain2 expressions. bode()plots also the phase
Ex 3Ex 3--1: comments1: comments
The script was modified after being copied from the Scilab GroupThe script was modified after being copied from the Scilab GroupUserUser’’s Manual and pasted into Editor. When copys Manual and pasted into Editor. When copy--pasting, Editor pasting, Editor tends to interpret citation marks (tends to interpret citation marks (‘‘cc’’,,‘‘ss’’, etc.) wrongly and they have , etc.) wrongly and they have to be corrected manuallyto be corrected manually
Scilab is strict with the arguments for polynomial expressions. Scilab is strict with the arguments for polynomial expressions. If, for If, for instance, the instance, the ‘‘cc’’ is left out from the expression is left out from the expression poly([0,0,2000,200,25,1],poly([0,0,2000,200,25,1],’’ss’’,,’’cc’’), it will be translated into 10000000s), it will be translated into 10000000s2 2
There is an advantage in using selfThere is an advantage in using self--documenting expressions, here documenting expressions, here exemplified by naming the polynomials Gain1, Gain2, etc.exemplified by naming the polynomials Gain1, Gain2, etc.
The separate Bode plot demo showed that the The separate Bode plot demo showed that the bode()bode() function has function has an advantage in providing also the phase of the system of interean advantage in providing also the phase of the system of interestst
The difference between BlackThe difference between Black’’s diagram and Nichols chart will be s diagram and Nichols chart will be demonstrated in Example 3demonstrated in Example 3--22
Example 3Example 3--2: Black vs. 2: Black vs.
NicholsNichols
This example, adapted from Povy’stutorial, p. 78, shows what the chart() command adds to Black’s diagram
The first vector argument of chart() defines the iso-gain curves to be plotted
The second argument defines iso-phase curves
list() defines plotting properties (the last argument does not have any effect)
Check with Help for details
// black_nichols.sce
// Demonstration of black() and /// chart() functions /
clear,clc,clf;
s = %s;Gain = (2+3*s+s^2)/(1+3*s+2.5*s^2+s^3);system = syslin('c',Gain);
LetLet’’s do a Bode plot using just s do a Bode plot using just basic circuit theory and no basic circuit theory and no Laplace rubbishLaplace rubbish
The case is the simple RC The case is the simple RC circuit to the right (firstcircuit to the right (first--order order lowlow--pass filter)pass filter)
The task is to plot both the The task is to plot both the magnitude (gain) and phasemagnitude (gain) and phase
The The bode()bode() function is not function is not suitable for this case, instead suitable for this case, instead wewe’’ll used ll used plot2d()plot2d() and define and define it separately for magnitude it separately for magnitude and phaseand phase
G = = 1 + i2 π f RC
1uout
uin
Ω
// bode_RC.sce
// Bode diagram for an RC circuit /// (first-order low-pass filter) /
clear,clc,clf;
R = 1e+3; // Resistance in ohmC = 1e-7; // Capacitance in faradfreq = logspace(1,6,60); // Frequency range, logarithmicG = 1 ./ (1 + %i*2*%pi*freq*R*C); // Transfer functionG_dB = 20*log10(abs(G)); // Logarithmic scalephase = ((atan(imag(G),real(G)))/(%pi))*180; // Phase
subplot(211); // Amplitude plotplot2d(freq,G_dB,logflag='ln',style=5)xgrid(2) // Blue gridxtitle('Amplitude','Frequency (Hz)','Gain (dB)')
subplot(212) // Phase plotplot2d(freq,phase,logflag='ln',style=2)xgrid(3) // Green gridxtitle('Phase','Frequency (Hz)','Phase (deg)')
Ex 3Ex 3--3: script3: script
The The logspace(1,6,60)logspace(1,6,60)command means starting command means starting point 10point 1011, end point 10, end point 1066, , in 60 steps and in 60 steps and logarithmic scalelogarithmic scale
Trigonometric phase Trigonometric phase definition and conversion definition and conversion to degreesto degrees
The The logflaglogflag = = ‘‘lnln’’argument defines a argument defines a logarithmic xlogarithmic x--scale and scale and linear (normal) ylinear (normal) y--scalescale
Different styles and Different styles and xgridxgrid()() arguments have arguments have been used to been used to demonstrate their effectdemonstrate their effect
Ex 3Ex 3--3: plot3: plot
Note that the x-axis label is missing for the phase plot, although it was specified. Scilab does not repeat it since it is the same as the top one. Change the subplot declarations to (121) and (122) and the x-axis label is given for both parts
Example 3Example 3--4: linear 4: linear
antenna arrayantenna array
Radiatingelements
Phaseshifters
......
...... d
Phase front
θ
α2α3αnαN
n 123N
α1
Amplitudeweights
(n-1)·d·sinφθ
En
w1wn w2w3
wN
| AF | =·sin θ ]sin [ Nπ ( )
λd
·sin θ ]sin [ π ( )λd
The task is to investigate the behavior of the Array Factor, AF (also know as field intensity pattern), of a linear antenna array with N = 10 isotropic radiating elements, when the main beam is scanned at θo = 60º and element spacing d = 0.45 and 0.55 wavelengths
(For a discussion on antenna arrays, see Brookner, E. (ed): Practical Phased Array Antenna Systems, Artech House, 1991)
Ex 3Ex 3--4: beam scanning4: beam scanning
The previous expression for AF is valid when the beam is normal to the array axis (broadside case). If the beam is deflected, the scan angle θo must be included in the equation
(In a more complete simulation we must also include element factors, tapering, and mutual coupling between the array elements)
| AF | =·(sin θ - sin θo)]sin [ Nπ ( )
λd
·(sin θ - sin θo)]sin [ π ( )λd
Scan angle
Scan angle
Ex 3Ex 3--4: 4:
scriptscript
This script is for the previous expression for AF, but normalized (divided by N) to keep the main beam value at unity. The phase functions have been defined separately in order to shorten the expression for AF_norm
The array factor is plotted both in linear and polar presentation
// array_factor.sce
// ---------------------------------------------------------------------------------/// Plots the array factor of a linear antenna array with N elemnts, /// spaced at d wavelengths, and main beam scanned at +60 degrees /// ---------------------------------------------------------------------------------/
clear,clc,clf;
// Variables:N = 10; // Number of radiating elementsd1 = 0.45; // Element spacing in wavelengthsd2 = 0.55; // Dittotheta = [-%pi/2:0.01:%pi/2]'; // Half space, +/-90 degtheta_z = %pi/3; // Scan angle
subplot(212) // Polar diagram (d=0.55)polarplot(theta,AF_norm2, style=5) xtitle('POLAR DIAGRAM FOR d = 0.55:')
Ex 3Ex 3--4: plot4: plot
The plot verifies the common rule of thumb, according to which the array element spacing must satisfy the condition d < λ/2 or detrimental grating lobes will show up
Note that there is a mirror image in the other half space, only the ±90º case has been plotted
Main lobeGrating lobe
Main lobe
Grating lobe
Ex 3Ex 3--4: modified plot4: modified plot
This case shows d=0.45 This case shows d=0.45 only. Other changes are:only. Other changes are:–– Element spacing d = Element spacing d =
0.750.75–– Element number N = 30Element number N = 30–– Scan angle = Scan angle = --3030ºº
Scilab 5.1.1 tended under Scilab 5.1.1 tended under conditions like these to conditions like these to present only a part of the present only a part of the polar plot, but at the polar plot, but at the same time increase the same time increase the size and let the polar plot size and let the polar plot overflowed the linear plot overflowed the linear plot (which wasn(which wasn’’t bad). This t bad). This seems to have changedseems to have changed
Main lobe Grating lobe
// sinc_colormap.sce
// Define and plot 3D sic funtion, graphic /// adjust properties with handles /
clear,clc,clf; x=linspace(-10,10,50); // Linear space of xy=x; // Ditto for y
// Plotting & plot control://--------------------------------drawlater(); // Suppress plotting until ready
plot3d(x,y,w); // (Suppressed) plot functionf=gcf(); // Get Figure handlef.color_map = coppercolormap(32); // Set color tableh=gca(); // Get Axes handlesh.rotation_angles=[87,42]; // Set angle of observationh.children.color_flag=1; // Use current color tablextitle('sinc()','X','Y','Z'); // Title & legend
drawnow(); // Plot now
Example 3Example 3--5: 5:
3D 3D sincsinc
This example is adapted from Kubitzki, Einführung in Scilab, pp. 41-42, and can be compared with the earlier one for plotting a 3D sinc function
The script introduces the use of colormaps to identify graphics colors. The argument of coppercolormaps() defines the number of colors in the map; 32 is typical
Note that color_map works on the Figure level (f=gcf())
Here we use the pair drawlater() and drawnow()to control the plot process
Ex 3Ex 3--5: 3D 5: 3D sincsinc, plots & , plots &
commentscommentsScilab has numerous colormap alternatives that allow the color of a 3D plot to be changed, e.g. the ones shown here. Check Help/Color management/colormap for more alternatives
coppercolormap()
hotcolormap()hsvcolormap()
Example 3Example 3--6: 6: LissajousLissajous
figures, taskfigures, task
The task is to write a script that generates The task is to write a script that generates LissajousLissajous figures and to figures and to edit the figure with handlesedit the figure with handles
LissajousLissajous figures are familiar to all who have worked with an figures are familiar to all who have worked with an oscilloscope in high school physics laboscilloscope in high school physics lab
Mathematically Mathematically LissajousLissajous figures are the graph of a system of figures are the graph of a system of parametric equations of the type:parametric equations of the type:
x = Ax = A ·· (sin((sin(ωωt) + t) + φφ))y = By = B··sin(sin(ωωt)t)
We shall plot two figures in one window, the combination ofWe shall plot two figures in one window, the combination of
For comparison we first do a basic plot with For comparison we first do a basic plot with plot2d()plot2d() and then modify and then modify the figure with handlesthe figure with handles
Ex 3Ex 3--6: 6: LissajousLissajous figures, figures,
script 1script 1
// handles_demo2-1.sce // Two Lissajous figures, sin(t) & cos(3t) and / // sin(1.5t) & 0.5*cos(1.5t), with plot definitions / // given by arguments of the plot2d() function /
Sine and cosine functions are Sine and cosine functions are grouped into matricesgrouped into matrices
The The plot2d()plot2d() argument argument [2,5][2,5] defines graph colorsdefines graph colors
The argument The argument legleg defines defines the legendthe legend
The argument The argument naxnax defines defines axes divisionsaxes divisions
The argument The argument rectrect defines defines the extension of x and y axesthe extension of x and y axes
Ex 3Ex 3--6: 6: LissajousLissajous figures, figures,
plot 1plot 1
The figure defined by sin(t), cos(3t) has not quite finished a full loop (its reach is defined by the argument 6 in linspace())
The second figure, sin(1.5t), 0.5*cos(1.5t), is already on its second loop. The ellipsebecomes a circle if we change the cosine amplitude to 1
Pay attention to the fact that plot2d() combines sines and cosines arguments element-by-element
That was the basic thing, how do we improve it?
Ex 3Ex 3--6: 6: LissajousLissajous figures, figures,
plot 2plot 2
This is the plot that has been modified using handles.* The script is presented on the next four slides
Major modifications are:
- Both Lissajous figures arearrow style, one line is dash-dotted
- Title and axes labels havebeen added & edited
- Background color has been added
- The legend box has been putin the lower right-hand corner,text edited and box coloradded
- A grid was added & edited *) Ok, I have done some additions as well.
// handles_demo2-3.sce
// Two Lissajous figures, sin(t) & cos(3t) and /// sin(1.5t) & 0.5*cos(1.5t), with plot edited /// using handles /
clear,clc,clf;
// Plot Lissajous figures://-------------------------------x=linspace(0,6,40)'; // 40 steps to allow arrowssines = [sin(x) sin(1.5*x)]; // First figurecosines = [cos(3*x) 0.5*cos(1.5*x)]; // Second figureplot2d(sines,cosines,rect=[-1.1,-1.1,1.1,1.1])
// Add background color://--------------------------------f=gcf(); // Get Figure handle
f.background=color('grey'); // Grey background color
Ex 3Ex 3--6: 6: LissajousLissajous figures, figures,
script 2 (1/4)script 2 (1/4)
# of # of linspacelinspace()() steps is steps is lowered to 40 to better lowered to 40 to better show the arrows that are show the arrows that are used belowused below
The body of The body of plot2d()plot2d() is is retained, the reminder will retained, the reminder will be done with handlesbe done with handles
The figure handle is called The figure handle is called by by gcfgcf()(), after which the , after which the figure background color figure background color can be defined (addition can be defined (addition to Script 1)to Script 1)
p1.children(1).polyline_style=4; // Arrow modep1.children(1).foreground=2; // Change color to bluep1.children(1).arrow_size_factor=2; // Line thickness
p2=a.children; // sin(x), cos(3x)p2.children(2).line_style=4; // Dash-dot linep2.children(2).foreground=5; // Change color to redp2.children(2).polyline_style=4; // Arrow modep2.children(2).arrow_size_factor=2; // Line thickenss
leg.font_style=2; // Font: Timesleg.font_size=2; // Increase legend font sizeleg.font_color=1; // Font color blackleg.background=7; // Yellow legend box fill
Ex 3Ex 3--6: 6: LissajousLissajous figures, figures,
script 2 (3/4)script 2 (3/4)
xx-- and yand y--axis ticks & marks axis ticks & marks (legends) are added(legends) are added
Axes label font color & size Axes label font color & size are redefinedare redefined
Note that Ticks and Note that Ticks and Legends (marks) are Legends (marks) are children to Axes, similar to children to Axes, similar to LabelsLabels
A legend is added & editedA legend is added & edited
Ex 3Ex 3--6: 6: LissajousLissajous figures, figures,
script 2 (4/4)script 2 (4/4)
To finish, the grid is turned To finish, the grid is turned ““onon””and line colors editedand line colors edited
Scilab does not have an Scilab does not have an equivalent for equivalent for MatlabMatlab’’ss ““grid on,grid on,””this is a way of circumventing this is a way of circumventing the problemthe problem
a.grid(1)=color('green'); // Vertical line colora.grid(2)=color('green'); // Horizontal line color
There were huge problems when I first tried to include the gce(), get current Entity, command in the script. The background color did not come up after Scilab was reloaded, I could not define ticks, etc.
Lessons learned: Be sure that you now what you do with gce()!
Ex 3Ex 3--6: 6: LissajousLissajous figures, figures,
checkcheckAfter all these modifications, let’s make sure that we can recall the basic plot by adding the following lines at the end of the script:
When we run the script, Scilab briefly flashes the modified plot,* deletes it, and puts up this window instead. The basic Lissajous figures seem to be ok
*) You can use the function pair drawlater() and drawnow() to avoid the flashing, as was done in Ex 3-5.
Dr.EWJohnny Heikell
Dr.EWJohnny Heikell
9. Converting 9. Converting MatlabMatlab
filesfiles
The embedded The embedded MatlabMatlab--toto--ScilabScilabtranslator seems to work and translator seems to work and manual conversion is an optionmanual conversion is an option
Return to Contents
Tips on Tips on MatlabMatlab to Scilab to Scilab
conversionconversion
About halfway down the Help Browser (which is not in any logical order) you find Matlab to Scilab Conversion Tips. You will see a long list of the m2sci_... type of functions
Click on the first subheading, Matlab-Scilab equivalents, and you get a list of Matlabfunctions and their Scilab equivalents (missing ones are not included, like text() and xlim()mentioned below)
Using the integrated Using the integrated MatlabMatlab--
toto--ScilabScilab translatortranslator
Scilab can convert Scilab can convert MatlabMatlab’’ss .m files to ..m files to .scisci files, although we should files, although we should not expect the conversion to be fully successful every time. Thenot expect the conversion to be fully successful every time. Thetranslated script may have to be modified manuallytranslated script may have to be modified manually
We start by opening the translator: *We start by opening the translator: *
On the Console, Click:Applications\Matlab to Scilab translator
What happens next you can se on the following slide
*) It used to be possible to import Matlab files directly, but this option does not exist any more.
MM--toto--S translator: the S translator: the
processprocess
The conversion tool opens
1. Click: (File name) Browseand identify the file that you want to translate
2. Click: (Directory name) Browse to point out where to put the translated script (and associated products*)
3. Click: Convert
*) The conversion produces two text documents and two .sci scripts
MM--toto--S translator: S translator:
messages on the Consolemessages on the Console
Scilab presents a list of translation conditions and also warnings of possible errors on the Console. The warnings are repeated as comments in the script (and on one of the text documents)
Next, open the translated script in the Editor
MM--toto--S translator: script S translator: script
(1/4)(1/4)
// Display modemode(0);
// Display warning for floating point exceptionieee(1);
clear,clc,// !! L.4: All children will be deleted, no HandleVisibility property in Scilab graphics.clf;
// Normalized Aperture Widthna = 4;
// Sampling Frequeny=Number elements per norm aperturefs = 8;
Statement & warning added by Scilab
Here comes the second warning. The Matlab command was clear,clc,clf;. May be of importance if the script is edited with handles. In such a case, try to create a new script by copy-pasting
This is the script that the translator delivers. It contains comments that may or may not be of importance:
MM--toto--S translator: script S translator: script
(2/4)(2/4)
// Norm aperture with N elementsN = fs*na;xna = na*(-1/2:1/(N-1):1/2);
Here comes more warnings. May relate to a rounding error
MM--toto--S translator: script S translator: script
(4/4)(4/4)
// Plot Monopulse Antenna Pattern
plot(fi,Gfi,fi,Gfs);mtlb_grid;set(gca(),"data_bounds",matrix([-0.25,0.25,-0.8,1],2,-1));ylabel("Amplitude");xlabel("Angle - radians");title("Monopulse Antenna Patterns");// !! L.63: Matlab function text not yet converted, original calling sequence used.text(0.04,0.8,"Sum Pattern");// !! L.64: Matlab function text not yet converted, original calling sequence used.text(-0.22,0.6,"Difference Pattern");
Note that title() is an alternative to xtitle()
Here come the last warnings. The next slide shows what they mean
Well, let’s see how Scilab reacts by executing the script...
MM--toto--S translator: plotS translator: plot
Yeees, it comes, labels and all!
But the legends are missing, which means that Scilab cannot cope with Matlab’s text()function
MM--toto--S translator: S translator:
commentscomments
Based on this example one could say that the embedded Based on this example one could say that the embedded MatlabMatlab--toto--ScilabScilab translator is adequate translator is adequate
A legend has to be added manually to compensate for the missing A legend has to be added manually to compensate for the missing text()text() information*information*
The example demonstrates partly good programming practice by The example demonstrates partly good programming practice by declaring each logical entitydeclaring each logical entity. However, informative explanations . However, informative explanations could be added could be added
Another improvement is to use Another improvement is to use expressive variable namesexpressive variable names. Why not . Why not talk about talk about sampl_freqsampl_freq instead of instead of fsfs, and what does , and what does wxnawxna()() stand stand for? for?
Help Help sheds no light over the meaning of the second .sheds no light over the meaning of the second .scisci files that the files that the conversion producesconversion produces
*) A paper by Sharma & *) A paper by Sharma & GobbertGobbert(2010) reports that the translator cannot (2010) reports that the translator cannot cope with cope with MatlabMatlab’’ ss xlimxlim()() function. In their case the function. In their case the plot()plot() function had to function had to be manually changed to be manually changed to plot2d()plot2d() to correct the problem.to correct the problem.
To the right is a To the right is a MatlabMatlab code code (top) and its Scilab equivalent (top) and its Scilab equivalent (bottom). The way I did it:(bottom). The way I did it:
Checked visually for differences:Checked visually for differences:–– Comments: % Comments: % // // –– BuiltBuilt--in functions: pi in functions: pi %pi %pi –– Plot commands are split up on Plot commands are split up on
multiple rows. Indents are not multiple rows. Indents are not necessary, but a visual helpnecessary, but a visual help
Changed what I could, the run Changed what I could, the run the script and let Scilabthe script and let Scilab’’s s debugger yell about the restdebugger yell about the rest
Checked frequently with Checked frequently with Help Help (particularly(particularly MatlabMatlab--ScilabScilabequivalentsequivalents)) to understand the to understand the error messages on the Consoleerror messages on the Console
title( 'Beating between tones' )xlabel( 'Time (s)' )ylabel( 'Amplitude' )
Manual conversion (2/6):Manual conversion (2/6):
Case #1, plotCase #1, plot
There were some problems There were some problems with this conversion:with this conversion:–– I split up I split up MatlabMatlab’’ss long long
plot()plot() command, but the command, but the abbreviated form did not abbreviated form did not work in Scilabwork in Scilab
–– First I changed First I changed MatlabMatlab’’ssaxis()axis() to to rectrect()(),, then then swapped the preceding swapped the preceding argument part for x.*m. argument part for x.*m. Now Now plot()plot() workedworked
–– The label commands gave The label commands gave problems. The reason problems. The reason waswas——againagain——that I had that I had copied the copied the MatlabMatlab code code and the and the quotation marksquotation markswere pasted incorrectlywere pasted incorrectly
Manual conversion (3/6):Manual conversion (3/6):
Case #2, script & plotCase #2, script & plot The The pie()pie() function has not been discussed before, but below is a function has not been discussed before, but below is a
short short MatlabMatlab script that draws a pie graph*script that draws a pie graph* The The pie()pie() function also exists in Scilab, the difference is that Scilab function also exists in Scilab, the difference is that Scilab
does not support does not support MatlabMatlab’’ss pielabelpielabel()() functionfunction
*) A more general sector chart will be presented in Example 6-4
Manual conversion (4/6):Manual conversion (4/6):
Case #3, script & plotCase #3, script & plot As a last case, letAs a last case, let’’s look at a shifted s look at a shifted sincsinc functionfunction In this case the problem is that In this case the problem is that polardbpolardb()() is an informal creation is an informal creation
by by MatlabMatlab users which Scilab does not supportusers which Scilab does not support
x = -(5*2*pi):.1:(5*2*pi);th = linspace(-pi,pi,length(x));rho=((1+sin(x)./x));polardb(th,rho)
Similar, but not the same as the Matlab plot if radial units are in dB
Case #3, discussionCase #3, discussion The polar plot with radial The polar plot with radial
units in dB looks rather units in dB looks rather ““counterintuitive,counterintuitive,”” since since its its sidelobessidelobes appear to appear to be pointing in the wrong be pointing in the wrong directiondirection
Manual conversion of Manual conversion of MatlabMatlab codes to Scilab scripts is possible, there codes to Scilab scripts is possible, there are users who claim to do it regularly are users who claim to do it regularly
Scilab for Matlab Users –tutorials and Scilab discussion forums can help in understanding the differences
Some Some MatlabMatlab functions simply do not exist in Scilab (and vice versa). functions simply do not exist in Scilab (and vice versa). Examples are Examples are axis()axis(),, compass()compass(), , feather()feather(), , fill()fill(), , narginnargin()(), , polar()polar(), , quad()quad(), , quiver()quiver(), , stem()stem(), , stairs()stairs(),, and and waterfall()waterfall()
Sometimes alternative Scilab commands exist (e.g., ScilabSometimes alternative Scilab commands exist (e.g., Scilab’’s s plot2d2()plot2d2() can compensate for can compensate for MatlabMatlab’’ss stairs()stairs()), sometimes not. If ), sometimes not. If not, the script may have to be rewrittennot, the script may have to be rewritten
ScilabScilab’’ss useruser--defined functions must be loaded with defined functions must be loaded with getfgetf()(), while , while MatlabMatlab has no separate load functionhas no separate load function
MatlabMatlab’’ss run run data.mdata.m should be traded for should be traded for exec(exec(‘‘data.scidata.sci’’)) in in ScilabScilab One more case of manual conversion will be presented in Example One more case of manual conversion will be presented in Example 66--
5 (Chapter 19)5 (Chapter 19)
Dr.EWJohnny Heikell
Dr.EWJohnny Heikell
10. Subroutines10. Subroutines
This discussion on subroutines is This discussion on subroutines is a prelude to flow control that will a prelude to flow control that will be discussed in be discussed in Chapter 11Chapter 11
Return to Contents
TerminologyTerminology
Recall from Chapter 1 that Scilab does not recognize the term “subroutine,” which belongs to the group of varied constructs that Scilab calls “function.” More exact, we are talking about user defined functions (UDFs), an expression that Scilab also does not know
Regardless of official Scilab terminology, I will—when possible—use the traditional term subroutine since it is an elegant way of pointing to specific entities in computer programs
An introductory demo An introductory demo
Recall Recall Example 1Example 1--33 that that introduced the concept of user introduced the concept of user defined functions (defined functions (UDFsUDFs))
Task: Write a function that Task: Write a function that calculates the area of a triangle calculates the area of a triangle with known side lengthswith known side lengths
The function is entered on The function is entered on EditorEditor
It is then loaded into the It is then loaded into the Console using the Editor Console using the Editor command command Execute/...file Execute/...file with echowith echo
The function is executed by The function is executed by entering the function name and entering the function name and input parameters (side lengths) input parameters (side lengths) on the Consoleon the Console
-->function A = triangle_area(a,b,c)-->// The function 'triangle_area' calculates the /-->// area of a triangle with side lengths a, b, c. /-->funcprot(0)-->p = (a+b+c)/2 // p = half perimeter-->A = sqrt(p*(p-a)*(p-b)*(p-c))-->endfunction
-->triangle_area(4,5,6)ans =
9.9215674
function A = triangle_area(a,b,c)
// The function 'triangle_area' calculates the /// area of a triangle with side lengths a, b, c. /
funcprot(0)p = (a+b+c)/2 // p = half perimeterA = sqrt(p*(p-a)*(p-b)*(p-c))endfunction
Local and global Local and global functions functions
(subroutines)(subroutines)
Local function(local subroutine)
Call 1
Call 2
Result 1
Result 2
.....
.....
Scilab script
Global function(global subroutine)
CallResult
.....
.....
Scilab script 1
.....
.....
CallResult
.....
.....
Scilab script 2
Local functionsLocal functions are embedded in a script and valid for it alone, are embedded in a script and valid for it alone, global global functionsfunctions are saved separately and accessible to any scriptare saved separately and accessible to any script
Local and global Local and global variablesvariables
You will run into the terms local and global variables and they You will run into the terms local and global variables and they need a short clarification:need a short clarification:–– As with functions, Scilab has two types of function As with functions, Scilab has two types of function variablesvariables, ,
local and global:local and global: Local variablesLocal variables are limited to a specific functionare limited to a specific function Global variablesGlobal variables are available to, and can be altered by, all functions are available to, and can be altered by, all functions
in which the variable has been declared global in which the variable has been declared global –– The transfer of parameters using command window (Console) The transfer of parameters using command window (Console)
variables and global variables is not too obvious. Global variables and global variables is not too obvious. Global variables, in particular, can lead to variables, in particular, can lead to errors that are difficult to errors that are difficult to detectdetect
–– For the reasons mentioned,For the reasons mentioned, the use of global variables should be the use of global variables should be limited to a minimumlimited to a minimum
In conclusion, we consider only In conclusion, we consider only local variableslocal variables that are the that are the default settingdefault setting in Scilab. This discussion is therefore trivialin Scilab. This discussion is therefore trivial
Subroutines, more Subroutines, more
formallyformally In the general case where a subroutine has In the general case where a subroutine has severalseveral input arguments input arguments
(in_arg1,in_arg2,(in_arg1,in_arg2,……) and returns ) and returns severalseveral output arguments output arguments (out_arg1,out_arg2,(out_arg1,out_arg2,……), the structure is:), the structure is:
function function function function [out_arg1, out_arg2,...] =... funktion_name(in_arg1, in_arg2, in_arg3,...)
out_arg1 = expression for 1st output argument; out_arg2 = expression for 2nd output argument; …
endfunctionendfunctionendfunctionendfunction
Structure borders are the Structure borders are the function .... function .... endfunctionendfunction limiterslimiters Input arguments are grouped with Input arguments are grouped with bracketsbrackets (parentheses), output (parentheses), output
arguments with arguments with square bracketssquare brackets (not needed for a single output (not needed for a single output parameter)parameter)
In both cases the arguments are separated by commasIn both cases the arguments are separated by commas
On output argumentsOn output arguments
The example to the right highlights the basic way in which Scilab manages output arguments of subroutines
When you need to influence the management of input and output variables, Scilab offers the functions argn (), varargin (), and varargout ()
With no output argument defined, the first output argument is returned in the ans variable
The same answer is returned when only one output argument is defined
With both output arguments defined, the result of the computation is returned in full
// Compute & plot the function y = x^2-x+1 in the / // range [-5,5] and determine its positive root. / // Assume we know the root lies in the range [1,2] /
c = (a+b)/2; // Midpoint of limitsif para(a)*para(c)>0 then // IF (lower)*(midpoint)
// is positivea=c; // THEN change lower limit
else b=c; // ELSE change upper limit
end end disp("The root lies between "... // Output root limits
+string(a)+" and "+string(b))
Here the subroutine is called for the first time using the input argument x
Here the subroutine is called twice more, first with the input argument a, then b
Interesting way of finding the root location. Later we’ll do the same using fsolv()
Task: Compute & plot a parabola, find its positive root
Demo (2/2): plot, Demo (2/2): plot,
printout & commentsprintout & comments This demo was borrowed from This demo was borrowed from
the pamphlet the pamphlet ““Scilab pour les Scilab pour les LycLycééeses””
Notice that the calling command Notice that the calling command was abbreviated to the extent was abbreviated to the extent possible. Instead of possible. Instead of plot(x,paraplot(x,para))we could write:we could write:
Subroutines have to be declared Subroutines have to be declared before the calling main part of before the calling main part of the script the script
Later weLater we’’ll see scripts with ll see scripts with multiple subroutines, told apart multiple subroutines, told apart by their names. Subroutines can by their names. Subroutines can also be nested (next slide) and also be nested (next slide) and can call other subroutinescan call other subroutines
The root lies between 1.617981 and 1.618042
a = para(x);plot(x,a)
Nested subroutinesNested subroutines
Subroutines can be nestedSubroutines can be nested——if it is worth if it is worth the added complexitythe added complexity
The example shown here computes the The example shown here computes the equationequation
in three steps: First sin(x)+2*%pi is in three steps: First sin(x)+2*%pi is calculated. The result is then squared and calculated. The result is then squared and subtracted with the square root of itself. subtracted with the square root of itself. Finally, 3^2=9 is addedFinally, 3^2=9 is added
Plug in the equation in a Plug in the equation in a calculator and yes, it givescalculator and yes, it givesthe same answer. I preferthe same answer. I preferthis old fashioned methodthis old fashioned method
-->function y = nested(x)--> a = sin(x) + 2*%pi;--> function y = inner(x); --> y = x^2 -sqrt(x);--> endfunction--> y = inner(a) + 3^2;-->endfunction
The The deffdeff()() primitive can be used to define primitive can be used to define simple functions simple functions (it (it resembles resembles MatlabMatlab’’ss inline()inline() function) function)
deffdeff()() is therefore used in local subroutinesis therefore used in local subroutines The syntax is:The syntax is:
Below is the same equation computed on the Console with Below is the same equation computed on the Console with functionfunctionand and deffdeff()() alternatives: alternatives:
-->deff('y = f(x)','y = x^2+x-1') -->f(2), f(-5) ans = 5. ans = 19.
-->function y = g(x); y = x^2+x-1 endfunction -->g(2), g(-5) ans = 5. ans = 19.
Note the semicolon! (Scilab understands if you skip it after the second y expression)
Global subroutines:Global subroutines:
window demo (1/4)window demo (1/4) This demo creates a global This demo creates a global
subroutine (function) for a subroutine (function) for a reusable graphics windowreusable graphics window
FirstFirst, open Scilab, open Scilab’’s s Graphics Graphics WindowWindow (one alternative is by (one alternative is by the command the command gcfgcf();(); on the on the Console). The empty Graphics Console). The empty Graphics Window pops upWindow pops up
NextNext, On the Graphics Window, , On the Graphics Window, Click: Click: Edit/Figure propertiesEdit/Figure propertiesto open the to open the Figure editorFigure editor (this (this has been explained before)has been explained before)
ThirdThird, select a suitable , select a suitable Back Back colorcolor (e.g. 22 for ecclesiastic (e.g. 22 for ecclesiastic violet) and you can see the violet) and you can see the frame on the Graphics Window frame on the Graphics Window (the bar goes only to 32, (the bar goes only to 32, gray gray is not an optionis not an option))
Global subroutines: Global subroutines:
window demo (2/4)window demo (2/4)
FourthFourth, you need to , you need to play with the Figure play with the Figure Editor for quite a while Editor for quite a while to fill in all detailsto fill in all details
NoteNote the the Ticks...Ticks...button on the button on the Graphics Graphics EditorEditor. It opens a . It opens a separate window in separate window in which you can define & which you can define & label grid lineslabel grid lines
LaterLater, when all details , when all details match, you reach match, you reach something like thissomething like this
FinallyFinally, save it with the , save it with the help of the Graphics help of the Graphics Window. Click: Window. Click: File/Save...File/Save...
// reuse_function.sce
// Reusing graphics function, /// defenitions with handle commands /
// MAIN, define and plot://--------------------------------x = [-4:0.01:4]; // Horizontal extensiony1 = 2*sin(x) - 2; // First equationplot2d(x,y1, style=2); // First plot, blue
e=gce(); // Get Entity handlee.children.thickness=5; // Polyline size
y2 = 2*cos(2*x) + 6; // Second equationplot2d(x,y2, style=3); // Second plot, green
e=gce(); // Get Entity handlee.children.thickness=5; // Polyline size
Global subroutines:Global subroutines:
window demo (3/4)window demo (3/4)
Scilab answers on the Console:Scilab answers on the Console:
So it is as a subroutine. I called So it is as a subroutine. I called it it window_demo.scgwindow_demo.scg . . Note the Note the ending ending ..scgscg. Not . Not ..scesce or or .sci.sci. . ItIt’’s g for graphic s g for graphic
Then we need a main script Then we need a main script that uses global subroutinethat uses global subroutine
Note that I call the Entity Note that I call the Entity handle handle e=e=gcegce()(). It simplifies . It simplifies compared to the path needed if compared to the path needed if calling the Axes handle, as was calling the Axes handle, as was done in done in Chapter 7Chapter 7
Figure saved.
Global subroutines:Global subroutines:
window demo (4/4), plotwindow demo (4/4), plot
Do you have problems Do you have problems with the plot?with the plot?
If yes, make sure that If yes, make sure that you defined the you defined the window correctlywindow correctly
For instance, if you do For instance, if you do not correctly fill both not correctly fill both sides in the sides in the Edit Axes Edit Axes TicksTicks list there will be list there will be some funny grid some funny grid locationslocations
Make also sure that the Make also sure that the data bounds ([data bounds ([--5,5], 5,5], [[--10,10]) are defined in 10,10]) are defined in the the Axes Editor/Axes Axes Editor/Axes OptionsOptions windowwindow I typed the wrong handle call I typed the wrong handle call gcagca();(); and and
with a single commandwith a single command It is possible to plot multiple It is possible to plot multiple
graphs with a single graphs with a single command by defining the command by defining the function arguments as function arguments as column vectorscolumn vectors
Here is the modified plot Here is the modified plot command of the previous command of the previous window demo, compressed window demo, compressed toto
plot2d(x,[y1plot2d(x,[y1’’,y2,y2’’])])
The result is shown here. The result is shown here. Scilab automatically picks Scilab automatically picks different colors for the different colors for the graphsgraphs
Scilab warns if the Graphics Scilab warns if the Graphics Window is dockedWindow is docked
y1 = 2*sin(x) - 2; // First equationy2 = 2*cos(2*x) + 6; // Second equation
Flow control (conditional Flow control (conditional branching, programming) bring branching, programming) bring important new structuresimportant new structures
Return to Contents
IntroductionIntroduction
We have now come to the line that separates boys from menWe have now come to the line that separates boys from men Some examples using flow control (also known as Some examples using flow control (also known as conditional conditional
branchingbranching and and programmingprogramming) have come up in the preceding ) have come up in the preceding chapters, but the nature of conditional branch commands like chapters, but the nature of conditional branch commands like if ... if ... then ... elsethen ... else has not been discussed*has not been discussed*
Flow control together with subroutines are needed for serious Flow control together with subroutines are needed for serious practical simulationspractical simulations
We shall therefore take a good look at the most important aspectWe shall therefore take a good look at the most important aspects of s of flow controlflow control
Note, however, that Note, however, that loop operations are slowloop operations are slow. We should aim for . We should aim for vectorizedvectorized operationsoperations if a task requires a lot of loop iterations (there if a task requires a lot of loop iterations (there is a brief discussion on the subject in is a brief discussion on the subject in Chapter 18Chapter 18))
*) Historical note: Konrad Zuse, the German who built the first real computer during WW II (using over 2000 relays because he did not trust vacuum tubes), got everything right except for conditional branches.
Flow control constructsFlow control constructs
not~
or| or /
and&
not equal to<> or ~=
greater or equal to>=
smaller or equal to<=
greater than>
smaller than<
equal to==
Logical operators:
Comparison operators:
for ... (if ... else) … end
while ... (if/then/else) ... end
if ... (elseif ... else) ... end
select ... case (... else) ... end
break ... continue
try ... catch ... end
Branch commands:*
false%f or %F
true%t or %T
Logical/Boolean constants:
The following are main constructs that you should be familiar with:
*) Rumor has it that Scilab will see select ... case renamed switch ... casein line with Matlab.
The The for ... endfor ... end loop repeats a group of statements a loop repeats a group of statements a predetermined predetermined number of timesnumber of times.. The general expression of The general expression of for ... endfor ... end is:is:
“square” cannot be used as variable name since square() is a Scilab function
for for …… if if …… else else …… endend
for ... endfor ... end can be nested with can be nested with if/elseif/else conditions to allow for conditions to allow for execution of alternate statements:execution of alternate statements:
The next few slides demonstrate a case where random Gaussian The next few slides demonstrate a case where random Gaussian ““noisenoise”” is generated, sorted, and reported both verbally and with a is generated, sorted, and reported both verbally and with a plotplot
// --------------------------------------------------------------------------- /// The script generates Gaussian noise around a fixed signal. /// Each sample ("signal") is sorted according to whether it /// is within, above or below default variance limits (+/-1). The /// result is reported verbally with strings and is also plotted /// --------------------------------------------------------------------------- /
below = below +1; // Count signal < mean-varelse // If within variance limits
within = within + 1; // mean-var <= signal <= mean+varend
end
Random generation as discussed before
Note how the signal array is read element-by-element as j goes from 1 to n
for for …… if if …… else else …… end: end:
demo, script (3/3)demo, script (3/3)
// Display result:// --------------------disp(['Result from generating', string(n), 'Gaussian distributed samples'])disp(['(signals) with mean =' string(ave) 'and variance = 1:'])disp([' -' string(within) ' samples were inside variance limits,'])disp([' -' string(above) 'above upper variance limit, and'])disp([' -' string(below) 'below lower limit'])
// Plot result:// ---------------x = [1:1:n]; // Array for x axisy1 = ave*ones(1,n); // Array for mean valuey2 = (ave+1)*ones(1,n); // Array for upper variance limity3 = (ave-1)*ones(1,n); // Array for lower variance limitrect = [0,ave-4,n+1,ave+4]; // Set pot windowplot2d(x,signal,2,"011"," ",rect) // Plot samplesplot2d(x,y1,5,"000") // Plot mean valueplot2d(x,y2,3,"000") // Plot upper variance limitplot2d(x,y3,3,"000") // Plot upper variance limitlegend('signal','average','variance');xtitle('GAUSSIAN RANDOM SAMPLES','Sample #','Sample value')
Display on the Console: Total, mean, and variance limits
This particular form of multiple plots was discussed earlier and is worth keeping in mind
for for …… if if …… else else …… end: end:
demo, print & plotdemo, print & plot
!Result from generating 500 Gaussian distributed samples !
!(signals) with mean = 3 and variance = 1: !
! - 348 samples were inside variance limits, !
! - 75 above upper variance limit, and !
! - 77 below lower limit !
69.6% of the samples are within ±1σ bounds. Quite ok for 500 samples
It can be seen that there are one or two samples outside the ±3σlimit, as should be
for for …… if if …… else else …… end: end:
commentscomments Note how the random data is collected by the Note how the random data is collected by the signal(:,nsignal(:,n)) array. array.
Compare this with the Compare this with the x = [x = [x,kx,k]] construct that is used later in construct that is used later in connection with the discussion on connection with the discussion on break & continuebreak & continue
This example was This example was a maddening experiencea maddening experience: I just could not figure : I just could not figure out how to make the plot work. After hours of attempts I found tout how to make the plot work. After hours of attempts I found the he problem: I had put the random function inside the problem: I had put the random function inside the for ... endfor ... end looploop
What kept me on the wrong track for too long was that the data wWhat kept me on the wrong track for too long was that the data was as collected correctly, but is was destroyed when it was brought oucollected correctly, but is was destroyed when it was brought outside tside the the for ... endfor ... end loop. However, that did not happen if there was a loop. However, that did not happen if there was a display command inside the loop. For instance, no semicolon aftedisplay command inside the loop. For instance, no semicolon after r signal(:,nsignal(:,n)). Speak of coincidences...... Speak of coincidences.....
The problem went away when I finally understood to The problem went away when I finally understood to separate data separate data generation from the data sorting loopgeneration from the data sorting loop
Lessons learned: Be careful with what you put inside loops
while while …… endend
whilewhilewhilewhile condition// foo// loop counter, i.e. count = count +1;
endendendend
The The while ... endwhile ... end loop repeats a group of statements an loop repeats a group of statements an indefinite indefinite number of timesnumber of times under control of a logical conditionunder control of a logical condition
The general form of The general form of while ... endwhile ... end is:is:
The code to the right determines from The code to the right determines from which value of k the expressionwhich value of k the expression2^(2^(--k) <= %k) <= %epseps
Be carefulBe careful with with conditioncondition, it can easily, it can easilylock the simulation in an endless looplock the simulation in an endless loop
The The while ... endwhile ... end condition can be nested with an optional condition can be nested with an optional if ... if ... then ... elsethen ... else instructioninstruction::
The function on the next slide is for a game in which the user sThe function on the next slide is for a game in which the user should hould guess a random number that the computer draws. The game finishesguess a random number that the computer draws. The game finishesonly with the correct guessonly with the correct guess
while while …… if /then/else if /then/else ……
end: demoend: demo
-->guess_a_number
Guess an integer in the range
1. 30.You guess: 15
Number is too smallYou guess: 22
Number is too bigYou guess: 17
Number is too smallYou guess: 19
Correct!
// game.sci
// The function draws a random number in the /// range [1,M] that the user should guess. /// Game finishes when correct number is found /
clear,clc;
M=30; // Upper limit of numbersnumber=floor(1+M*rand()); // Draw a random numberdisp('Guess a positive integer in the range ');disp([1,M]); // State range of random numbersguess=input('You guess: '); // User's guess
while (guess~=number) // Start while conditionif guess>number then // Start if-then-else
disp('Number is too big');else
disp('Number is too small');end // End if-then-elseguess=input('You guess: '); // User's next guess
end // End while conditiondisp('Correct!');
Save the script, load it into Scilab (on Editor), type the function name on the Console
Loop
Comments on Comments on
interactivityinteractivity The previous demo showed examples of interactive use of stringsThe previous demo showed examples of interactive use of strings
–– To To instruct the userinstruct the user::disp(disp(‘‘GuessGuess an integeran integer’’))
–– To To accept user inputsaccept user inputs::guess = guess = input(input(‘‘YouYou guess: guess: ’’))
To the user the To the user the input()input() prompt is not very clear since the text string prompt is not very clear since the text string only pops uponly pops up——it should at least blink. One must therefore try to find it should at least blink. One must therefore try to find expressive text messages. Perhaps the following would be better expressive text messages. Perhaps the following would be better in in the previous case:the previous case:
guess = guess = input(input(‘‘NowNow, Sir/Madame, type your guess: , Sir/Madame, type your guess: ’’))
Interactive text strings is a simple form of humanInteractive text strings is a simple form of human--machine machine interfaces; Graphical User Interfaces (GUIs) more are advanced ainterfaces; Graphical User Interfaces (GUIs) more are advanced and nd will be discusses in will be discusses in Chapter 15 Chapter 15 (there was a case already in Ex 1(there was a case already in Ex 1--3)3)
foofoo …… do do …… endend
The The dodo keywordkeyword can be used inside can be used inside forfor and and whilewhile instructions to instructions to separate the loop variable definition (condition) and the instruseparate the loop variable definition (condition) and the instructions. ctions. The keyword The keyword thenthen can be used with can be used with ifif and and whilewhile
The following are examples of The following are examples of for ... do ... endfor ... do ... end and and while ... while ... do/then ... enddo/then ... end: :
-->n = 9; -->for k = 1:1:3 do -->n = n - 3 -->end n = 6. n = 3. n = 0.
-->n = 9; -->k = 1; -->while k <= 3 do -->n = n -3 -->k = k + 1; -->end n = 6. n = 3. n = 0.
-->n = 9; -->k = 1; -->while k <= 3 then -->n = n-3 -->k = k + 1; -->end n = 6. n = 3. n = 0.
if if …… ((elseifelseif/else) /else) …… endend
The if statement evaluates a logical expression (condition) and executes a group of statements when the expression is true
The optional elseif and else keywords provide for the execution of alternate groups of statements
ifififif condition_1// foo
elseifelseifelseifelseif condition_2// foo
……elseelseelseelse
// fooendendendend
if if …… elseifelseif/else /else …… end: end:
demodemo
-->fibonacci(8) ans = 13.
// fibonacci.sci
// Gives the n-th term of the Fibonacci /// sequence 0,1,1,2,3,5,8,13,... /
elseif n>2 & int(n)==n // Check if n is an integer >2K = fibonacci(n-1) + fibonacci(n-2); // Compute Fibonacci #
else // Previous conditions not metdisp('error! -- input is not a positive integer'); // Error message
end // End of if-elseif-else-endendfunction
Save the script, load it into Scilab (on Editor), type on the Console the function name with the n argument (Hint: do not use a large value!)
Check what happens for n < 1
The following function computes the n:th term of the Fibonacci sequence when n is given:
select select …… case case …… else else ……
endend The The select ... case ... else ... endselect ... case ... else ... end construct executes the first construct executes the first casecase
that matches the stated condition that matches the stated condition If no match is found it executes the If no match is found it executes the elseelse statement statement The advantage of The advantage of select ... case ... else ... endselect ... case ... else ... end is that it allows us is that it allows us
to avoid multiple to avoid multiple ifif statementsstatements
Note: select ... caseis called switch ... case in Matlab (may be changed in Scilab)
Hint: Use select ... case when if …elseif … elsethreatens to become too complex
select select …… case case …… end: end:
demo, scriptdemo, script Some textbooks on Some textbooks on MatlabMatlab
presents this as the drunk presents this as the drunk sailor problem. It sailor problem. It demonstrates a random demonstrates a random walk, one fixed step at a timewalk, one fixed step at a time
The whole process is The whole process is performed in a single performed in a single function (function (randwalk(stepsrandwalk(steps))) ) that has to be executed from that has to be executed from the Consolethe Console
In this case there is no In this case there is no problem with having the problem with having the random generator inside the random generator inside the for ... endfor ... end looploop
The script plots two marks The script plots two marks ((oo--) for each step, although ) for each step, although they cannot be distinguished they cannot be distinguished on the plot on the next sideon the plot on the next side
// randomwalk.sce
//-----------------------------------------------------------------/// Creates a track of marks that proceed randomly /// in the x,y plane. The walk starts at the origin /// and proceeds for a predetermined number of steps /// either up, down, right, or left ///-----------------------------------------------------------------/
clear,clc,clf;funcprot(0);
function randwalk(steps)x=zeros(1,steps+1); // Counter for x tracky=zeros(1,steps+1); // Counter for y trackfor k=1:steps
direction=floor(4*rand()); // Draw random moveselect directioncase 0 then
x(k+1)=x(k)+1; // Move righty(k+1)=y(k);
case 1 thenx(k+1)=x(k)-1; // Move lefty(k+1)=y(k);
select select …… case case …… end: end:
demo, script & plotdemo, script & plot
-->randwalk(1000)
case 2 thenx(k+1)=x(k);y(k+1)=y(k)+1; // Move up
case 3 thenx(k+1)=x(k);y(k+1)=y(k)-1; // Move down
endendclfplot(x,y,'o-'); // Plot marks
endfunction
The starting point is always the origin (I have run this simulation numerous times and Scilab seems to prefer to go in the northeastern direction)
After loading the script into Scilab, the function has to be run from the Console
break & continuebreak & continue
breakbreak lets you exit early from a lets you exit early from a for ... for ... endend or or while ... endwhile ... end loop, or from loop, or from within an within an if ... endif ... end statementstatement
Execution continues from the line Execution continues from the line following the following the endend statementstatement
In nested loops, In nested loops, breakbreak exits only from exits only from the innermost loopthe innermost loop
The break command:
The continue command: continuecontinue is a forced return to the start is a forced return to the start
of a of a for ... endfor ... end or or while ... endwhile ... end loop loop (not (not if ... endif ... end loops!)loops!)
Statements between Statements between continuecontinue and the and the end of the loop will be neglectedend of the loop will be neglected
-->k = 0; -->while 1 == 1, -->k = k + 1; -->disp(k); -->if k > 6 then -->break -->end; -->end 1. 2. 3. 4. 5. 6. 7.
-->for j = 1:2 -->x = []; -->for k = 1:10 -->if k>j+1 & k<=8 then -->continue -->end -->x = [x,k]; -->end -->x -->end x = 1. 2. 9. 10. x = 1. 2. 3. 9. 10.
break: demobreak: demo
// break.sce
// Input m positive integers that are summed /// up, but the program breaks if the input /// is not a positive integer /
clear,clc;
n = input('Give amount of numbers to sum_');summa = 0; // Reset summa counterfor i = 1:n
number = input('Give next number_');if number < 0 // Condition: number ~< 0
disp('wrong-----negative value!');break;
endif number ~= int(number) // Check if integer
disp('wrong-----not an integer!');break;
endsumma = summa + number; // Sum up
enddisp(['Accumulated error-free sum is:' string(summa)]);
Give amount of numbers to sum_3 Give next number_13 Give next number_17 Give next number_7 !Accumulated error-free sum is: 37 !
Give amount of numbers to sum_3 Give next number_17 Give next number_2 Give next number_-1 wrong-----negative value! !Accumulated error-free sum is: 19 !
Give amount of numbers to sum_ 4 Give next number_ 18 Give next number_ 3.3 wrong-----not an integer! !Accumulated error-free sum is: 18 !
try try …… catch catch …… endend
With no errors, the code between With no errors, the code between trytry and and catchcatch is executedis executed If an error occurs, execution immediately shifts to the code betIf an error occurs, execution immediately shifts to the code between ween
catchcatch and and endend::
Typically the code between Typically the code between catchcatch and and endend informs of an expected informs of an expected error, e.g. error, e.g. dispdisp((‘‘--------warning: cannot access the functionwarning: cannot access the function--------’’))
trytrytrytry// foo// If an error occurs in this part....
The first three examples relateThe first three examples relateto Chapter 10, the rest to to Chapter 10, the rest to
Chapter 11Chapter 11
Return to Contents
Example 4Example 4--1: step 1: step
function, unit step (1/2)function, unit step (1/2) Step functions are useful in Step functions are useful in
many practical applicationsmany practical applications As mentioned in As mentioned in Ex 2Ex 2--33, Scilab , Scilab
lacks a separate function for lacks a separate function for creating (unit) steps, but we creating (unit) steps, but we can form them indirectly (in Ex can form them indirectly (in Ex 22--3 it was done with a unit 3 it was done with a unit vector)vector)
Here we shall look at two cases Here we shall look at two cases where a step is neededwhere a step is needed
In the first demo a step is In the first demo a step is created with a user defined created with a user defined function that includes the function that includes the sign()sign()function (function (HelpHelp is of no help is of no help here, you donhere, you don’’t understand t understand what it says about what it says about sign()sign()))
0
1
y
tt0
y(t) = 0, t < t0
1, t > t0
Unit step:
Ex 4Ex 4--1: step function, unit 1: step function, unit
step (2/2)step (2/2)
Note how the sign()function is shifted (addition by 1) and compressed (multiplied by 0.5) to get the required unit step
// step_sign.sce// Plot a sign() fucntion that is shifted by 1 /// & compressed by 0.5 to give a unit step /
clear,clc,clf; funcprot(0);
x = linspace(-5,5,400); deff('y=u(x)','y=0.5*(1+sign(x))') // Define sign() function,
a=gca(); // Get axes handlea.title.text="UNITY STEP"; // Add titlea.children.children.thickness=3; // Increase line thickness
Ex 4Ex 4--1: step function, 1: step function,
rectangular pulse (1/2)rectangular pulse (1/2)
The second case is a The second case is a rectangular pulse with rectangular pulse with amplitude A as shown in the amplitude A as shown in the figurefigure
In this case we do it without a In this case we do it without a user defined function, since it user defined function, since it leads to a simpler scriptleads to a simpler script
The plot command can also be The plot command can also be simplified somewhatsimplified somewhat y(t) =
A, t0 ≤ t < t1
0, otherwise
Rectangular pulse:
0
A
y
tt0 t1
// rect_pulse.sce
// Plot a rectangular pulse with /// width 3 < t < 5 and amplitude 2 /
clear,clc,clf;
t = 0:0.01:10; deff('y=u(t)','y=1*(t>=0)'); // Define u(t)
rectangular pulse (2/2)rectangular pulse (2/2)Note that the argument u() does not have to be defined separately
rect can be defined even if style, strf, and leg are absent
Thick figure lines & graph with increased line thickness
Ex 4Ex 4--1: step function, 1: step function,
commentscomments
In the first case (unit step) the handle command for line thicknIn the first case (unit step) the handle command for line thickness is ess is
a.children.children.thickness=3;
In the second case (rectangular pulse) Scilab did not accept thiIn the second case (rectangular pulse) Scilab did not accept this s form and it had to be rewritten asform and it had to be rewritten as
I have no idea why this is the case and I have no idea why this is the case and Help Help certainly is of no helpcertainly is of no help
In the latter case I happened to write the script without the In the latter case I happened to write the script without the deffdeff()()function, and for a while everything came out all right. But whefunction, and for a while everything came out all right. But when I n I added handle commands Scilab decided that the variable added handle commands Scilab decided that the variable uu is is undefined. The KISS principle (Keep It Simple, Stupid) did not aundefined. The KISS principle (Keep It Simple, Stupid) did not apply pply in this casein this case
Example 4Example 4--2: cones in a 2: cones in a
3D space3D space This example is adapted from This example is adapted from ChancelierChancelier et al., pp. 163et al., pp. 163--166166 The script is The script is quite complexquite complex with four subroutines and three separate with four subroutines and three separate
plotting structures, which makes it difficult to follow the tranplotting structures, which makes it difficult to follow the transfer of sfer of parameters. Changing an argument can have unexpected parameters. Changing an argument can have unexpected consequencesconsequences
Some aspects of the script have not been covered before and willSome aspects of the script have not been covered before and will be be left without detailed discussion here as well (see however Ex 4left without detailed discussion here as well (see however Ex 4--3)3)
The object, a cone (the book mentions and shows a vase), is plotThe object, a cone (the book mentions and shows a vase), is plotted ted in three separate positions using in three separate positions using lateral shifts, rotation, and nonlateral shifts, rotation, and non--rotational dilation (rotational dilation (homothetyhomothety)) of the objectsof the objects
The cones are shaded using The cones are shaded using handleshandles that are called through the that are called through the gcegce()() commandcommand
Scilab functions used for the first time: Scilab functions used for the first time: diagdiag()(), , eval3dp()eval3dp(), , graycolormapgraycolormap()(), , isoviewisoview()(),* ,* size()size()
*) The function isoview() is obsolete. The Help Browser recommends using frameflag=4 instead.
Ex 4Ex 4--2: script (1/4)2: script (1/4)
// cone_manipulation.sce
// ********************************************** //// The script generates and plots a cone with its //// tip at the origin. It plots two copies of the //// cone, one shifted and one shifted & rotated //// //// ********************************************** //
clear,clc,clf;
// Vertical reach of 3D object:vertical=[0,1.0,1.6,2.5,2.2,2,1.6,0.9,0.5,0.3,0.3,0.4,0.6,1,1.4,...1.7,0,0,0.1,0.4,0.8,1.1,1.4,1.7,1.9,2.2,2.4,2.7,3,3.3,3.7,3.9]/2;
// SUBROUTINE 1: Generation of 3D object://----------------------------------------------------------function [x,y,z]=cone(reach,Z) // Generation of a 3D objectx=vertical(1,Z).*cos(reach) // Extension along x axisy=vertical(1,Z).*sin(reach) // Extension along y axisz=vertical(1,Z).*ones(reach) // Vertical (z) axis
endfunction
vertical[]vertical[] tells how to tells how to move along the z axis in move along the z axis in later calculations. Note later calculations. Note the increasing and the increasing and decreasing values that decreasing values that will cause will cause problemsproblems for for shadingshading
The function The function cone()cone()generates the cone in generates the cone in case. Example #12 case. Example #12 discusses how it is donediscusses how it is done
// SUBROUTINE 3, Non-rotational dilation: (center =// center of dilation, f = dilation factor)//-----------------------------------------------------------------------function XYZ=homothety(center,f,xyz)XYZ=translation(center,diag(f)*translation(-center,xyz))
endfunction
// SUBROUTINE 4, Rotation://-------------------------------------function XYZ=rotation(angle,xyz)angle=angle/180*%pi; // Angle of rotation around axesc=cos(angle);s=sin(angle);Rx=[1 0 0;0 c(1) s(1);0 -s(1) c(1)] // Rotation along x axisRy=[c(2) 0 s(2);0 1 0;-s(2) 0 c(2)] // Rotation along y axisRz=[c(3) s(3) 0;-s(3) c(3) 0;0 0 1] // Rotation along z axisXYZ=Rx*Ry*Rz*xyz
endfunction
Lateral shifts of objects Lateral shifts of objects are handled by the are handled by the function function translation()translation()
NonNon--rotational dilatation rotational dilatation of objects is the task of of objects is the task of homothetyhomothety()()
rotation()rotation() creates a creates a matrix for rotating matrix for rotating objects around the three objects around the three axesaxes
Those are the four user Those are the four user defined functionsdefined functions
// Superimpose rectangular facets://----------------------------------------------[xv,yv,zv]=eval3dp(cone,linspace(-%pi,%pi,20),1:10); f=gcf(); // Get Current Figure, create figuref.color_map=graycolormap(32); // Select color
// Plot basic cone with tip at the origin://----------------------------------------------------plot3d(xv,yv,zv)e1=gce(); // Get Current Entity handlee1.color_mode = 24; // Object exterior: light greye1.hiddencolor = 30; // Object interior: dark grey
eval3dp()eval3dp() transforms transforms the smooth surface that the smooth surface that cone()cone() creates into a creates into a composition of composition of quadrangular facets quadrangular facets
Here we plot the basic Here we plot the basic cone, which has its tip cone, which has its tip in the origin. The in the origin. The exterior and interior of exterior and interior of the cone should have the cone should have different shadesdifferent shades
Objects are manipulated Objects are manipulated by vectors created by by vectors created by the earlier user defined the earlier user defined functionsfunctions
Ex 4Ex 4--2: script (4/4)2: script (4/4)// Plot second cone (enlarged)://-----------------------------------------plot3d(matrix(XYZH(1,:),4,-1),matrix(XYZH(2,:),
4,-1),matrix(XYZH(3,:),4,-1))e2=gce(); // Get Current Entity handlee2.color_mode = 24; // Object exterior: light greye2.hiddencolor = 30; // Object interior: dark grey
// Plot third cone (rotated)://-------------------------------------plot3d(matrix(XYZR(1,:),4,-1),matrix(XYZR(2,:),
4,-1),matrix(XYZR(3,:),4,-1))e2=gce(); // Get Current Entity handlee2.color_mode = 24; // Object exterior: light greye2.hiddencolor = 30; // Object interior: dark grey
// ---- STEP 3: ADJUST THE BOX ---- //
// Adjust Axes properties://-------------------------------a=gca(); // Get Current Axesa.data_bounds=[-3 -3 -3;3 3 3]; // Box dimensionsa.rotation_angles=[75 77]; // Rotation of the boxa.isoview='on'; // Isometric scaling
// ---- END OF MAIN ---- //
Plot another cone, this Plot another cone, this one is zoomed up and one is zoomed up and sifted laterally. Same sifted laterally. Same shading as before shading as before
And the third plot, with And the third plot, with the cone shifted the cone shifted laterally and rotated. laterally and rotated. Shading as beforeShading as before
Properties of the box Properties of the box around the cones is around the cones is adjusted. Isometric adjusted. Isometric scaling is scaling is ““onon”” (check (check with with HelpHelp for an for an explanation)explanation)
Ex 4Ex 4--2: plot2: plot
Original cone with Original cone with tip at the origin tip at the origin
Second cone, Second cone, laterally shifted laterally shifted and enlargedand enlarged
Third cone, Third cone, laterally shifted laterally shifted and rotatedand rotated
And the shading And the shading of them is all of them is all wrongwrong. See . See Example 4Example 4--3 3 for for an explanationan explanation
Ex 4Ex 4--2: comments2: comments
ChancelierChancelier et al. have not documented their examples too well, et al. have not documented their examples too well, which in this casewhich in this case——together with errors in their solutiontogether with errors in their solution——caused caused major problems when I tried to understand the script. major problems when I tried to understand the script. DO NOT DO NOT UNDERESTIMATE THE NEED TO DOCUMENT PROGRAMS!UNDERESTIMATE THE NEED TO DOCUMENT PROGRAMS! You may You may be the one that suffers when your code has to be changed, years be the one that suffers when your code has to be changed, years after it was writtenafter it was written
The first requirement of documentation is liberal use of The first requirement of documentation is liberal use of commentscomments in in the codethe code
Among the handle commands are some that have not been Among the handle commands are some that have not been discussed before: discussed before: f.color_mapf.color_map==graycolormapgraycolormap, , e1.color_modee1.color_mode, , e1.hidden_colore1.hidden_color, , a.rotation_anglesa.rotation_angles, and , and a.isoviewa.isoview==‘‘onon’’ (recall (recall however the however the colormapcolormap command that was used in Ex 3command that was used in Ex 3--5)5)
Example 4Example 4--3: how to 3: how to
generate a conegenerate a cone
How was the cone in the How was the cone in the previous example previous example generated? The interplay generated? The interplay between the matrix between the matrix vertical[]vertical[],, user defined user defined function function cone()cone(), and , and facet generation function facet generation function eval3dp()eval3dp() are not too are not too obviousobvious
LetLet’’s simplify the case to s simplify the case to a bare minimuma bare minimum
And look at the result on And look at the result on the next slidethe next slide
// cone_creation.sce
// A bare-bone eval3dp() script for plotting a 3D cone /
clear,clc,clf;vertical=[0,1,2,2.3,3,4]; // Vertical reach of 3D object
function [x,y,z]=cone(reach,Z) // Generation of a 3D objectx=vertical(1,Z).*cos(reach) // Extension along x axisy=vertical(1,Z).*sin(reach) // Extension along y axisz=vertical(1,Z).*ones(reach) // Vertical (z) extension
plot3d(xv,yv,zv,theta=60,alpha=70) // Plot objecte1=gce(); // Get current Entity handlee1.color_mode = 24; // Object exterior: light greye1.hiddencolor = 30; // Object interior: dark grey
Ex 4Ex 4--3: plot3: plot
Z5 = 3
Z4 = 2.3
Z3 = 2
Z2 = 1
Z1 = 0
Dark gray interior (e1.hiddencolor = 30)
Light gray exterior (e1.color_mode = 24)
Gap in the surface due to the argument linspace(-%pi/1.5, %pi,20)
Box alignment defined by thetaand alpha in plot3d()
Ex 4Ex 4--3: discussion3: discussion
The cone is created by the linearly increasing radius RThe cone is created by the linearly increasing radius RZZ of x and y:of x and y:
x = Rx = RZZ .*.*cos(Zcos(Znn))y = Ry = RZZ.*.*sin(Zsin(Znn))
If you change the first element in If you change the first element in vertical[]vertical[] from 0 to 0.5, youfrom 0 to 0.5, you’’ll see ll see that the tip of the cone is cut offthat the tip of the cone is cut off
There are six elements in the vector There are six elements in the vector vertical[]vertical[].. The last one (4) is The last one (4) is never used since the third argument in never used since the third argument in eval3dp()eval3dp() is 1:5, meaning is 1:5, meaning that only the first five vector elements are needed. Hence the zthat only the first five vector elements are needed. Hence the z axis axis of the plot is [0,3]of the plot is [0,3]
I left a gap in the perimeter of the cone to demonstrate the rolI left a gap in the perimeter of the cone to demonstrate the role of e of the second argument in the second argument in eval3dp()eval3dp()
This example has This example has correct shadingcorrect shading of the object. The of the object. The surface pattern surface pattern in Ex 4in Ex 4--2 2 is no artistic creation but messed up due to overlapping Zis no artistic creation but messed up due to overlapping Znnvaluesvalues
// vase_creation.sce
// A bare-bone eval3dp() script for plotting a 3D vase /
clear,clc,clf;
vertical=[0,1,2,2.3,3,4]; // Vertical reach of 3D objectR_factor=[1,1,0,-1.5,-1,0]; // Correction matrix
function [x,y,z]=cone(reach,Z) // Generation of a 3D objectR=vertical+R_factor; // Radius of vase, R=f(Z)x=R(1,Z).*cos(reach) // Extension along x axisy=R(1,Z).*sin(reach) // Extension along y axisz=vertical(1,Z).*ones(reach) // Vertical (z) extension
plot3d(xv,yv,zv,theta=60,alpha=70) // Plot objecte1=gce(); // Get Current Entity handlee1.color_mode = 24; // Object exterior: light greye1.hiddencolor = 30; // Object interior: dark grey
Ex 4Ex 4--3: how to transform 3: how to transform
the cone to a vasethe cone to a vase How do we create the How do we create the
vase that vase that ChancilierChancilier et et al. talk about?al. talk about?
Quite obviously, we Quite obviously, we have to alter Rhave to alter RZZ ininx=Rx=RZZ.*.*cos(Zcos(Znn))y=Ry=RZZ.*.*sin(Zsin(Znn))
Here is one way to do Here is one way to do it: by introducing a it: by introducing a vector vector R_factorR_factor that that compensates for the compensates for the linear increase in Rlinear increase in RZZ
And the result is shown And the result is shown on the next slideon the next slide
Ex 4Ex 4--3: vase plot3: vase plot
Not bad, eh?
But I have no idea where the pink & aniline colors came from, they bumped up when I executed the script after Scilab had crashed. The gray scale returned after I reloaded Scilab for a second time
Example 4Example 4--4: ballot 4: ballot
engine for politiciansengine for politicians The function on the next two slides is a The function on the next two slides is a
ballot machine that help politicians ballot machine that help politicians decide on how to cast their votedecide on how to cast their vote
The number of issues to vote on is The number of issues to vote on is entered and the code checks that the entered and the code checks that the number is a positive integernumber is a positive integer
Scilab then draws random numbers Scilab then draws random numbers and transforms them to verbal votes and transforms them to verbal votes (yes/no/abstain)(yes/no/abstain)
The votes are finally put into groups of The votes are finally put into groups of threethree
The function demonstrates the use of The function demonstrates the use of select ... case ... endselect ... case ... end with a finishing with a finishing modulo()modulo() statement statement
It also shows the use of repeated It also shows the use of repeated if ... if ... endend statements (necessary or not?)statements (necessary or not?)
-->voting Give number of issues to vote on_5 Now this is how you should vote: yes no yes abstain no
-->voting Give number of issues to vote on_-2.2 warning-----must be > 0
Ex 4Ex 4--4: script (1/2)4: script (1/2)
A good part of the A good part of the function commands function commands are related to are related to checking the validity checking the validity of dataof data
The first check makes The first check makes sure that the number sure that the number entered by the user is entered by the user is > 0> 0
The next check is to The next check is to make sure that n is an make sure that n is an integerinteger
Pay attention to the Pay attention to the abortabort commands!commands!
// voting.sci
// Ballot machine for politicians. The number /// of issues to be voted on is entered and /// Scilab tells how to vote on them. The /// answers are presented in groups of three /
clear,clc;funcprot(0)
function voting
// Give input and check entered number://-------------------------------------------------------n = input('Give number of issues to vote on_ ');if n <= 0 do // # of votings must be > 0
disp('warning-----must be > 0');abort;
endif n ~= int(n) do // n should be an integer
disp('warning-----not an integer!');abort;
end
Ex 4Ex 4--4: script (2/2)4: script (2/2)
// Create n random numbers 0,1 or 2://--------------------------------------------------dt=getdate(); // Get initial seedrand('seed',1000*dt(9)+dt(10)); // Seed random generatorvotes = floor(3*rand(n,1)); // Generate votes (0,1, or 2)
// Transform random numbers to verbal votes://--------------------------------------------------------------disp('Now this is how you should vote:');for k = 1:n
select votes(k)case 0 thendisp('yes'); // 0 = yes
case 1 thendisp('no'); // 1 = no
case 2 thendisp('abstain'); // 2 = abstain
endif modulo(k,3)==0 // 3 votes given?
disp(' ') // Leave space after 3 rowsend
end
endfunction
Generation of random Generation of random numbers in the similar numbers in the similar manner to Ex 1manner to Ex 1--33
Then a Then a select ... case select ... case ... end... end construct that construct that transforms the transforms the random numbers to random numbers to text stringstext strings
Finally the string Finally the string outputs are grouped outputs are grouped into threes. Pay into threes. Pay attention to how attention to how handy the handy the modulo()modulo()function is!function is!
Ex 4Ex 4--4: comments4: comments
Scilab has several commands related to forced termination of Scilab has several commands related to forced termination of an ongoing process: an ongoing process: abortabort, , breakbreak, , exitexit, , quitquit, , returnreturn, , resumeresume. Check with . Check with HelpHelp for detailsfor details
In this example I had some problems with jumping out of the In this example I had some problems with jumping out of the program in the right manner:program in the right manner:–– According to According to Help BrowserHelp Browser the the exitexit command should end the command should end the
current Scilab sessioncurrent Scilab session——whatever it means. It turned out that whatever it means. It turned out that exitexit performs more or less like the performs more or less like the breakbreak command by only command by only ending the present loopending the present loop
–– quitquit is a brute that closes down Scilabis a brute that closes down Scilab–– Trial and error showed that Trial and error showed that abortabort had the expected effect of had the expected effect of
jumping to the end of the function jumping to the end of the function
Good old Good old GO TOGO TOstatement, where have you been all these yearsstatement, where have you been all these years——and why and why do they give you such fancy names?do they give you such fancy names?
Example 4Example 4--5: nested 5: nested
structures, scriptstructures, script
// conditional.sce
// Climb up or down the scale depending on /// input data ("u" or "d") without exceeding /// the limits. The process ends when "e" is /// pressed /
scale = [1 2 3 4 5 6 7 8 9]'; // Define scale to climbi = 1; // Preset counterstrg = ' '; // strg = empty stringwhile strg ~= 'e' // Until the "e" key is hitdisp(scale(i,:)); // Display location on scalestrg = input('Exit(e), Up(u), Down(d)?','string')if strg == 'u' then // If "u" is hit
i = min(i+1, size(scale,1)); // One step up, until highestelseif strg == 'd' then // But if "d" is hiti = max(i-1, 1); // One step down, until lowest
elseif strg == 'e' then // If "e" is hitbreak; // Jump out of the loop
end // End of if statementend // End of while statementdisp('you hit e=Exit') // Exit message
whi
le ... e
nd
if ... en
d
This script contains an if ... elseif ... else ... endstructure nested within an while ... end structure (read the title for an explanation of what the script does)
Note how min() and max() ensure that scale limits are not exceeded
Example 4Example 4--5:5:
executionexecution
The scale counter i is preset to 1 and increases/decreases depending on the entered data
Any input parameter except u, d, or e give an error message
The break command works well in this case
Homework: Modify the script by using the select ... case ... else ... end structure instead of if ... elseif ... else ... end. Which solution is simpler?
1. Exit(e), Up(u), Down(d)?ustrg =u
2.Exit(e), Up(u), Down(d)?u
strg =u
3.Exit(e), Up(u), Down(d)?d
strg =d
2.Exit(e), Up(u), Down(d)?6
strg =6
---incorrect input---
2.Exit(e), Up(u), Down(d)?u
strg =u
3.Exit(e), Up(u), Down(d)?e
strg =e
you hit e=Exit
Dr.EWJohnny Heikell
Dr.EWJohnny Heikell
13. Doing math on 13. Doing math on
ScilabScilab
Scilab contains functions for Scilab contains functions for sophisticated mathematics. Wesophisticated mathematics. We’’ll ll stay with the simpler casesstay with the simpler cases
symbolic computing, random generators symbolic computing, random generators Chapter 6: Linear equation systems with real coefficientsChapter 6: Linear equation systems with real coefficients Chapter 7: 2D and 3D functions, vector fields, histograms, Chapter 7: 2D and 3D functions, vector fields, histograms,
rotation surfaces, logarithms, polar coordinatrotation surfaces, logarithms, polar coordinateses Chapter 8: Polynomial expressionsChapter 8: Polynomial expressions Chapter 9: Application of matrices & trigonometric functionsChapter 9: Application of matrices & trigonometric functions Chapter 10: Arithmetic and algebraChapter 10: Arithmetic and algebra Chapter 11: Logical expressionsChapter 11: Logical expressions Chapter 12: Step functions, application of 3D vector spaces Chapter 12: Step functions, application of 3D vector spaces
"Do not worry about your problems with mathematics, I assure you mine are far greater.” Albert Einstein
optimoptim() & () & fsolvefsolve(): ():
demo (1/4), the taskdemo (1/4), the task
The functions The functions optimoptim()() and and fsolvfsolv()() give us tools by which to give us tools by which to investigate nonlinear equations and/or equation systems:investigate nonlinear equations and/or equation systems:
–– optimoptim()() to find minima (and indirectly maxima)to find minima (and indirectly maxima)–– fsolvfsolv()() to find solutions (roots) to equations/equation systemsto find solutions (roots) to equations/equation systems
optimoptim()() is a quite complex function, which is evident in the Help is a quite complex function, which is evident in the Help BrowserBrowser’’s confusing description. Here we shall stick to a basic case s confusing description. Here we shall stick to a basic case by applying by applying optimoptim()() and and fsolvfsolv() () to the equationto the equation
y = y = sin(x)/((xsin(x)/((x -- 0.1)0.1)22 + 0.1)+ 0.1)
We solve the problem in two steps:We solve the problem in two steps:–– First by plotting the graph to get better understanding of the fFirst by plotting the graph to get better understanding of the function, unction,
and simultaneously computing min and max values for y using and simultaneously computing min and max values for y using optimoptim()()
–– Then we apply Then we apply fsolvefsolve()() to compute exact root locations with the aid of to compute exact root locations with the aid of visual estimates from the plotted graph visual estimates from the plotted graph
// Display min & max by calling subroutines://-----------------------------------------------------------disp(optim(list(NDcost,cost1,0),0)) // Display y mindisp(-optim(list(NDcost,cost2,0),0)) // Display y max// ---- END OF MAIN ---- //
optim() requires a Scilab subroutine of the type [f,g,ind]=cost(x,ind). The numeric value of grad is irrelevant
Plotting is done with flpot2d(), which is quite similar to plot2d()
I do not know why there has to be a third numeric argument in list(), Scilab just requires something (I tried and cried...)
The second argument of optim(list(),0) defines the gradient that we are interested in
fsolvefsolve() and () and optimoptim(): ():
demo (3/4)demo (3/4)
Her are the minimum Her are the minimum and maximum y and maximum y values produced by values produced by optimoptim()()
And here is the plot. And here is the plot. It is clear that it has It is clear that it has three roots three roots
The next task is to The next task is to locate the roots. For locate the roots. For that that we must provide we must provide approximate solutionsapproximate solutions(e.g. (e.g. --3,0,3 in this 3,0,3 in this case), based on which case), based on which Scilab computes an Scilab computes an exact solution for the exact solution for the given neighborhoodgiven neighborhood
min
max
roots
- 1.1381166 2.1199214
min
max
fsolvefsolve() and () and optimoptim(): demo(): demo
(4/4), solving the roots(4/4), solving the roots
As said on the previous slide, approximate values for the roots As said on the previous slide, approximate values for the roots are:are:x1 x1 ≈≈ --3, x2 3, x2 ≈≈ 0, x3 0, x3 ≈≈ 33
With the script is loaded into Scilab, we find the solutions on With the script is loaded into Scilab, we find the solutions on the the Console using the command Console using the command x = fsolve(x0,f)x = fsolve(x0,f): :
Equation systems require a different approach. See e.g. Zogg, pp. 66-69
I said above that the Help Browser is confusing when one tries to find out something about optim(). A better source is Section 4.2 in Campbell et al.
fsolvefsolve(): limitation(): limitation
// fsolve.sce
// Solves, for the equation sin(a*x)-x*exp(-x), /// the root closest to a defined point. /// Note: The selected point must not be too / // close to the midpoint between two roots /
clear,clc,clf; function y=myfunc(x)
a=1; y=sin(a*x)-x.*exp(-x);
endfunction
x1=linspace(0,10,300); plot2d(x1,myfunc(x1),5) // Plot functionplot2d(x1,zeros(x1),2) // Add y=0 graphpoint = 8; // Point of interest[x,y]=fsolve(point,myfunc) // Def root closest to pointplot2d(x,y,-3) // Add mark for root location Root mark in wrong place
The script below demonstrates that for values of point close to peak of the sin curve, e.g. 4.6 or 8, Scilab cannot solve the root correctly
Complex numbers:Complex numbers:
demo, taskdemo, task
Complex numbers Complex numbers have not been have not been discussed at any discussed at any length before, so letlength before, so let’’s s look at a practical look at a practical problemproblem
The task is to solve The task is to solve the steadythe steady--state state currents icurrents i11, i, i22, and i, and i33in the shown circuitin the shown circuit
Recall Recall Example 2Example 2--2 2 and write down the and write down the impedance matriximpedance matrix Z Z by inspectionby inspection
R2+jL -R2 -jL-R2 R1+R2 -R1-jL -R1 R1+jL-jC
[Z] =
Ω
Ω Ω
Ω
Complex numbers:Complex numbers:
demo, equationsdemo, equations
By plugging in numeric values we get the following stateBy plugging in numeric values we get the following state--space space equation equation [I]=[Z][I]=[Z]--11[u][u]. Scilab does not have a function for shifting . Scilab does not have a function for shifting between polar and rectangular coordinates, so we recalculate thebetween polar and rectangular coordinates, so we recalculate thevoltages manually (a rectangularvoltages manually (a rectangular--toto--polar conversion routine is polar conversion routine is included in the script), which is simple in this caseincluded in the script), which is simple in this case::
Note that u2 was selected opposite to u1, hence the minus signNote that u2 was selected opposite to u1, hence the minus sign Scilab has no problems with doing inverse matrices but, as mentiScilab has no problems with doing inverse matrices but, as mentioned oned
before, left hand division (before, left hand division (\\) typically gives better accuracy) typically gives better accuracy
i1i2 =i3
0-j100-500-j0
0+j0
80+j12 -80 -j12-80 100 -20-j12 -20 20-j8
-1
Complex numbers:Complex numbers:
demo, script (1/3)demo, script (1/3)
// circuit3.sce
// Complex mesh-current solution. The complex results are /// converted from rectangular to polar values by computing /// their magnitude and phase. The clean() function is used /// to eliminate computing errors around zero. /
u = [-100*%i; -500; 0]; // Voltage matrixi_n = Z\u; // Compute i = Z\u
// Calculate magnitude and phase://---------------------------------------------magn_i = []; // Define empty current matrixphase_i = []; // Define empty phase matrixfor j = 1:1:3 // Compute for three currentsmagn_i(j) = sqrt(real(i_n(j))^2 + imag(i_n(j))^2);
// Computes magnitude
The initial step is as The initial step is as Ex #5; the residual Ex #5; the residual check is at the end of check is at the end of the scriptthe script
Now we have to Now we have to transform rectangular transform rectangular data to polar datadata to polar data
The The for for …… endend loop is loop is run through three run through three times, once for each times, once for each current (i1current (i1……i3)i3)
Computing the Computing the magnitude is magnitude is straightforwardstraightforward
Complex numbers:Complex numbers:
demo, script (2/3)demo, script (2/3)
This is where one has This is where one has to be careful and to be careful and consider all consider all alternativesalternatives
Note that the zero Note that the zero (0) condition gets a (0) condition gets a margin for computing margin for computing errors through the errors through the clean()clean() functionfunction
Each time the Each time the for ... for ... endend loop is run loop is run through, the matrix through, the matrix result()result() collects the collects the datadata
// Calculate phase://------------------------if clean(real(i_n(j))) > 0 then // In 1st or 4th quadrant
phase_i(j) = atan(imag(i_n(j))/real(i_n(j)))*(180/%pi);elseif clean(real(i_n(j))) < 0 // In 2nd or 3rd quadrant
if clean(imag(i_n(j))) > 0 then // In 2nd quadrantphase_i(j) = atan(imag(i_n(j))/real(i_n(j)))*(180/%pi) + 180;
elseif clean(imag(i_n(j))) < 0 then // In 3rd quadrantphase_i(j) = atan(imag(i_n(j))/real(i_n(j)))*(180/%pi) - 180;
else // On negative Re-axisphase_i(j) = 180;
endelseif clean(imag(i_n(j))) > 0 // On positive Im-axis
phase_i(j) = 90;elseif clean(imag(i_n(j))) < 0 // On negative Im-axis
The result is displayed The result is displayed with the with the dispdisp()()command with command with everything included in everything included in the argument vectorthe argument vector
Finally, the preliminary Finally, the preliminary result is checkedresult is checkedas beforeas before
And the answer on the And the answer on the Console:Console:
where where opt(dopt(d)) is an optional step size. is an optional step size. However, ScilabHowever, Scilab’’s s Help BrowserHelp Browserrecommends using the recommends using the default valuedefault value
To the right the derivative for the To the right the derivative for the earlier investigated function has been earlier investigated function has been computed at five different pointscomputed at five different points
derivative()derivative() outputs a 5x5 matrix, in outputs a 5x5 matrix, in which the diagonal is of interestwhich the diagonal is of interest
// derivative_1.sce
// Derivative of sin(x)/((x-0.1)^2+0.1) /// calculated at selected points /
clear,clc;funcprot(0);
deff('y=f(x)','y=sin(x)./((x-0.1)^2 + 0.1)');
x = [-2 -1 0 1 2]'; // Points of interestdisp(["Point", "Derivative"]) disp([x, diag(derivative(f,x))])
This script that plots This script that plots the previous function the previous function together with its together with its derivativederivative
The equation and its The equation and its derivative are defined derivative are defined with separate with separate deffdeff()()functionsfunctions
fplot2d()fplot2d() accepts the accepts the same multiple plot same multiple plot structure as was used structure as was used earlier with earlier with plot2d()plot2d()
children(2) children(2) and and children(3) children(3) are usedare usedbecause because children(1) children(1) is reserved for legendis reserved for legend
// derivative_3.sce
// Plotting f(x) = sin(x)/((x-0.1)^2+0.1) /// and its derivative /
clear,clc,clf; funcprot(0)
x = -5:0.01:5; // Area of interestd = 0.001; // Step size
A lesson from doing this exercise is that two deff() functions in tandem, i.e. one for f(x) followed by one for f’(x) that utilizes f(x), does not work. On the contrary, the attempt may cause Scilab to crash
Pay attention to the legend command in the script. It comes before the related handle statements, but Scilab does not complain. Beats me...
Consider the definite integralConsider the definite integral
To solve the integral, first define To solve the integral, first define the function y = the function y = f(xf(x), e.g. using ), e.g. using the the deffdeff()() functionfunction
The integral can then be The integral can then be evaluated using Scilabevaluated using Scilab’’s s intgintg()()function,* i.e.:function,* i.e.:
A = A = intg(a,b,fintg(a,b,f))
A = f(x) dx∫a
b -->deff('y=f(x)', 'y=6*x^2'); -->A = intg(-2,1,f) A = 18.
The length of an arc The length of an arc f(xf(x), ), between points a and b, is given between points a and b, is given by the definite integralby the definite integral
LetLet’’s compute the length of s compute the length of f(xf(x) = x) = x33/24 + 2x/24 + 2x--11 from x=2 to from x=2 to x=3x=3
The task requires manual The task requires manual derivation, which yieldsderivation, which yields
f f ’’ (x) = x(x) = x22/8 /8 -- 2x2x--22
L = 1 + [f ’(x)] 2 1/2 dx∫a
b -->deff('y=g(x)','y=sqrt(1+(x^2/8-2*x^(-2))^2)');
The function The function int2dint2d ()() computes computes the 2D area integral of a the 2D area integral of a function function f(x,yf(x,y) over a region ) over a region consisting of N trianglesconsisting of N triangles
x and y must therefore be x and y must therefore be defined through triangulation defined through triangulation matrices X and Y, after which matrices X and Y, after which the command isthe command is
[[I,errI,err] = int2d] = int2d (X,Y,f)(X,Y,f) , ,
and Scilab returns the and Scilab returns the integration variable integration variable II and an and an estimation of the error, estimation of the error, errerr(not mandatory)(not mandatory)
The triangles are ABC and ACD, The triangles are ABC and ACD, as shown in the picture. as shown in the picture. Triangle elements are inserted Triangle elements are inserted columncolumn--wise in the matrices wise in the matrices
LetLet’’s compute the double s compute the double integralintegral
By looking at the integration By looking at the integration limits of the function we find limits of the function we find the triangulation matrices X and the triangulation matrices X and Y:Y:
// Plot the function z = y*sin(x) + x*sin(y) /// over the rectangle 0<x<%pi, %pi/2<y<2*%pi /
clear,clc,clf;
x=linspace(0,%pi,30); // Linear x axisy=linspace(%pi/2,2*%pi,30); // Ditto y axis[X,Y]=meshgrid(x,y); // Surface meshZ=(Y.*cos(X)+X.*sin(Y)); // 3D surface equationsurf(X,Y,Z) // Plot 3D surfacextitle('f(x,y) = y*cos(x) + x*sin(y),… // Add title
with 0<x<%pi, %pi/2<y<2*%pi')
The plot of f(x,y) = y*cos(x) + x*sin(y) is here done with a separate script:
We can check the computed We can check the computed result using result using the other possible the other possible triangulationtriangulation
Now we get the triangulation Now we get the triangulation matrices shown herematrices shown here
Plugging these matrices Plugging these matrices into the Console gives the into the Console gives the following result:following result:
a bX = b b ,
a a
c cY = c d
d d
A=a,c B=b,c
D=a,d C=b,d
x
y
d
c
a b
ABD
BCD
-->X=[0 %pi 0; %pi %pi 0]‘;
-->Y=[%pi/2 %pi/2 2*%pi; %pi/2 2*%pi 2*%pi]‘;
-->[I,err]=int2d(X,Y,f) err =
9.887D-11 I =
- 4.9348022
Same result, but a small difference in the estimated error
Ordinary differential Ordinary differential
equations (equations (ODEsODEs): ode()*): ode()*
This simplest call for solving This simplest call for solving ODEsODEs is is ode()ode() thatthat has the has the general form: general form:
y = ode(y0,t0,t,f(t,y))y = ode(y0,t0,t,f(t,y))
wherewhere–– y0y0 = initial condition (normally a column vector)= initial condition (normally a column vector)–– t0t0 = initial time (normally 0)= initial time (normally 0)–– tt = vector of instances for which the solution has to be = vector of instances for which the solution has to be
computed, e.g. t = [0:0.01:10]computed, e.g. t = [0:0.01:10]–– f(t,yf(t,y)) = function for which the solution has to be found, often = function for which the solution has to be found, often
stated as [stated as [ydotydot] = ] = f(t,yf(t,y). Here ). Here tt is a scalar, is a scalar, yy a column vector, a column vector, and and [[ydotydot]] a column vector with values of the derivativea column vector with values of the derivative
ode()ode() can also have optional arguments. See can also have optional arguments. See HelpHelp for for detailsdetails
*) Sallet, G.: Ordinary Differential Equations with Scilab, <http://www.math. univ-metz.fr/~sallet/ODE_Scilab.pdf> is an “old” but good text.
// first-order_ODE.sce
// Solve the equation x'+x^2 = t /// for x(0) = 0 /
LetLet’’s find the solution for the firsts find the solution for the first--order homogenous ODEorder homogenous ODExx’’ + x+ x22 = t= t , ,
with the initial condition x(0) = 1. Plot the solution for t with the initial condition x(0) = 1. Plot the solution for t ϵϵ [0,20][0,20] Start by rewriting the function as xStart by rewriting the function as x’’ = = --xx22 + t + t Note how xNote how x’’ is designated y in the is designated y in the deffdeff()() argumentargument
In this case Scilab does not accept numeric arguments of children
SecondSecond--order order ODEsODEs: :
introductionintroduction
Scilab only supports firstScilab only supports first--order order differential equationsdifferential equations——as do other as do other programs for numeric computingprograms for numeric computing
Higher order problems must be Higher order problems must be reduced to reduced to firstfirst--order systemsorder systems, i.e. , i.e. by shifting to by shifting to statestate--space space representationrepresentation
The methodology runs according The methodology runs according to the algorithm shown to the to the algorithm shown to the rightright
A good treatment of stateA good treatment of state--space space methods is e.g. Chapter 8 in methods is e.g. Chapter 8 in Burns, R.S.: Burns, R.S.: Advanced Control Advanced Control EngineeringEngineering, Butterworth, Butterworth--Heinemann, 2001 Heinemann, 2001
Problem expressed as second-order ODE
Select state variables
Substitute state variables with zeroth-
order variables
Rewrite problem as first-order state-space
equation system
Solve using Scilab’s ode() function
SecondSecond--order order ODEsODEs: :
RLC circuit (1/5), the taskRLC circuit (1/5), the task The task is to plot the output The task is to plot the output
voltage vvoltage v22 for the shown RLC for the shown RLC circuit, whencircuit, when–– U = 5VU = 5V–– switch closes at t = 1switch closes at t = 1–– R = 0.3 R = 0.3 ΩΩ–– L = 0.5 HL = 0.5 H–– C = 0.8 FC = 0.8 F
We can derive the following We can derive the following secondsecond--order ODE for the order ODE for the circuit:circuit:
LC + RC + v2(t) = v1(t) d2v2(t) dv2(t)
dt2 dt
SecondSecond--order order ODEsODEs: :
RLC circuit (2/5), reduceRLC circuit (2/5), reduce Simplify the equation for clarity:Simplify the equation for clarity:
LCvLCv22’’’’ + RCv+ RCv22’’ + v+ v22 = v= v11
Select Select vv22 and its derivative and its derivative vv22’’ as state variables, and substitute:as state variables, and substitute:
xx11 = v= v22 and and xx22 = v= v22’’ (= x(= x11’’))
With With vv11 substituted by substituted by uu , the first, the first--order ODE system becomes:order ODE system becomes:
RLC circuit (4/5), scriptRLC circuit (4/5), scriptThe ode() function computes our differential equation by using the RLC state-space expression of the second deff() function. Calling parameters are y0 and t0
Note the plot command (new way of doing plot2d())
// Compute using ode(), which calls previous deff() function://---------------------------------------------------------------------------------out0 = [0;0]; // Initial output voltage & d(v2)/dt = 0t0 = 0; // Initial time = 0Time = [0:0.05:10]; // Time as abscissaState = ode(out0,t0,Time,RLC); // State variable vector (v2',v2)
// Plot and add title & grid://-----------------------------------plot2d(Time,[State',u(Time)']); // Note transposed arguments!
xtitle('Series RLC circuit with step input voltage',... 'Time (s)','Input + Output voltage v2(t) & d(v2(t))/dt')
xgrid
// Edit plot://--------------a=gca(); a.children.children.thickness=2 // Make all graphs thicker
// Add legend (must come after handle commands)://---------------------------------------------------------------------legend('Output voltage, v2(t)','d(v2(t))/dt','Input signal’,4)
Handle commands come before the legend (in this case Scilab gives an error message if you try it the other way)
SecondSecond--order order ODEsODEs: :
RLC circuit (5/5), plotRLC circuit (5/5), plot
The plot shows that the circuit is undercriticallydamped. Change the resistor value to 1.5 Ω, and it becomes critical. It is overcritical for still higher values of R
Handle commands could be used to edit the figure further. I did not do it because the main point with this demo is to solve a second-order ODE
odeoptionsodeoptions()()
The command
%ODEOPTIONS = odeoptions()
opens the GUI shown right. With the help of it you can change parameters for solving differential equations. Examples:
• h0 = size of first step • hmax = maximum step size• hmin = minimum step size• mxstep = minimum # of steps
Check with Help for details
Dr.EWJohnny Heikell
Dr.EWJohnny Heikell
14. Examples, Set 5 14. Examples, Set 5
The examples give additional The examples give additional insight into working with math insight into working with math on Scilabon Scilab
Return to Contents
Example 5Example 5--1: 1:
solving an equation (1/3)solving an equation (1/3)
This demo is based on This demo is based on MMääkelkelää
LetLet’’s solve the equations solve the equation
ln(xln(x) = x) = x22--7x+107x+10
We begin by plotting it (note We begin by plotting it (note how the multiple plot command how the multiple plot command is constructed)is constructed)
The plot reveals that there are The plot reveals that there are two solutions, at xtwo solutions, at x11 ≈≈ 2 and 2 and xx22 ≈≈ 5.55.5
You can see the roots more You can see the roots more exactly by using the Graphics exactly by using the Graphics WindowWindow’’s s zoom functionzoom function (next (next slide)slide)
The zoom function gives more precise values for the roots:The zoom function gives more precise values for the roots:xx11 = 1.81 and x= 1.81 and x22 = 5.49= 5.49
To improve the accuracy even more we can calculate the roots witTo improve the accuracy even more we can calculate the roots with h the the fsolvefsolve()() function (next slide)function (next slide)
Ex 5Ex 5--1: solving an 1: solving an
equation (3/3)equation (3/3)
fsolvefsolve()() delivers the ultimate delivers the ultimate answeranswer
We can also check the error of We can also check the error of the result. As shown, it is close the result. As shown, it is close to zeroto zero
Lessons learnedLessons learned: Precise zoom : Precise zoom in the Graphics Window in the Graphics Window produces satisfactory accuracy produces satisfactory accuracy for most practical engineering for most practical engineering purposes (two decimals), purposes (two decimals), considering that an old considering that an old engineering adage says that engineering adage says that factors that influences the result factors that influences the result by less than 10% can be by less than 10% can be forgotten forgotten
-->deff('y=f(x)', 'y=log(x)-(x^2-7*x+10)');
-->x1=fsolve(1.8,f)x1 =
1.8132512
-->x2=fsolve(5.5,f)x2 =
5.4881107
-->f(x1),f(x2)ans =
- 7.772D-16 ans =
- 4.441D-16
Check
ExxampleExxample 55--2: ODE, 2: ODE,
series RLC circuit (1/5)series RLC circuit (1/5) This example is a modification of This example is a modification of
the earlier RLC circuit and its the earlier RLC circuit and its secondsecond--order ODEorder ODE
However, we now want to define However, we now want to define the current the current i(ti(t) and charge ) and charge q(tq(t) ) for a sinusoidal input signal and for a sinusoidal input signal and initial conditions i(0) = 0 and q(0) initial conditions i(0) = 0 and q(0) = 0 = 0
KirchoffKirchoff’’ss second law gives:second law gives:
wherewhere
di(t) 1
dt C L + Ri(t) + q(t) = u(t)
q = i(t) dt∫0
t
= i dt
dqor:
R = 0.3 ΩL = 0.5 HC = 0.8 Fu(t) = sin(5t)
Ex 5Ex 5--2: ODE, series RLC 2: ODE, series RLC
circuit (2/5)circuit (2/5)
No substitutions are required in this case since No substitutions are required in this case since qq and its derivative and its derivative iiare state variables. The firstare state variables. The first--order equation system is therefore:order equation system is therefore:
Which gives the following stateWhich gives the following state--space expression:space expression:
– q – i + u 1 R 1
LC L L
q’ = i
i’ =
= + u 1 R 1
LC L L
q’ 0 1 q 0
i’ – – i
Remember: x’ = Ax + Bu
Ex 5Ex 5--2: ODE, series RLC 2: ODE, series RLC
circuit (3/5), scriptcircuit (3/5), script
// series_RLC_ODE.sce
// Simulation of the current i(t) and charge q(t) in /// a series RCL circuit with sinusoidal input voltage /// and initial conditions i(0)=0, q(0)=0. /// Legend: ss = state-space /
// Define state-space equations & input signal://--------------------------------------------------------------A = [0 1; -1/(L*C) -R/L]; // SS system matrixB = [0; 1/L]; // SS input matrixdeff('[ut]=u(t)','ut=sin(5*t)'); // Sinusoidal inputdeff('[ss]=RLC(t,y)',‘ss=A*y+B*u(t)'); // SS expression
There is nothing new here compared to the previous RLC/second-order ODE
Ex 5Ex 5--2: ODE, series RLC 2: ODE, series RLC
circuit (4/5), scriptcircuit (4/5), script
// Compute using ode(), which calls the previous deff() function://---------------------------------------------------------------------------------------y0 = [0;0]; // Initial current & charge = 0t0 = 0; // Initial time = 0Time = [0:0.05:8]; // Time as abscissaY = ode(y0,t0,Time,RLC); // Y = state variable vector (i,q)
// Plot current & charge://-------------------------------plot2d(Time,Y',[2 5],'024'); // Plot state vectors, note transposed Y
xtitle('Series RLC circuit with sinusoidal input voltage',...'Time','Current & Charge')
xgridlegend('Charge, q(t)','Current, i(t)')
The ode() is the same as in the previous RLC case
Check the plot argument ‘024’and its effect on the plot (next slide)
Ex 5Ex 5--2: ODE, series RLC 2: ODE, series RLC
circuit (5/5), plotcircuit (5/5), plot
This is the plot for the shown This is the plot for the shown component values. There are component values. There are initial fluctuations before the initial fluctuations before the situation begins to stabilizesituation begins to stabilize
This is the plot for more This is the plot for more realistic component values of realistic component values of R = 3 kR = 3 kΩΩ, L = 0.5 , L = 0.5 µµH, and C H, and C = 0.8 = 0.8 µµF F
There used to be problems There used to be problems with the latter case (Scilab with the latter case (Scilab 5.1.1), but these have 5.1.1), but these have obviously been solvedobviously been solved
Example 5Example 5--3: System of 3: System of
firstfirst--order order ODEsODEs This example is modified from This example is modified from PovyPovy (pp. 66(pp. 66--67, 67, PovyPovy also has an also has an
animation version on pp. 67animation version on pp. 67--68, but it causes Scilab to 68, but it causes Scilab to crashcrash). The ). The example finishes with and interesting example finishes with and interesting plot2d()plot2d() commandcommand
The task is to plot the The task is to plot the slope (vector) fieldslope (vector) field for the following system of for the following system of firstfirst--order order ODEsODEs ::
xx’’ = y= y
yy’’ = = --x x –– yy
together with a single together with a single phase portraitphase portrait with the initial trajectory with the initial trajectory x(0) = x(0) = 1 1 and and y(0) = 1y(0) = 1
The script can utilize either the ODE system (as The script can utilize either the ODE system (as PovyPovy has done) or has done) or the statethe state--space representation. Wespace representation. We’’ll select the latter, in line with ll select the latter, in line with earlier examplesearlier examples
x’ 0 1 xy’ -1 -1 y=
Ex 5Ex 5--3: 3:
scriptscript// ode_phase_plane_m.sce
// The scripts plot the phase plane of the /// equation system x'=y, y'=-x-y together with /// a single phase portrait that satisfies the /// initial condition x(0)=1, y(0)=1 /
clear,clc,clf;funcprot(0);
// First order transformation://--------------------------------------A = [0 1;-1 -1]; // State vectordeff('[ss]=firstorder(t,x)',‘ss=A*x');
// Plot phase portrait on slope field://-----------------------------------------------plot2d(x(1,:),x(2,:),5,'004')
xtitle('Phase plane of dx/dt=y, dy/dt=-x-y')
The state-space function is named firstorder()
The vector field is drawn with fchamp()
ode() has only one argument (and accepts only one name) for the initial condition x and y are renamed x(1) and x(2) respectively, as shown in the arguments for plot2d()
Ex 5Ex 5--3: plot3: plot
Full plot
Phase portrait with initial condition [1,1]
Zoomed center area
Scilab does not put the “haircross” at the origin, which is just as well
Example 5Example 5--4: Simpson4: Simpson’’s s
rule, the taskrule, the task This example demonstrates integration of double integrals using This example demonstrates integration of double integrals using
SimpsonSimpson’’s rule for calculating double integralss rule for calculating double integrals LetLet’’s first define a subroutine for s first define a subroutine for
SimpsonSimpson’’s rule and then add code s rule and then add code for the function, the area integral for the function, the area integral of which should be calculatedof which should be calculated
In this case weIn this case we’’ll repeat the earlier ll repeat the earlier functionfunction
but the script can easily be modified but the script can easily be modified for other algebraic expressionsfor other algebraic expressions
There are numerous variants of SimpsonThere are numerous variants of Simpson’’s rule for double integrals s rule for double integrals (for an accurate algorithm, see (for an accurate algorithm, see FairesFaires, Burden: , Burden: Numerical MethodsNumerical Methods, , 3rd ed., Brooks Cole 2002). The one given on the next slide is b3rd ed., Brooks Cole 2002). The one given on the next slide is based ased on on UrrozUrroz and known as Simpsonand known as Simpson’’s 1/9 rules 1/9 rule
I = (y cos(x) + x sin(y)) dx dy,∫π/2
2π
∫0
π
Ex 5Ex 5--4: Simpson4: Simpson’’s rule, s rule,
algorithmalgorithm
where we calculate our function f(x,y) in a rectangular domain R = a<x<b, c<y<d
Here x is divided into n and y into m even parts, so that:
2. UDF declaration followed by clarifying comments
3. Body of UDF (next slide)
4. The code for f(x,y) that calls the UDF (two slides down)
// double_integration_simpson.sce
//-----------------------------------------------------------------/// The program calculates the double integral of the /
// function f(x,y) = y*cos(x)+x*sin(y); by calling the /// subroutine simpson_double(x0,xn,n,y0,ym,m,f) ///-----------------------------------------------------------------/
clear,clc;
function [integral] = simpson_double(x0,xn,n,y0,ym,m,f)
// The function calculates the double integral of /// the function f(x,y) in the region x0<x<xn, /// y0<y<ym using Simpson's 1/9 rule. The x- and /// y- ranges are divided into n and m subintervals, /// respectively, where both m and n must be even. /// The function modifies m and n if they are odd /
Ex 5Ex 5--4: Simpson4: Simpson’’s rule, s rule,
scriptscriptThis is the body of the UDF
It starts by checking and (if necessary) correcting the input parameters nand m
Here we again meet the function feval(). It returns a matrix z(i,j) = f(x(i),y(j))
Heart of UDF: The double summation that produces Sij before forming the final answer (output argument)
// Check that n and m are even, correct as needed://-------------------------------------------------------------------if modulo(n,2) <> 0 then // Check that n is even;n = n + 1 // if not, add one
endif modulo(m,2) <> 0 then // Check that m is even;m = m + 1 // if not, add one
end
// Define x and y increments and region://------------------------------------------------------Dx = (xn-x0)/n // Define delta xDy = (ym-y0)/m // Define delta yx=[x0:Dx:xn] // Region and increments of xy=[y0:Dy:ym] // Region and increments of y
// Calculate double integral://------------------------------------z=feval(x,y,f) // Matrix z(i,j)=f(x(i),y(j))Sij = 0 // Initiate Sijfor i = 2:2:n // Sum Sij along x-axisfor j = 2:2:m // Sum Sij along y-axisSij = Sij + z(i-1,j-1)+z(i-1,j+1)+z(i+1,j-1)+z(i+1,j+1)...+4*(z(i-1,j)+z(i,j-1)+z(i,j+1)+z(i+1,j))+16*z(i,j)
endendintegral = (Dx*Dy/9)* Sij // Evaluate integral
endfunction
Ex 5Ex 5--4: Simpson4: Simpson’’s rule, s rule,
script & resultscript & resultNow comes the function f(x,y)that we want to integrate. We start by defining integration limits and steps
An interesting problem emerges: How should one define the calling argument f(x,y)? If it is entered as f(x,y)=y*cos(x)+ x*sin(y),Scilab will complain that x and yare not defined. The solution is deff()
And finally: the answer as displayed on the Message box (the last digit of the earlier demo was more accurate)
// Define integration parameters://--------------------------------------------x0 = 0; // Lower bound for xxn = %pi; // Upper bound for xn = 100; // # of subintervals of xy0 = %pi/2; // Lower bound for yym = 2*%pi; // Upper bound for ym = 100; // # of subintervals of y
// Define function & calculate integral://---------------------------------------------------deff('[z]=f(x,y)','z = y*cos(x)+x*sin(y)');I = simpson_double(x0,xn,n,y0,ym,m,f) messagebox('The result of the double integral is:…
'+string(I))
The exact answer is -π2/2 = -4.934802199...
Ex 5Ex 5--4: Simpson4: Simpson’’s rule, s rule,
discussiondiscussion
I had big problems with this one. Scilab repeatedly insisted on I had big problems with this one. Scilab repeatedly insisted on coming up with the wrong answer. I tried to find the error in secoming up with the wrong answer. I tried to find the error in several veral waysways::–– Checked manually that the earlier answer (Checked manually that the earlier answer (-- 4.9348022, or –π2/2) was ) was
correctcorrect–– Changed trigonometric functions to exponential equivalents at noChanged trigonometric functions to exponential equivalents at no availavail–– Checked the algorithm by comparing with solved examples from matChecked the algorithm by comparing with solved examples from math h
and and MatlabMatlab booksbooks
Finally, when I plugged in the equation in the now several timesFinally, when I plugged in the equation in the now several timeschanged script, changed script, the result came out rightthe result came out right. Most likely I had written . Most likely I had written sin(x)sin(x) instead of instead of cos(xcos(x))..........
Lessons learnedLessons learned: It: It’’s hard to see bugs in ones hard to see bugs in one’’s own programs own program Another thing: The script uses Another thing: The script uses nested loopsnested loops ((for i = ...; for j = ...; ... for i = ...; for j = ...; ...
end; end;end; end;). This ). This should be avoided in should be avoided in ScilabScilab as far as possible, as far as possible, because the performance is poor in such casesbecause the performance is poor in such cases
Dr.EWJohnny Heikell
Dr.EWJohnny Heikell
15. Working with GUIs15. Working with GUIs
The term GUI relates both to ScilabThe term GUI relates both to Scilab’’s s embedded windows and to user embedded windows and to user defined interactive windows defined interactive windows
Return to Contents
IntroductionIntroduction
ScilabScilab’’s GUI interface was updated with version 5. Old tutorials (e.g. s GUI interface was updated with version 5. Old tutorials (e.g. Campbell et al.) are therefore of limited valueCampbell et al.) are therefore of limited value
Brief discussions of GUIs can be found in Brief discussions of GUIs can be found in KubitzkiKubitzki and in and in AntonelliAntonelli & & ChiaveriniChiaverini (you can read Scilab scripts in German and Italian even if (you can read Scilab scripts in German and Italian even if you donyou don’’t speak the language) t speak the language)
Although the GUI interface has improved, the Scilab team still cAlthough the GUI interface has improved, the Scilab team still cannot annot be proud of their achievementbe proud of their achievement
GUIs is a large subject; the Help Browser identifies about 50 GUGUIs is a large subject; the Help Browser identifies about 50 GUII--related functions. Werelated functions. We’’ll be able to cover only a part of them (as ll be able to cover only a part of them (as always)always)
We have earlier seen cases with the dialogue box (We have earlier seen cases with the dialogue box (x_dialogx_dialog()() in Ex. in Ex. 11--3) and the 3) and the messageboxmessagebox ((messageboxmessagebox()() in Ex. 5in Ex. 5--4)4)
The first discussion below is about how to tailor ScilabThe first discussion below is about how to tailor Scilab’’s windowss windows Following that we shall look at some user defined dialog windowsFollowing that we shall look at some user defined dialog windows. A . A
““realreal”” GUI is presented in Example 6GUI is presented in Example 6--11
Tailoring windows (1/2)Tailoring windows (1/2)
deactivates buttons or menus created bydeactivates buttons or menus created byaddmenuaddmenu()()
unsetmenuunsetmenu()()
activates buttons or menus created byactivates buttons or menus created byaddmenuaddmenu()()
setmenusetmenu()()
deletes buttons or menus created bydeletes buttons or menus created byaddmenuaddmenu()()
delmenudelmenu()()
adds new buttons or menus in the main adds new buttons or menus in the main and/or Graphics Window command panelsand/or Graphics Window command panels
There are four main functions for tailoring either the Console or the Graphics Window:
The numeric The numeric gwingwin argument, if present, tells on which Graphics argument, if present, tells on which Graphics Window the button should be installed Window the button should be installed
The The buttonbutton argument is a character string that defines a shortcut on argument is a character string that defines a shortcut on the the menu barmenu bar
Tailoring windows (2/3)Tailoring windows (2/3)
Optional arguments are:Optional arguments are:–– submenussubmenus character character string with names of submenu items string with names of submenu items –– actionaction definition list of the type definition list of the type action=action=list(flaglist(flag, proc. name), proc. name)
This is not the whole truth. The book by Das, which is a collectThis is not the whole truth. The book by Das, which is a collection of ion of ScilabScilab’’s s HelpHelp function texts, contains more hintsfunction texts, contains more hints
As a demonstration of the above said, here is a command that addAs a demonstration of the above said, here is a command that adds s the menu the menu GraphicsGraphics, with submenus , with submenus New WindowNew Window and and Clear Clear WindowWindow, to the Console, to the Console’’s menu bar:s menu bar:
You can convince yourself that the added Console menu works by You can convince yourself that the added Console menu works by clicking on clicking on ““New windowNew window”” to open the Graphics Window and click on to open the Graphics Window and click on ““Close windowClose window”” to close it againto close it again
As the following steps we can deactivate the created menu by theAs the following steps we can deactivate the created menu by thecommand command unsetmenuunsetmenu()() and delete it with and delete it with delmenudelmenu()(): :
Interacting with the Interacting with the
Graphics Window (1/4)Graphics Window (1/4) Scilab has numerous commands for interacting with the Graphics Scilab has numerous commands for interacting with the Graphics
Window; among these are:Window; among these are:
The script below is adapted fromThe script below is adapted from Help/Help/xgetmousexgetmouse. It draws a . It draws a rectangle on the Graphics Window. The rectangle starts off at threctangle on the Graphics Window. The rectangle starts off at the e location of the mouse pointer at the first click of the leftlocation of the mouse pointer at the first click of the left--hand hand button, and freezes the rectangle at the second clickbutton, and freezes the rectangle at the second click
Removes the handlerRemoves the handlerseteventhandlerseteventhandler (' '(' ' ))
Sets an event handler for the current Graphics Sets an event handler for the current Graphics WindowWindowseteventhandlerseteventhandler ()()
Returns the current position of the mouseReturns the current position of the mousexgetmousexgetmouse ()()
Waits for a mouse click, returns a) the number of Waits for a mouse click, returns a) the number of window where the click occurs, b) position of the window where the click occurs, b) position of the click, and c) the number of the mouse button used click, and c) the number of the mouse button used (left, center, right)(left, center, right)
xclickxclick ()()
Interacting with the GW Interacting with the GW
(2/4): script (1/2)(2/4): script (1/2)
// rectangle_selection.sce
// The script demonstrates the use of the mouse-related /// commands xclick(), xgetmouse() and xrect() when they /// are used to draw a rectangle in the Graphics Window /
clear,clc,clf;
// Initialize drawing process://--------------------------------------a = gca(); // Get current Axesa.data_bounds = [0 0;100 100]; // Boundaries for x & y coordinatesxtitle('Click left mouse button & drag to create a rectangle. ...Click a second time to freeze') // Display instruction
show_window(); // Put Graphics Window on top
// Start drawing rectangle in the Graphics Window://--------------------------------------------------------------------[button,x_coord,y_coord] = xclick(); // Point of mouse button clickxrect(x_coord,y_coord,0,0)
// Start rectangle at mouse pointer x & y coordinatesrectangle = gce(); // Get rectangle handlemouse = [x_coord,y_coord,-1]; // Mouse pointer 1x3 matrix
Look for a description of data_bounds under Help/axes_properties(not very helpful)
According to Help/ xclick the first vector element should be numeric, but Scilab requires a name
Look at the arguments of xrect(), it is those that we later play with
The third vector element is set to -1, or mouse pointer has moved (see Help/event handler functions)
Interacting with the GW Interacting with the GW
(3/4): script (2/2)(3/4): script (2/2)
// Execute mouse commands for rectangle://---------------------------------------------------------while mouse(3) == -1 do // Repeat until second clickmouse = xgetmouse(); // Check mouse positionx_coord1 = mouse(1); // Mouse location in x-planey_coord1 = mouse(2); // Mouse location in y-planex_origin = min(x_coord,x_coord1); // Define x originy_origin = max(y_coord,y_coord1); // Define y originwidth = abs(x_coord-x_coord1); // Define width of rectangleheight = abs(y_coord-y_coord1); // Define height of rectanglerectangle.data = [x_origin,y_origin,width,height];
// Change rectangle origin, width and heightend
The while-do-end loop runs forever unless a second mouse button click changes the condition mouse(3)==-1. Should a timeout condition be added to the loop?
The loop starts by checking the status of the mouse. Recall from the previous slide the vector mouse = [x_coord, y_coord,-1]
Following that, new data are calculated for the rectangle
The finishing touch is to define new handle values (see xrect()arguments above)
Interacting with the GW Interacting with the GW
(4/4): what it does(4/4): what it does
2) Put the cursor somewhere, click and drag, and click a second time to freeze
1) The Graphics Window with instruction pops up, as required by the show_window() command
What do you do with this feature? Beats me....
GUI demo 1: Introducing GUI demo 1: Introducing
figure() & figure() & uicontroluicontrol()() Here Here figure()figure() generates the figure (opens generates the figure (opens
the Graphics Window),the Graphics Window), uicontroluicontrol()()creates the graphical user interface object creates the graphical user interface object in the GW, and two of the items on the list in the GW, and two of the items on the list are highlighted with are highlighted with set()set()
The central argument in this case is The central argument in this case is ’’listboxlistbox’’, which defines the list, which defines the list
Note the Note the scrollbarscrollbar, it pops , it pops up when the height is too up when the height is too small (100) for all itemssmall (100) for all items
// uicontrol-1.sce /
// A basic GUI exercise /
clc; xdel();
f = figure(); // Create a figureh = uicontrol(f,'style','listbox',.. // Create a listbox,…
'position',[50 300 150 100]); // h = handleset(h,'string',"Alpha|Beta|Gamma.. // Fill the list
|Delta|Epsilon|Zeta|Eta|Tau"); set(h,'value',[1 3]); // Highlight items 1 and 3 in the list
GUIs: popGUIs: pop--up window up window
functionsfunctions
Scilab has several commands for creating popScilab has several commands for creating pop--up windows. up windows. Note that Note that x_messagex_message()() is obsoleteis obsolete and will not work in Scilab and will not work in Scilab 5.2 and later versions; 5.2 and later versions; messageboxmessagebox()() has to be used instead:has to be used instead:
Vector/matrix input window (Demo 2, Case 6)Vector/matrix input window (Demo 2, Case 6)x_matrixx_matrix()()
As previous but with multiple choices (Demo2, Case 5)As previous but with multiple choices (Demo2, Case 5)x_choicesx_choices()()
Message presentation (see Demo 2, Cases 1, 2 & 7)Message presentation (see Demo 2, Cases 1, 2 & 7)messageboxmessagebox()()
Alternative selectable from list (Demo 2, Case 3) Alternative selectable from list (Demo 2, Case 3) x_choosex_choose()()
Window with multiWindow with multi--line dialog (Demo 2, Case 4)line dialog (Demo 2, Case 4)x_dialogx_dialog()()
As previous but with multiple string parametersAs previous but with multiple string parametersx_mdialogx_mdialog()()
Creates a list of objects (Demo 2, Case 5)Creates a list of objects (Demo 2, Case 5)list()*list()*
The syntax of the messagebox() function is the following:
Message that you want to convey
Box title (the default is “Scilab
Message”)
Definable icons are:“error”, “hourglass”, “info”, “passwd”, “question”, and “warning”
Icon to be placed in the box
1xn vector of strings with button legends
“modal” tells Scilab to wait for user actions
(otherwise 0 is returned)
GUI demo 2: creating GUI demo 2: creating
poppop--up windows (1/5)up windows (1/5)
Case 1: Recall that this pop-up window was created by adding the command messagebox=(‘The result of the double integral is: ’+string(I)) at the end of the script of Example 5-4
Case 2:
-->m = messagebox('Division by 0: Continue?','WARNING',['Yes' 'No']) m = 0.
Default title
Case 2 is wrong! The Yes/No buttons have no meaning since the case is not declared “modal” and Scilab by design returns the default zero (0)
Here “Brandy” is selected and the answer returned*
Case 7: Create an info list of beverage choices using list()and messagebox()
*) Same problemrepeats. Scilab does not return the answer automatically (in Scilab 5.3.1 it did so with a simpler case, but not in 5.3.2 any more)
-->r = messagebox('Pick','Title',' ',['1','2'],'modal') r = 2.
-->get(0,"screensize_px") ans =
1. 1. 1280. 800.
-->get(0,"screensize_pt")ans =
0. 0. 960. 600.
-->get(0,"screensize_norm")ans =
0. 0. 1. 1.
-->get(0,"screendepth")ans =
24.
GUI: computer screen GUI: computer screen
size & color depthsize & color depth
The computer screen size is needed if we want to position a GUI at a specific position in the field of view
For that we need information of the computer screen size. It can be extracted with the argument screensize_xx. There are more alternatives for the _xx suffix, check Help/root_properties for details
Another alternative is the number of display color resolution bits. It can be found with the argument screendepth
These arguments are used with the function get(), meaning “find out.” See Example 6-1 for a practical case
GUI demo 3: opening a GUI demo 3: opening a
predefined GW, scriptpredefined GW, script This demo shows how to open a new Graphics Window with This demo shows how to open a new Graphics Window with
predefined size and positionpredefined size and position The size is defined relative to the computerThe size is defined relative to the computer’’s screen size in pointss screen size in points The position in the middle of the screen has to be found by triaThe position in the middle of the screen has to be found by trial and l and
errorerror
// screensize_demo.sce
// Opens a new Graphics Window with a predefined size & location /
The small GW opens in the middle of the screen (the picture has been compressed and looks muddled)
Note however that the GW size is not exactly in proportion to the defined ratio of the screen size, and it also changes if we select screensize_px instead of screensize_pt (the location changes as well)
GUI shortcomingsGUI shortcomings
GUIs are not perfected in Scilab. The (messy) text on GUIs in GUIs are not perfected in Scilab. The (messy) text on GUIs in WIKI.Scilab.org/howtoWIKI.Scilab.org/howto/ tells of very old bugs that remain unsolved / tells of very old bugs that remain unsolved
Apart from what is mentioned in Demo 2, Cases 5Apart from what is mentioned in Demo 2, Cases 5--7, and in the end 7, and in the end discussion of Ex 6discussion of Ex 6--1, I have experienced 1, I have experienced problemsproblems withwith–– Demo 1, where the Demo 1, where the listboxlistbox may (or may not) flow over the window framemay (or may not) flow over the window frame–– Ex 6Ex 6--1, where the labels of the slider and first 1, where the labels of the slider and first radiobuttonradiobutton sometimes sometimes
open with reduced font sizeopen with reduced font size
WIKI.Scilab.org/howtoWIKI.Scilab.org/howto/ also mentions the following limitations:/ also mentions the following limitations:–– Scilab does not allow vertical slidersScilab does not allow vertical sliders–– checkbox == radiobuttoncheckbox == radiobutton–– slider has only smallstep, no side arrows (and as I found out wislider has only smallstep, no side arrows (and as I found out with Ex 6th Ex 6--1, 1,
Scilab gets a lockup when I drag the slider)Scilab gets a lockup when I drag the slider)–– foreground color is always greyforeground color is always grey–– pressed radio/check always pale red (have not tried it)pressed radio/check always pale red (have not tried it)–– only only pushbuttonpushbutton, , radiobuttonradiobutton, , checkboxcheckbox, and , and sliderslider support callbacksupport callback
The usual recommendation is to use The usual recommendation is to use Tcl/TkTcl/Tk when advanced GUI when advanced GUI solutions are neededsolutions are needed——another program for you to learnanother program for you to learn
Dr.EWJohnny Heikell
Dr.EWJohnny Heikell
16. File handling16. File handling
We need file handling e.g. to We need file handling e.g. to process measurement dataprocess measurement data
Return to Contents
File handling: File handling:
introductionintroduction In engineering, data on external files often originate in automaIn engineering, data on external files often originate in automated ted
measurements. The data has to be read by Scilab before it can bemeasurements. The data has to be read by Scilab before it can beprocessed. Weprocessed. We’’ll focus our discussion on this aspect of file handling ll focus our discussion on this aspect of file handling
Scilab has a set of commands for file handling, beginning with tScilab has a set of commands for file handling, beginning with the he commands commands mopenmopen()() that opens a file, and that opens a file, and mclosemclose()() that closes it. that closes it. Between those two we use e.g.:*Between those two we use e.g.:*
Check end of a fileCheck end of a filemenfmenf()()
Check size of an objectCheck size of an objectsize() size()
Move the pointerMove the pointermseekmseek()()
Read a file (Read a file (fscanMatfscanMat()() for matrix files)for matrix files)mfscanfmfscanf(), (), fscanMatfscanMat()()
Write data to a file (Write data to a file (fprintMatfprintMat()() for matrix files)for matrix files)mfprintmfprint, , fprintMatfprintMat()()
*) The full set of i/o functions (~60 in all) can be found underHelp/Files: Input/Output functions. Recall the related load() function in Chapter 10.
File handling: demo 1 File handling: demo 1
(1/5), introduction(1/5), introduction
Open write file: fd, path, name
Write data into file
Close write file, ‘w’
Open file for reading, ‘r’
Define contents to read (whole file)
Return pointer to beginning of file
Define data to read
Close file
In this demo Scilab creates the data In this demo Scilab creates the data file that is then read; later wefile that is then read; later we’’ll se ll se how to read from text files created how to read from text files created by other programsby other programs
Script sequences are shown to the Script sequences are shown to the right. The script demonstrates the right. The script demonstrates the use of the functions use of the functions mopenmopen()(), , mclosemclose()(), , mfprintfmfprintf()(), , mseekmseek()(), and , and mfscanfmfscanf()()
Pay attention to the following steps: Pay attention to the following steps: openopen as as ‘‘ww’’ file, file, closeclose ‘‘ww’’ file, file, openopenas as ‘‘rr’’ file, file, closeclose ‘‘rr’’ file. The stack file. The stack pointer moves down as we write into pointer moves down as we write into the file and must be returned to the the file and must be returned to the top before we begin to readtop before we begin to read
File handling: demo 1 File handling: demo 1
(2/5), script(2/5), script
// file_exercise1.sce
// The script demonstrates the process of 1) creating a text file /// on Scilab, 2) closing it, 3) opening it again to be written into, /// 4) writing the actual data into the file, 5) reading certain /// pieces of data from the file, and 6) closing the read file, /// Notice that both close operations are necessary! /
clear,clc;
// Create and open a text file for the exercise://-------------------------------------------------------------fd = mopen('H:\Dr.EW\Writings\Scilab examples\file_exercise1.txt','w');
// Create data and write into the exercise file://-------------------------------------------------------------t = (1:1:18)'; // Integers from 1 to 18mfprintf(fd,'%6.3f\n',t);
Create the text (.txt) file with mopen(). fd= file descriptor. Note the argument ‘ w’ (“write”) that is used to create a new file
Then fill the file with data (in this case created by t) using mfprintf(). Note the odd argument ‘ %6.3f\n' that defines the output size (explained below)
File handling: demo 1 File handling: demo 1
(3/5), script cont..(3/5), script cont..After that the file has to be closed
Then opened again to be read (‘r’ )
Next we read in its entirety (the -1 )
But the pointer must be returned to the top..
before we can define which data we want to see
Finish by closing the file (see below for note on mclose())
// Close exercise file://---------------------------mclose(fd);
// Open the exercise file for reading://------------------------------------------------fd = mopen('H:\Dr.EW\Writings\Scilab examples\file_exercise1.txt','r');
// Read and format file contents://--------------------------------------------contents = mfscanf(-1,fd,'%f') // -1 means entire file contents
// Return position pointer to file beginning://----------------------------------------------------------mseek(0,fd) // Following mfscanf(-1, , ) the pointer is at the end
// Read some data from the file://------------------------------------------five_data = mfscanf(fd,'%f %f %f %f %f') // First five datathree_data = mfscanf(fd, '%f %f %f') // Next three data[n,data_9,data_10,data_11] = mfscanf(fd,'%f %f %f')// Three specific..
// elements// Close the file://--------------------mclose(fd)
File handling: demo 1 File handling: demo 1
(4/5), the .txt file(4/5), the .txt file
Scilab has put the text file where it was told to, on the H: drive. Check with Notepad
The defined read variable contentsbrings up the contents of the text file on the Console
We can then pick out specific elements from the list
The variables five_data , three_data , and data_11 were defined in the script
n is the # of elements (-1) in the vector it belongs to (4-1)
We can also address specific elements in the column vector and get the answer as a row vector
Spreadsheet data (1/7): Spreadsheet data (1/7):
Creating dataCreating data Scilab does not interface directly Scilab does not interface directly
with spreadsheet programs. The with spreadsheet programs. The data has to be saved as a text data has to be saved as a text filefile
I started with the new kid on I started with the new kid on the block, the block, LibreOfficeLibreOffice CalcCalc. . The data is the output from an indoor/outdoor temperature measurement
The process of saving The process of saving LibOLibO and and OOoOOo data as a .data as a .csvcsv text file is text file is explained laterexplained later
If you do it in Excel you just If you do it in Excel you just save it as save it as Text (Tab Text (Tab delimited)delimited). Do not select . Do not select Unicode Text because Scilab cannot read it
Spreadsheet data (2/7):Spreadsheet data (2/7):
Data saved as .Data saved as .csvcsv filefile And here is the And here is the LibOLibO data saved as data saved as
file_spreadsheet_demo5.csvfile_spreadsheet_demo5.csv and and seen in WordPad (the figure 5 reflects seen in WordPad (the figure 5 reflects the fact that it is my fifth attempt to the fact that it is my fifth attempt to get it right)get it right)
LetLet’’s see if Scilab can read the .s see if Scilab can read the .csvcsvfile. There are two command options:file. There are two command options:–– M = M = fscanfMatfscanfMat()() for a matrix of real for a matrix of real
numbers (text data is ignored)numbers (text data is ignored)–– [[M,textM,text] = ] = fscanfMatfscanfMat()() for a string for a string
matrixmatrix
The output for both alternatives are The output for both alternatives are shown on the next slideshown on the next slide
After that we can write a script to plot After that we can write a script to plot the datathe data
Note: If you work with MS Excel you use of course the ending .txt instead of .csv(CSV stands for Comma Separated Variable)
Spreadsheet data (4/7):Spreadsheet data (4/7):
script for plotting (1/2)script for plotting (1/2)
// spreadsheet_data_plot.sce
// The script reads data from the test file /// file_spreadsheet_demo5.csv, determines its /// length,and plots its two measurement sets /
clear,clc,clf;
// Open the file, determine number of rows,// and form vectors of its columns://-----------------------------------------data_file = fscanfMat(IH:\file_spreadsheet_demo5.csv');
// Opens text filerows = size(data_file,'r'); // Determine number of rowsreadings = data_file(:,1); // Column 1, reading # (redundant)outdoor = data_file(:,2); // Column 2, outdoor temperatureindoor = data_file(:,3); // Column 3, indoor temperature
The fscanfMat()command cannot be split on two rows (even if it is not needed in this case)
The size(name,’r’)function is used to determine the number of matrix rows
Matrix columns form separate vectors
Spreadsheet data (5/7):Spreadsheet data (5/7):
script for plotting (2/2)script for plotting (2/2)
The plot command uses the obsolete plot2d() syntax that we have seen before. The reason for having it here is that plot2d() with the frameflag argument of the new syntax does not work when two graphs should be fused into one plot: The second plot destroys the first one, and when the rect argument is included Scilab responds with an error message (know it, tried it)
Spreadsheet data (6/7):Spreadsheet data (6/7):
plotplot
Simple plot, but the main point with this exercise is to show how to go from spreadsheet data to a text file and then to plot the data
And then we turn to the question of how to create text files with LibreOffice Calc and OpenOffice.orgCalc (next slide)
Spreadsheet data (7/7): Spreadsheet data (7/7):
Text data in Text data in LibOLibO & & OOoOOo
The saved .csv file looks messy if you open it with Excel, but it is ok in Notepad and WordPad
Save as Text CSV (.csv) and select Tab in the Field delimiter dropdown menu of the window that opens. That’s it
mopenmopen()()
The The mopenmopen()() function is of course more intricate than what one can function is of course more intricate than what one can understand from the discussion above. Forgetting binary and textunderstand from the discussion above. Forgetting binary and textfiles, the general structure of files, the general structure of mopenmopen()() is:is:
wherewhere–– file_namefile_name is the entire path of the file, including its nameis the entire path of the file, including its name–– modemode defines what to do with the data, e.g.:defines what to do with the data, e.g.:
rr, read an existing file, read an existing file ww, create a new file & write into it, alt. overwrite data in exis, create a new file & write into it, alt. overwrite data in existing fileting file aa, append, open a file and add data to the end, append, open a file and add data to the end
–– fdfd, file descriptor, temporary name of the file, file descriptor, temporary name of the file–– errerr, error parameter. , error parameter. err = 0err = 0 if the file is successfully opened, if the file is successfully opened, err <> 0err <> 0
if file opening failed (if file opening failed (merrormerror()() is a function related to the is a function related to the errerr argument)argument)
It can be a good idea to It can be a good idea to check the check the errerr parameterparameter after a file has after a file has been opened (has not been done in Demo 1)been opened (has not been done in Demo 1)
mclosemclose()()
A file that has been opened with A file that has been opened with mopenmopen()() should be closed with the should be closed with the mclose(fdmclose(fd)) command even if it is automatically closed when Scilab command even if it is automatically closed when Scilab closes. However, pay attention to the following ambiguous statemcloses. However, pay attention to the following ambiguous statement ent in Scilabin Scilab’’s s Help BrowserHelp Browser::
“mclose must be used to close a file opened by mopen. If fd is omitted mclose closes the last opened file.
Be careful with the use of [mclose(‘all’)] ... because when it is used inside a Scilab script file, it also closes the script and Scilab will not execute commands written after mclose(’all’).”
mfprintfmfprintf(), (), fprintfMatfprintfMat()()
The The mfprintfmfprintf()() command is used to convert, format ,and write data command is used to convert, format ,and write data in an opened text filein an opened text file
The general structure of The general structure of mfprintfmfprintf()() is:is:
Which means that each value that we want to print is declared wiWhich means that each value that we want to print is declared with th an optional an optional texttext, the , the formatformat to be printed in (both within a single pair to be printed in (both within a single pair of quotation marks), and the of quotation marks), and the valuevalue to be printedto be printed
Format declarations are given on the next slideFormat declarations are given on the next slide The format demo two slides down should give a better grasp of whThe format demo two slides down should give a better grasp of what at
it all means. If you ask me, it looks really messy...it all means. If you ask me, it looks really messy... The The fprintfMatfprintfMat()() command is used to write a matrix in a file. See command is used to write a matrix in a file. See
HelpHelp for detailsfor details
Format definitionsFormat definitions
Recall the arguments Recall the arguments ‘‘%6.3f%6.3f\\nn’’ and %f in and %f in File handling Demo File handling Demo 1. 1. They are part of a set of format definitions:They are part of a set of format definitions:–– %d%d for integers (e.g. 1230)for integers (e.g. 1230)–– %f%f for floating point presentation (e.g. 12.30987)for floating point presentation (e.g. 12.30987)–– %e%e for exponentials (e.g. 1.2345e+002)for exponentials (e.g. 1.2345e+002)–– %s%s for text (string) presentation (e.g. Hello World!)for text (string) presentation (e.g. Hello World!)–– %6.3f%6.3f to define the output sizeto define the output size
the 6 is for the total number of figuresthe 6 is for the total number of figures the 3 is for the number of figures after the decimal pointthe 3 is for the number of figures after the decimal point
–– \\nn ““go to a new linego to a new line””–– \\tt ““use a horizontal tabulatoruse a horizontal tabulator””
Some definition combinations, like %6.3fSome definition combinations, like %6.3f\\n, are possiblen, are possible
Format demo:Format demo:
script (1/2)script (1/2)
// file_format_demo.sce
// Demonstrates the use of mfprintf() format definitions. /// Pay attention that with several variable to be printed, /// all formats are declared (inside a single pair of citation /// marks) before the variables are defined. /
clear,clc;
// Create a new test file for writing://----------------------------------------fd = mopen('H:\Dr.EW\Writings\Scilab examples\file_format_demo.txt','w');
// Some variable to play with://---------------------------------A = 123.45678901;a = 0.3;b = 1.23e-02;c = a + %i*b;text = 'Hello World';
Just initial declarations here. The real stuff is on the next slide
This demo aims at clarifying the use of format declarations:This demo aims at clarifying the use of format declarations:
Format demo:Format demo:
script (2/2) & text filescript (2/2) & text file
// Several outputs to be demonstrated://--------------------------------------------mfprintf(fd,'%d\n %10d\n %20d\n %8.4f\t %8.4f\n %5.2f\t %5.2f\t %5.2f\n',...
// Close the opened file://--------------------------mclose(fd);
You have to be very careful to get it right...
Remember to close!
No optional text is used in any of the cases
mfscanfmfscanf(), (), fscanfMatfscanfMat()()
We used We used mfscanfmfscanf()() in Demo 1 to read (scan) data from a file. Two in Demo 1 to read (scan) data from a file. Two examples of its use:examples of its use:–– contents = mfscanf(contents = mfscanf(--1, 1, fdfd, , ‘‘%f%f’’)). With this argument it reads the whole . With this argument it reads the whole
contents of the file and formats itcontents of the file and formats it–– four_valuesfour_values = = mscanf(fdmscanf(fd, , ‘‘%f %f %f %f %f%f %f%f’’)). Reads the four first data in . Reads the four first data in
the filethe file–– After reading data, the stack pointer remains where it is and weAfter reading data, the stack pointer remains where it is and we must use must use
the the mseek(n,fmseek(n,f)) command to shift it to a new location. The first row in command to shift it to a new location. The first row in the stack is numbered 0, as indicated by the stack is numbered 0, as indicated by mseek(0,fd)mseek(0,fd) in Demo 1in Demo 1
In the discussion of spreadsheet data we used the In the discussion of spreadsheet data we used the fscanfMatfscanfMat()()function to read the data contained in a .function to read the data contained in a .csvcsv file. The function has file. The function has two alternative call sequences:two alternative call sequences:–– fscanMat(filepathfscanMat(filepath,<,<opt_argopt_arg>)>) to read the numeric part only of scalar to read the numeric part only of scalar
matrix data in a text filematrix data in a text file–– [[M,textM,text] = ] = fscanfMat(filepathfscanfMat(filepath,<,<opt_argopt_arg>)>) to read the data and include to read the data and include
the first nonthe first non--numeric linesnumeric lines–– The default optional argument is The default optional argument is %1g%1g. Check with Help for other options . Check with Help for other options
Dr.EWJohnny Heikell
Dr.EWJohnny Heikell
17. Animation17. Animation
A brief introduction to creating A brief introduction to creating dynamic graphics dynamic graphics
Return to Contents
IntroductionIntroduction
Animations are a sequence of plots on the Graphics Window; executed by showing a plot, freezing it while an incremental shift is being calculated, and then swapping the old plot for the new one.* With correct speed and increments it gives the illusion of continuous movement
There are two main modes for creating animations:– Real time mode. The animation runs while the script is being executed,
with the speed being determined by the incremental shifts and computer speed. The execution can be influenced (slowed down) by the realtimeinit() and realtime() functions
– Playback mode. Possible in Matlab with the getframe and moviecommands, but Scilab lacks this alternative
A tool for producing animations is the pixmap handle command and the show_pixmap() function. Example 6-2, however, does not use the pixmap command
*) Unless one wants to retain the whole sequence, as in Example 6-2.
This demo is adapted from Antonelli & Chiaverini. It exhibits in particular the pixmap and show_pixmap() pair of commands
pixmap=“on”/“off”– The pixmap mode* is used to achieve a smooth animation. With the
handle command pixmap=“on” the display is refreshed only when called on by the command show_pixmap()
– Compare this case with the drawlater() - drawnow() pair in ordinary plotting
The script uses the xfarcs() function to fill the moving pie. Related Scilab functions are xfarc(), xarcs(), and xarc()
xfarcs() is used instead of xfarc() because the latter has no provision for defining plot color by arguments, and its Axes handle gca() does not recognize any children that would allow colors to be defined
*) Also called “double buffer mode” because the picture is first created in one buffer before being pushed to the second (the Graphics Window).
// animation_ball.sce
// Creates a cut pie that makes 5 loops while /// moving around a circle. Demonstrates the use of /// the pixmap - show_pixmap() pair of commands, /// and the use of xfarcs() in drawing /
clear,clc;
steps = 250; // # of animation stepsr1 = 0.5; // Pie sizer2 = 0.5; // Loop sizef = gcf(); // Figure handlef.pixmap = "on"; // Create before displayfor i=1:steps
clf(); // Erase pie after each stepplot2d (%nan,%nan,frameflag=3,.. // Define figure
pie, scriptpie, script Missing x and y values are Missing x and y values are
substituted by (%substituted by (%nannan))
Only Only frameflagframeflag=3 works in =3 works in this casethis case
Note the imaginary values Note the imaginary values of theta1 & theta2. Their of theta1 & theta2. Their relative values (2relative values (2ππ & 10& 10ππ) ) determine the five loops determine the five loops that the pie makes before that the pie makes before finishing the full circlefinishing the full circle
xfarcsxfarcs()() requires six requires six vector values as its vector values as its argument. The color code argument. The color code is optional (the default is optional (the default color is black)color is black)
Demo 1 (3/4): moving Demo 1 (3/4): moving
pie, frozen plotpie, frozen plot
Here is the blue pie in its combined start and finish position
The completion of the full circle in 250 steps takes about 10 seconds with my 1.6 GHz dual-core processor
Demo 1 (4/4): discussionDemo 1 (4/4): discussion
Odd things happened while I tried to get this one goingOdd things happened while I tried to get this one going The Graphics Window mostly opened as shown above, but I have The Graphics Window mostly opened as shown above, but I have
also seen a black ball (that was before I changed it to a pie) oalso seen a black ball (that was before I changed it to a pie) on a n a red background surrounded by a yellow frame topped by a red red background surrounded by a yellow frame topped by a red titletitle——with the animation running just as smoothly as it shouldwith the animation running just as smoothly as it should
When I changed When I changed frameflagframeflag=3=3 to to frameflagframeflag=2=2 the dot rotated the dot rotated around to the lower leftaround to the lower left--hand corner, and when I changed back hand corner, and when I changed back again Scilab told that the handle is not valid any more. Just goagain Scilab told that the handle is not valid any more. Just go on on and reload...and reload...
I also saw the size of the Graphics Window change from executionI also saw the size of the Graphics Window change from executionto execution for no obvious reasonto execution for no obvious reason
In short, these events give the feeling that animationIn short, these events give the feeling that animation——together together with GUIswith GUIs——is is not a top priority of the Scilab teamnot a top priority of the Scilab team
// animation_rectangles.sce
// Two rectangles slide diagonally over the Graphics /// Window. As they slide over each other their colors /// are NORed. The solution is only partly successful /
clear,clc,clf();
f=gcf(); f.pixmap='on'; // Double buffer modef.pixel_drawing_mode='nor'; // NOR modef.background=color("lightblue");
ax=gca(); ax.data_bounds=[0,-4;14,10]; // Plot limitsax.margins=[.1 .1 .1 .1]; // Plot framedax.background=color("lightgrey"); max_pos = 10; // Max position of rectangles
k=%nan; // Auxiliary parameterxfrect(k,k,4,4); // First black rectanglee1 = gce(); xfrect(max_pos-k,max_pos-k,4,4); // Second rectanglee2=gce();
for k=linspace(1,10,200) // Animation loope1.data(1:2)=k; e2.data(1:2)=max_pos-k; show_pixmap() //Show double buffer
end
Demo 2 (1/2): moving Demo 2 (1/2): moving
rectanglesrectangles
This demo is adapted from This demo is adapted from ChancelierChancelier et al.et al.
ItIt’’s s an attemptan attempt to to demonstrate the use of the demonstrate the use of the XOR command in XOR command in f.pixel_drawing_modef.pixel_drawing_mode= = ‘‘xorxor’’, here NOR instead of , here NOR instead of XOR for reasons told belowXOR for reasons told below
The rectangles move on top The rectangles move on top of a grey backgroundof a grey background
The rectangles are drawn The rectangles are drawn with with xfrectxfrect()() without color without color code, they are therefore code, they are therefore blackblack
The rectangles move The rectangles move diagonally from corner to diagonally from corner to corner in 200 stepscorner in 200 steps
Here is the animation in progress. The NOR function does its job, but otherwise something is quite wrong: We do not have black rectangles moving across a light grey background
The problem is that the command f.pixel_drawing_mode=‘nor’operates on the whole screen, not just on the moving rectangles as intended by Chancelier et al. For that reason the XOR operation they use is even worse than NOR
I decided to leave the demo in this state. Those who are interested can find a better solution in Steer’s Scilab Graphics, p. 28
Demo 3 (1/3): a 3D Demo 3 (1/3): a 3D
object, script (1/2)object, script (1/2)
Now weNow we’’ll look at a ll look at a geometrically more geometrically more challenging object, a 3D challenging object, a 3D plot that moves both in plot that moves both in azimuth and elevationazimuth and elevation
Data bounds are not Data bounds are not defined separately, they are defined separately, they are changing with surface mesh changing with surface mesh resolutionresolution
The first plot command The first plot command only defines axes labelsonly defines axes labels
// rotating_surface.sce
// The 3D surface is first rotated and then /// tilted, after which its position is locked /
The surface rotates around The surface rotates around the z axis, starting at 45the z axis, starting at 45ººand finishing at 100and finishing at 100ºº, while , while the tilt angle is constant at the tilt angle is constant at 4545ºº
When finished rotating, the When finished rotating, the surface tilts around the x surface tilts around the x axis from 45axis from 45ºº up to 80up to 80ºº, , with the rotation angle with the rotation angle constant at 100constant at 100ºº
With my 1.6 GHz laptop the With my 1.6 GHz laptop the animation does not run animation does not run perfectly smoothly, the perfectly smoothly, the jumps from step to step are jumps from step to step are noticeablenoticeable
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at javax.swing.plaf.basic.BasicTextUI$RootView.paint(Unknown Source)
…..
Demo 3 (3/3): a 3D Demo 3 (3/3): a 3D
object, plotobject, plot
The surface has reached its destination: rotated to 100º (azimuth) and tilted to 80º (elevation)
While testing various parameters I saw this message on the Console (long list). It disappeared when I re-run the script
Dr.EWJohnny Heikell
Dr.EWJohnny Heikell
18. Miscellaneous18. Miscellaneous
A hotchpotch of philosophy and A hotchpotch of philosophy and realism that hopefully is of userealism that hopefully is of use
Return to Contents
The problemThe problem--solving solving
processprocess
1.1. Define the problem (answer the question Define the problem (answer the question ““WhatWhat’’s the problem?s the problem?””))2.2. Outline a way of solving the problem (block diagram, DFD, etc.)Outline a way of solving the problem (block diagram, DFD, etc.)3.3. Define equations and/or algorithms (solve the math problem)Define equations and/or algorithms (solve the math problem)4.4. Transform steps 2 & 3 to a software outline or architectureTransform steps 2 & 3 to a software outline or architecture5.5. Do the coding in steps and test each step before proceedingDo the coding in steps and test each step before proceeding6.6. Validate the solution (does it do what it should do, with all inValidate the solution (does it do what it should do, with all input put
values (especially 0 & values (especially 0 & ∞∞), and nothing more than it should do?)), and nothing more than it should do?)
The problem-solving process for a computational problem typically goes through the following steps (not a textbook definition):
The boundaries between these steps can be blurred, iterations are mostly needed, and one or two of the steps may be more importantthan the others. Each step also requires a number of subtasks to be performed. But in general it helps to have this approach in mind when attacking a problem.
Good program structuresGood program structures
Keep in mind that a program is characterized by a) its structureKeep in mind that a program is characterized by a) its structure and and b) by what it doesb) by what it does
Give variables clear and meaningful names; use single letters onGive variables clear and meaningful names; use single letters only ly for x, y and z axes, loop counters (for x, y and z axes, loop counters (j,kj,k), and the like), and the like
Split the code into logical entities with the help of subroutineSplit the code into logical entities with the help of subroutiness Separate structural entities by empty rows and headline commentsSeparate structural entities by empty rows and headline comments Indent rows (loops, print commands, etc) for increased clarityIndent rows (loops, print commands, etc) for increased clarity Be liberal with the use of comments, keep space between the Be liberal with the use of comments, keep space between the
command and its row commentcommand and its row comment Simple is beautifulSimple is beautiful; a good program is short and unambiguous; a good program is short and unambiguous For a more thorough discussion, see textbooks on software For a more thorough discussion, see textbooks on software
engineeringengineering
"Always program as if the person who will be maintaining your program is a violent psychopath that knows where you live.”
Martin Golding
Programming pitfalls Programming pitfalls
(1/4)(1/4) Computer programs cannot be tested to guarantee 100% reliabilityComputer programs cannot be tested to guarantee 100% reliability. .
There is the danger of both hidden andThere is the danger of both hidden and——in retrospectin retrospect——obvious obvious bugs.* Avoiding common programming pitfalls should be a bugs.* Avoiding common programming pitfalls should be a minimum goal and requires that we are familiar with themminimum goal and requires that we are familiar with them
Basic Scilab tutorials do not pay much attention to programming Basic Scilab tutorials do not pay much attention to programming pitfalls. pitfalls. ““EineEine EinfEinfüührunghrung in Scilabin Scilab”” by Bruno by Bruno PinPinççonon (original in (original in French, for me German is far easier) is an exception. Its last cFrench, for me German is far easier) is an exception. Its last chapter hapter briefly discusses programming pitfalls. briefly discusses programming pitfalls. Worth taking a look atWorth taking a look at
A search on the web for A search on the web for ““MatlabMatlab pitfallspitfalls”” provides some hints. There provides some hints. There is also a useful discussion in Chapter 9 of Hahn, Valentine: is also a useful discussion in Chapter 9 of Hahn, Valentine: Essential Essential MatlabMatlab for Engineers and Scientistsfor Engineers and Scientists, 3rd ed., Butterworth, 3rd ed., Butterworth--HeineHeine--mannmann, 2007, 2007
*) The term “bug,” according to anecdote, was coined in 1947 when Grace Hopper (“Grandma Cobol”) of the US Navy identified a computer problem being caused by a moth in a relay (/tube/connector, the story varies). The original “bug” was thus a hardware related problem and lethal to the bug.
Programming pitfalls Programming pitfalls
(2/4): error types(2/4): error types Programming errors can broadly be grouped into the following typProgramming errors can broadly be grouped into the following typeses
–– Logical errors, meaning errors in the algorithm used to solve a Logical errors, meaning errors in the algorithm used to solve a problem problem –– Syntax errors, meaning mistakes in the construction of Scilab stSyntax errors, meaning mistakes in the construction of Scilab statementsatements–– Rounding errors, meaning errors due to limited computer accuracyRounding errors, meaning errors due to limited computer accuracy
Logical errorsLogical errors are mostly the result of our limited understanding of are mostly the result of our limited understanding of the problem at hand and/or our limited knowledge of algorithms ithe problem at hand and/or our limited knowledge of algorithms in n general and Scilab in particulargeneral and Scilab in particular
Syntax errorsSyntax errors are generally speaking due to human limitations: are generally speaking due to human limitations: oversight, carelessness, forgetfulness, and the like. Typical caoversight, carelessness, forgetfulness, and the like. Typical cases are ses are misspelling, mismatched quote marks, wrong type of arguments, etmisspelling, mismatched quote marks, wrong type of arguments, etc.c.
Rounding errorsRounding errors arise from truncations due to hardware limitations, arise from truncations due to hardware limitations, digitization of mathematical functions, converting between decimdigitization of mathematical functions, converting between decimal al and binary mathematics, etc.and binary mathematics, etc.
There is also a There is also a fourth typefourth type, namely errors made by Scilab system , namely errors made by Scilab system designers and programmers. They show up as bugs, performance designers and programmers. They show up as bugs, performance limitations, poor user interfaces, and the like limitations, poor user interfaces, and the like
This message is misleading if what you intend is []’ * [], but ok if you aim at elementwise multiplication [] .* [] (but “Wrong multiplication” is better still)
-->sqrt = 5^2 + 3*17 Warning : redefining function: sqrt . Use funcprot(0) to avoid this message
sqrt = 76.
Here you can see that the warning “redefining function”does have a meaning. I have improperly used sqrt as a variable name, but Scilab recognizes it is a built-in function. The answer is correct, but one should rather change the variable name. Check help name if you are uncertain if an intended variable name is reserved
Programming pitfalls Programming pitfalls
(4/4): the endless loop(4/4): the endless loop
I have several times mentioned the risk of creating an endless loop, so let’s look at this little beast
When you execute the script you have to crash the program to stop it. The easiest way is to press the Close button on the Console and then reload Scilab
Why does the loop not end? Because we die from old age before the variable n by chance gets exactly the value 0.5
// endless_loop.sce
// Demonstrates an endless loop. /// Execution ends only by crashing /// the program (click on the Close /// button (X) on the Console) /
n = .1; dt = getdate(); rand('seed',1000*dt(9) + dt(10)); while n ~=0.5;
n = rand(0,'normal'); end; disp(n)
Have you forgotten about seeding rand functions? If so, go back to Ex 1-3 (lotto draw)
Debugging (1/2)Debugging (1/2)
We are already familiar with ScilabWe are already familiar with Scilab’’s rudimentary embedded s rudimentary embedded debugger that provides error messages on the Console (a separatedebugger that provides error messages on the Console (a separatedebugger window may come with Scilab 6.0)debugger window may come with Scilab 6.0)
Another debugging tool is the Another debugging tool is the pausepause, , resumeresume, , abortabort set of set of statements. Read section 6.7 in statements. Read section 6.7 in Introduction to ScilabIntroduction to Scilab by by MichaMichaëëllBaudinBaudin for an explanationfor an explanation
My suggestion for painless programming is My suggestion for painless programming is stepwise developmentstepwise development, , meaning to meaning to –– Develop the script inside out, starting with the central equatioDevelop the script inside out, starting with the central equation (or n (or
similar similar ““kernelkernel””) and executing it using a simple plot or display command. ) and executing it using a simple plot or display command. Correct the Correct the ““kernelkernel”” until it works to satisfactionuntil it works to satisfaction
–– Extend the script stepwise by adding subroutines, loops, plot coExtend the script stepwise by adding subroutines, loops, plot commands, mmands, handle commands, etc. and test (execute) after each added stephandle commands, etc. and test (execute) after each added step
–– The advantage with stepwise development is that, first, bugs areThe advantage with stepwise development is that, first, bugs are isolated isolated to a specific part of the script and easy to identify and ,seconto a specific part of the script and easy to identify and ,second, one gets d, one gets a feeling of satisfaction from each added buga feeling of satisfaction from each added bug--free step free step
Debugging (2/2): Debugging (2/2):
validationvalidation
Finally, even when a script seems to behave correctly we must Finally, even when a script seems to behave correctly we must validate it. validate it. DonDon’’t judge a bird by the colors of his featherst judge a bird by the colors of his feathers
To validate you can (among other things):To validate you can (among other things):–– Take a critical look at the solution: is it logically Take a critical look at the solution: is it logically soundsound, do you really , do you really
know what the program know what the program doesdoes——and what it and what it does not does not do?do?–– Check for and eliminate redundancies (I have found surprisingly Check for and eliminate redundancies (I have found surprisingly many in many in
the textbook examples that I have borrowed)the textbook examples that I have borrowed)–– Run it for some special cases for which you know the answer. If Run it for some special cases for which you know the answer. If no no
model cases are available, check at least that the answers it prmodel cases are available, check at least that the answers it provides are ovides are plausible and magnitudes are correctplausible and magnitudes are correct
–– Test for Test for ““unusual eventsunusual events”” (e.g. where you could end up dividing by zero), (e.g. where you could end up dividing by zero), extreme values (e.g. infinite), conditions leading to loop lockuextreme values (e.g. infinite), conditions leading to loop lockup, p, overlooked rounding errors, stack overruns, etc.overlooked rounding errors, stack overruns, etc.
–– Work through the program by hand to see if you can spot where thWork through the program by hand to see if you can spot where things ings could start going wrongcould start going wrong
–– Ask somebody cleverer than yourself for a second opinionAsk somebody cleverer than yourself for a second opinion
Speeding up Scilab (1/4): Speeding up Scilab (1/4):
introductionintroduction
There are ways to speed up the execution of Scilab programs. There are ways to speed up the execution of Scilab programs. The three major rules are:The three major rules are:–– Replace loops by Replace loops by vectorizedvectorized operationsoperations.* Particularly with the .* Particularly with the forfor loop loop
one should aim at its one should aim at its vectorizedvectorized alternativealternative–– Use subroutines whenever possibleUse subroutines whenever possible–– Avoid time consuming algorithmsAvoid time consuming algorithms like like RungeRunge--KuttaKutta
SpeedSpeed--upup——particularly if we move from loops to particularly if we move from loops to vectorizedvectorizedfunctionsfunctions——requires that we adopt new thinking. Itrequires that we adopt new thinking. It’’s a new s a new learning effort. But vectors are, after all, what Scilab is all learning effort. But vectors are, after all, what Scilab is all about! about!
However, there is a problem with learning However, there is a problem with learning vectorizedvectorized operations: operations: Textbooks tell us to use them but pay little attention to the Textbooks tell us to use them but pay little attention to the subject and their few examples are very basicsubject and their few examples are very basic
*) Scilab does not support Matlab’svectorize() function.
Speeding up Scilab (2/4): Speeding up Scilab (2/4):
vectorvector--based functionsbased functions This case is adapted from This case is adapted from
BaudinBaudin. The task is to compute . The task is to compute the sum of odd integers [1,99]the sum of odd integers [1,99]
In the first case we use a nested In the first case we use a nested while...if...end...while...if...end...endend structure, structure, picking odd integers with the picking odd integers with the modulo()modulo() functionfunction
Below is the alternative Below is the alternative vectorizedvectorized solution. Clean and solution. Clean and simple! Advantages:simple! Advantages:
–– Higher level language, easier to Higher level language, easier to understandunderstand
–– Executes faster with large Executes faster with large matricesmatrices
// add_demo1.sce
clc; add = 0; i = 0; while ( i < 100 )
i = i + 1; if ( modulo( i, 2 ) == 0 ) then
continue; end add = add + i;
end disp( add )
2500.
// add_demo2.sce
clc;add = sum(1:2:100);disp(add)
2500.
There was a bug in Scilab 5.3.1 and it returned an “Invalid index” error message for the latter script
Speeding up Scilab (3/4): Speeding up Scilab (3/4):
execution time execution time tic()..toctic()..toc()() Execution time can be Execution time can be
measured with the measured with the tic()tic() and and toctoc()() pair of functionspair of functions
The top script computes The top script computes values for sin(x) and orders the values for sin(x) and orders the result in a table with two result in a table with two columns (shown to the far right columns (shown to the far right for only four points). The for only four points). The execution time 17.389 s is for execution time 17.389 s is for the shown script, with Scilab the shown script, with Scilab looping over 30,000 timeslooping over 30,000 times
The lower (The lower (vectorizedvectorized) script ) script performs the same task. The performs the same task. The execution time is 9 execution time is 9 msecmsec, about , about 2000 times faster than with the 2000 times faster than with the for...endfor...end loop!loop!
In this case the execution time is reduced by a factor of 34. Not nearly as much as in the earlier cases, but still a significant improvement (typical in practice)
Discrepancy in time Discrepancy in time
measurements (1/2)measurements (1/2)
-->tic(); -->s = 0; -->for n = 1:100000 -->s = s + n; -->end -->time = toc(); -->disp(time) 97.531
// scilab-matlab_loop.sce
clc; tic(); s = 0; for n = 1:100000
s = s + n; end time = toc(); disp(time)
0.453
I wanted to check Scilab’s computation time for a cased given in a textbook on Matlab by Hahn & Valentine. First I did it on the Console and then on the Editor, but the results did not match:
The result is 97.531 seconds on the Console. Clearly not true because the answer came up without delay
It is only 0.453 s when done on the Editor. That’s more like it
Let’s try with vectorizedfunctions (next slide)
Discrepancy in time Discrepancy in time
measurements (2/2)measurements (2/2)
And here is the same in vectorized form:
Now the Console tells of a threefold improvement in computation time, but still not true…
and the Editor agrees about the improvement, but the discrepancy remains
Conclusion: There is a bug either in my approach or in Scilab; but Scilab seems to execute faster than Matlab on the old Pentium II processor that Hahn & Valentine used
// scilab-matlab_vectorized.sce
clc; tic(); n = 1:100000; s = sum(n); time = toc(); disp(time)
new toolboxesnew toolboxes Recall the Recall the problems with ATOMSproblems with ATOMS that I mention in that I mention in Chapter 1Chapter 1 ATOMS (ATOMS (AutomaTicAutomaTic mOdulemOdule Management for Scilab) Management for Scilab) allows the user allows the user
to download and install external toolboxes (modules)to download and install external toolboxes (modules) There is reason to take a look at which modules might be of use,There is reason to take a look at which modules might be of use,
since specialized tools can limit the time needed to solve a prosince specialized tools can limit the time needed to solve a problemblem Start by hooking up the computer on the Internet and clicking onStart by hooking up the computer on the Internet and clicking on the the
ATOMS icon on the Console. If you are unlucky you will see the ATOMS icon on the Console. If you are unlucky you will see the following message on the Console (I was unlucky and others have following message on the Console (I was unlucky and others have been as well): been as well):
The bug (Scilab The bug (Scilab bugbug #8942) remains unsolved and its true influence #8942) remains unsolved and its true influence is unknown to me. The Scilab team gives the unhelpful suggestionis unknown to me. The Scilab team gives the unhelpful suggestion to to download the mentioned filedownload the mentioned file
atomsDownload: The following file hasn't been downloaded:- URL : 'http://atoms.scilab.org/5.3/TOOLBOXES/32/windows.gz‘- Local location : 'C:\Users\Johnny\AppData\Local\Temp\SCI_TMP_2772_\.atoms\1_TOOLBOXES.gz‘
ATOMS (2/6): whatATOMS (2/6): what’’s s
availableavailable
This is the ATOMS main window. Texts overlap a bit, but basically it is a list of contents
Go ahead and try to find something of interest, even if there isn’t much for us engineers
Another problem is that there is little information about what the modules really can do for us
ATOMS (3/6): installATOMS (3/6): install
I decided to try StéphanieMottelett’s”Plotting library”(this version gives problems with a Vista PC!)
Click on Install
An installation message opens at the bottom, and after a good while Scilab tells that the module has been installed
ATOMS (4/6): new infoATOMS (4/6): new info
I also installed the GUI Builder by TAN Chin Luh
When Scilab is restarted it informs about the installed toolboxes
Question: What is needed to make use of the installed modules?
Check with the Help Browser and yes, at the very end of the list of contents are new additions: “Matlab-like plotting library” and “A Graphic User Interface Builder”
ATOMS (5/6): Check with ATOMS (5/6): Check with
MatlabMatlab’’ss quiver3()quiver3()
I tested Matlab’s quiver3() function with the script in Help, but something is wrong. The plot is wrong and Scilab yells about hold on, which it should know by now
// matlab_quiver3.sce
// Test Matlab's quiver3() function /
clear,clc,clf;
[X,Y]=meshgrid(-2:0.2:2,-1:0.2:1); Z=cos(X.*Y); surf(X,Y,Z); hold on
at line 10 of exec file called by : es\matlab_quiver3.sce', -1
ATOMS (6/6): discussion ATOMS (6/6): discussion
of problemsof problems My troubles began in earnest with the execution of My troubles began in earnest with the execution of MatlabMatlab’’ss
quiver3()quiver3() function. No matter what I did, all function. No matter what I did, all ScilabScilab scripts turned out scripts turned out garbage plotsgarbage plots
The situation was confused by simultaneous events: Apart from The situation was confused by simultaneous events: Apart from toolboxes I had also installed toolboxes I had also installed ScilabScilab 5.3.2, had some Windows 5.3.2, had some Windows updates arriving, and saw hiccups with both MS Word and Windows.updates arriving, and saw hiccups with both MS Word and Windows.There was no problem with There was no problem with ScilabScilab 5.1.15.1.1
Windows had been running for three years so I decided to reinstaWindows had been running for three years so I decided to reinstall ll it. Only after this process I suspected ATOMSit. Only after this process I suspected ATOMS
To cut the story short, the problems were due to the To cut the story short, the problems were due to the PlotlibPlotlib toolbox. toolbox. I uninstalled it and I uninstalled it and ScilabScilab 5.3.2 worked normally again5.3.2 worked normally again
Lessons learnedLessons learned: Install only one toolbox at a time and test it and : Install only one toolbox at a time and test it and ScilabScilab immediately. Uninstall the toolbox in case problems emergeimmediately. Uninstall the toolbox in case problems emerge
Building a script libraryBuilding a script library
Over time we accumulate a huge number of programs. How should Over time we accumulate a huge number of programs. How should we administer them, how can we later find what we need?we administer them, how can we later find what we need?
This presentation demonstrates alternative ways of This presentation demonstrates alternative ways of commenting commenting scriptsscripts——a most important subject when a program has to be a most important subject when a program has to be modified in the futuremodified in the future
Pay attention to program names. Descriptive names help to identiPay attention to program names. Descriptive names help to identify fy individual programs among other programs in a large file individual programs among other programs in a large file
Build your library of Scilab scripts in a logical manner. In thiBuild your library of Scilab scripts in a logical manner. In this work I s work I have partly saved scripts on a thumb stick drive, in the file have partly saved scripts on a thumb stick drive, in the file H:H:\\Dr.EWDr.EW\\WritingsWritings\\Scilab examplesScilab examples\\, under the assumption that this , under the assumption that this presentation points to where to find a particular script. This ipresentation points to where to find a particular script. This is not a s not a the way to do it continuously, so give your own the way to do it continuously, so give your own documentation documentation systemsystem a thoughta thought——including the backup solution!including the backup solution!
One option is to maintain a One option is to maintain a spreadsheet cataloguespreadsheet catalogue of programs with of programs with information on what a specific script does, where it is located,information on what a specific script does, where it is located, which which functions it contains, etc. An advanced solution is documentatiofunctions it contains, etc. An advanced solution is documentation n software of the type used in requirements managementsoftware of the type used in requirements management
Dr.EWJohnny Heikell
Dr.EWJohnny Heikell
19. Examples, Set 619. Examples, Set 6
Additional examples, mostly Additional examples, mostly related to Chapters 15related to Chapters 15--1919
Return to Contents
Example 6Example 6--1: user 1: user
defined GUI, introductiondefined GUI, introduction
This example is a modification of This example is a modification of the similar in the similar in AntonelliAntonelli, , ChiaveriniChiaverini: : IntroduzioneIntroduzione a Scilab 5.3a Scilab 5.3, pp. 74, pp. 74--8080
The task is to create a GUI in the The task is to create a GUI in the Graphics Window (GW). The GUI Graphics Window (GW). The GUI consists ofconsists of–– A sine plotA sine plot–– A slider for changing the angular A slider for changing the angular
frequency of the plotfrequency of the plot–– Two Two ““radiobuttonsradiobuttons”” by which the by which the
properties of the plotted graph can properties of the plotted graph can be changedbe changed
–– An exit button that closes the GUIAn exit button that closes the GUI
The process is shown as a flow The process is shown as a flow diagram to the right diagram to the right
START
END
Create initial GUI
Any changes?
Implement changes
EXIT pressed?
Close GUI
No
Yes
No
Yes
// GUI_italian.sce
// Generates on the Graphics Window (GW) a GUI that contains a /// sine plot (plot2d), a slider by which to adjust the angular /// frequency of the sine function, two radiobuttons that change /// the style and color of the sine graph, and a pushbutton that / // closes the GW /
clear,clc;
// **** SUBROUTINES **** //
// Declaration of initial plot in GUI://------------------------------ ---------------function initial_GUI()
t = linspace(0,7,200); w = 5; // Initial angular frequencyplot2d(t,sin(w.*t),.. // Initial plot w=5 rad/s
rect = [0,-1.1,7,1.1]); a = gca(); a.axes_bounds = [0.2,0,.8,1]; // Frame dimensions & locationxtitle("GUI DEMO WITH sin (wt)",...
Ex 6Ex 6--1: user defined GUI, 1: user defined GUI,
script (1/6)script (1/6)
The first subroutine, initial_GUI(), creates the initial sine plot within the Graphics Window; including title and axes labels
The initial angular frequency ω is defined as 5 Hz
There is really nothing special here
Go to the MAIN program below if you want to proceed in a logical order
// Functions for changes wrt user actions://-------------------------------------------------------function update_slider() // IF slider movement
new_GUI_data(); // GOTO new_GUI_data()endfunction
function update_radio() // IF radiobutton clicknew_GUI_data(); // GOTO new_GUI_data()
endfunction
// Redefine plot in GUI://------------------------------function new_GUI_data() t = linspace(0,7,200) drawlater(); // Delay changes
a = gca(); if (a.children~=[]) then // IF frame contains graph...
delete(a.children); // then delete graphend w = h_slider.value/10; // Slider range: 10 stepsplot2d(t,sin(w.*t)); if (h_radio1.value == 0) then // Check status of style button
a.children.children.polyline_style=1; // Basic style: lineelsea.children.children.polyline_style=3; // IF clicked: bars
endif h_radio2.value==0 then // Check status of color button
a.children.children.foreground=1; // Basic color: blackelsea.children.children.foreground=2; // IF clicked: blue
end drawnow(); endfunction
Ex 6Ex 6--1: 1: ……
script/script/……The next two subroutines respond to user commands (slider and radiobuttonsrespectively), and point to the fourt subroutine, new_GUI_data()
An existing plot is erased
The slider goes from end to end in 10 steps
The if-then-else-endconstructs register the status of whichever radiobutton has been clicked
Ex 6Ex 6--1: user defined GUI, 1: user defined GUI,
"style","text",... // Declare text"horizontalalignment","center",... // Position in reserved field"string",slidelbl,... // Add slider label"fontsize",14,... "backgroundColor",[1 1 1],... // White background"position",[10 size_y-310 180 20]); // Field size & location
Here is the Here is the uicontroluicontrol()()command that controls command that controls the sliderthe slider
strcatstrcat()() is a function is a function that we have not met that we have not met before. Note that w and before. Note that w and rad/srad/s are surrounded by are surrounded by double asterisksdouble asterisks (' ' w ' (' ' w ' ' and ' ' ' and ' ' rad/srad/s ' ' ), not ' ' ), not by quotation marks by quotation marks (strings within a string)(strings within a string)
This is the initial label This is the initial label below the sliderbelow the slider
And the And the uicontroluicontrol()() that that takes care of label takes care of label changeschanges
Ex 6Ex 6--1: user defined GUI, 1: user defined GUI,
script (5/6)script (5/6)
// Add radiobutton for graph style://---------------------------------------------h_radio1 = uicontrol(h_graph,...
The second radiobutton controls the color of the plotted sine curve (black is the default, turns to blue when radiobutton is clicked)
This is mostly a repetition of the commands for the first radiobutton, but the position in the GW is different
Ex 6Ex 6--1: user defined GUI, 1: user defined GUI,
and here it isand here it is
w clicked down to 2 rad/s
Both radiobuttonshave been clicked
Click on EXIT and the window closes
Problem: Scilab experiences a lockup if you drag the slider. The plot freezes and the Consol reports that the current handle no longer exists
Ex 6Ex 6--1: discussion1: discussion
I copyI copy--pasted the script from pasted the script from AntonelliAntonelli & & ChiaveriniChiaverini into Scilabinto Scilab’’s s EditorEditor
The script had to be cleaned up and some redundancies could be The script had to be cleaned up and some redundancies could be removedremoved
I added the second I added the second radiobuttonradiobutton and organized the script in what I and organized the script in what I thought was a more logical fashionthought was a more logical fashion
When I executed the script it opened up as expected, but the sliWhen I executed the script it opened up as expected, but the slider der was missingwas missing
After a frustrating weekend I did the whole thing from the beginAfter a frustrating weekend I did the whole thing from the beginning, ning, but now in steps. The error was that I had moved the but now in steps. The error was that I had moved the ifif--thenthen--endendconstruct in construct in function function new_GUI_datanew_GUI_data()() after the after the plot2d()plot2d() commandcommand
Lessons learnedLessons learned: Do the job stepwise and test as you progress: Do the job stepwise and test as you progress As for the lockup, my guess is that Scilab runs into a conflict As for the lockup, my guess is that Scilab runs into a conflict
situation when it should update the handle and the previous updasituation when it should update the handle and the previous update te still is in progressstill is in progress
Example 6Example 6--2: animation of a 2: animation of a
waltzing polygon (1/4)waltzing polygon (1/4)
This demo is based on This demo is based on PinPinççonon’’ss ““EineEineEinfEinfüührunghrung in Scilabin Scilab””
The original contained The original contained errors, obsolete errors, obsolete functions, and redundant functions, and redundant commands. For instance, commands. For instance, I transformed I transformed xsetxset()()functions to handle functions to handle graphics commands (as graphics commands (as explained in Chapter 7)explained in Chapter 7)
// animation_pincon_m2.sce
//------------------------------------------------------------------------------/// The script plots the track of a blue polygon (rectangle) /// with red border, as it turns around its axis while racing /// counterclockwise in a circular loop on a black background. /// The rectangle can be chaged to a trapetzoid or other shape /// by changing element values in the matrix polygon. Changing /// theta arguments in the matrix align gives different effects ///------------------------------------------------------------------------------/
clear,clc,clf;
// Basic parameters://----------------------steps = 100; // Steps per circular loopblength = 0.6; // Basic length of polygonwidth = 0.3; // Basic width of polygonradius = 0.6; // Radius of circular looprevolutions = 1; // Number of loops to run
Ex 6Ex 6--2: animation of a 2: animation of a
waltzing polygon (2/4)waltzing polygon (2/4)
The matrix The matrix polygonpolygondefines length & width defines length & width of edges. Change them of edges. Change them to different values and to different values and the rectangle is the rectangle is modified to a different modified to a different polygonpolygon
Note the use of the Note the use of the %%infinf constant to fill constant to fill missing arguments in missing arguments in plot2d()plot2d()
h=h=gcagca()() declares h as declares h as a handlea handle
The handle is first used The handle is first used to set the background to set the background colorcolor
-width/2 -width/2 width/2 width/2]; // Defines corners of polygon
// Set scale for isometric plot://---------------------------------plot2d(%inf,%inf,frameflag=3, rect=[-1,-1,1,1], axesflag=0)h = gca();xtitle('Waltzing polygon')h.background = 1; // Set background to black
Ex 6Ex 6--2: animation of a 2: animation of a
waltzing polygon (3/4)waltzing polygon (3/4) The matrix The matrix alignalign turns turns
the polygon into a new the polygon into a new angle. Change theta angle. Change theta values to see some values to see some interesting effectsinteresting effects
Here the handle is used Here the handle is used to set the fill color of to set the fill color of the polygon; the the polygon; the process is executed by process is executed by xfpolyxfpoly()()
Next the handle defines Next the handle defines the border color; in this the border color; in this case the executing case the executing function is function is xpolyxpoly()()
// Plot rectangle as it waltzes its loop://-------------------------------------------turns = 3; // Number of turns per loopfor i=1:steps
h.foreground = 2; // Set fill color to redxfpoly(align(1,:)+x_axis(i), align(2,:)+y_axis(i))
// Fills polygon with defined colorh.foreground = 5; // Change to blue for borderh.thickness = 3; // Set border thickness to 3xpoly(align(1,:)+x_axis(i), align(2,:)+y_axis(i),'lines',1)
// Draws polygon border in defined colorend
Ex 6Ex 6--2: animation of a 2: animation of a
waltzing polygon (4/4)waltzing polygon (4/4)
In this screenshot the polygon (rectangle) has made just over three quarters of its counterclockwise loop. At the same time it has spun 2¼times around its axis, and has begun the last ¾ turn. There are 100 position samples on a full loop (steps = 100;) and it completes in a few seconds
// grayplot_demo.sce /
// Gray area map with level curves using /// grayplot()/Sgrayplot() & contour2d() to /// create illusion of a 3D space /
clear,clc,clf();
// Color map definitions & initial declarations://-------------------------------------------------------------f = gcf(); f.color_map = linspace(0,1,64)'*ones(1,3); n = 20; // Plot resolutionx = linspace(-3,3,n); // 3D plot limitsy = x;
// Plot function://--------------------Z = sin(x)'*cos(y); // Function to plotSgrayplot(x,y,Z) // Smoothed grayplot
grayplotgrayplot() & contour2d()() & contour2d() This example shows how a gray This example shows how a gray
color scale and contour lines can color scale and contour lines can be combined to create the be combined to create the illusion of a 3D space illusion of a 3D space
linspacelinspace()() is multiplied by a 1x3 is multiplied by a 1x3 vector since the color map (the vector since the color map (the ““third dimensionthird dimension””) must be a ) must be a mx3 matrix. The color map can mx3 matrix. The color map can be inverted with (be inverted with (11--linspace()linspace()) ) and a nonlinear amplitude and a nonlinear amplitude function can be added to stress function can be added to stress the effects the effects
The The SgrayplotSgrayplot()() function function smoothes the plot color smoothes the plot color compared with the basic compared with the basic grayplotgrayplot()() function function
Contour lines are addedContour lines are added
Ex 6Ex 6--3 (2/2): 3 (2/2): grayplotgrayplot() & () &
contour2d() contour2d()
sin(x)
cos(
y)
The influence of the sine and cosine functions are easy to see (note that the origin is in the center of the graph)
The contour lines become white if the color map is inversed
Steps begin to show in the gray scale if the color map definition is changed to linspace(0,1,32), where the argument 32 stands for halved color resolution
Change the plot function from Sgrayplot() to grayplot(), and you’ll see the meaning of the variable n=20
// create_sectors.sce
// Plots four colored sectors in predifined /// directions and with predifined widths /
clear,clc,clf;
// ---- SUBROUTINE ---- /// The plot2d() function defines the figure, /// xfarcs() adds colored sectors to the plot /
chart, scriptchart, script This script is based on a solution This script is based on a solution
by Pierre by Pierre LandoLando and shows a and shows a method for creating a sector method for creating a sector chart, with each sector having chart, with each sector having defined length (radius), direction, defined length (radius), direction, width, and colorwidth, and color
The solution can be seen as a The solution can be seen as a more general case of Scilabmore general case of Scilab’’s s pie()pie() function that we met in function that we met in Chapter 9 Chapter 9
The most important function in The most important function in this case is this case is xfarcsxfarcs()(), which we , which we already met in the first animation already met in the first animation demo (the demo (the arcsarcs vector is of vector is of course also important since it course also important since it governs the whole plot)governs the whole plot)
Ex 6Ex 6--4: sector chart, plot4: sector chart, plot
Here is the plot, nice and Here is the plot, nice and beautiful. We can beautiful. We can suppress the axes by suppress the axes by changing the changing the plot2d()plot2d()argument argument ‘‘031031’’ to to ‘‘030030’’
The overlapping yellow The overlapping yellow sector just happens to be sector just happens to be on top (last element in the on top (last element in the vector list). In practical vector list). In practical applications, when doing applications, when doing automatic plotting of automatic plotting of some process, we would some process, we would have to put more effort have to put more effort into getting the plot the into getting the plot the way we wantway we want
Example 6Example 6--5: Robot arm 5: Robot arm
(1/6), introduction(1/6), introduction
Recent web discussions on the Recent web discussions on the relative virtues of relative virtues of ScilabScilab, , MatlabMatlab, and , and Octave made me take a new look at Octave made me take a new look at manual conversion of manual conversion of MatlabMatlab scriptsscripts
This case with a twoThis case with a two--dimensional dimensional moving robot arm is from Chapman, moving robot arm is from Chapman, S.J.: S.J.: MatlabMatlab Programming for Programming for EngineersEngineers, 2nd ed., (publisher & , 2nd ed., (publisher & year unknown), pp. 202year unknown), pp. 202--206206
The case demonstrates practical The case demonstrates practical application of matrices. See application of matrices. See Chapman for a full discussionChapman for a full discussion
The original script can be found on The original script can be found on the next slides; the converted script the next slides; the converted script with added comments are on the with added comments are on the following two slidesfollowing two slides
Base motor
Elbow motorHand
x1
x2
L1
L2
Θ1
Θ2
Start
Finish
Ex 6Ex 6--5: Robot arm (2/6), 5: Robot arm (2/6),
MatlabMatlab scriptscript
% Robot arm motion script % % Initial values, angles in degrees tf = 2; theta10 = -19*pi/180; theta1tf = 43*pi/180; theta20 = 44*pi/180; theta2tf = 151*pi/180; % % Equations for a coefficients T = [ tf^5 tf^4 tf^3
5*tf^4 4*tf^3 3*tf^2 20*tf^3 12*tf^2 6*tf ];
c = [ theta1tf-theta10; 0; 0 ]; disp(’Coefficients for theta1 motion:’) a = T\c % % Equations for b coefficients d = [ theta2tf-theta20; 0; 0 ]; disp(’Coefficients for theta2 motion:’)
// Robot arm motion in two dimensions using a fifth-degree /// polynomial to control the motion. See Chapman, S.J.: /// "Matlab programming for Engineers," 2nd ed., for a /// detailed discussion. /
clear;clc,clf;
// Initial values, angles in degrees://---------------------------------------------tf = 2; // Finish timetheta10 = -19*%pi/180; // Theta 1 start positiontheta1tf = 43*%pi/180; // Theta 1 final positiontheta20 = 44*%pi/180; // Theta 2 start positiontheta2tf = 151*%pi/180; // Theta 2 final position
// Equations for a coefficients (velocity// constraints have been taken into account)://------------------------------------------------------------T = [ tf^5 tf^4 tf^3
ScilabScilab conversion (1/2)conversion (1/2)The joint motors are controlled by the following polynomial expressions:
Θ1(t) = Θ1(0)+a1t5+a2t4+a3t3+ +a4t2+a5t
Θ2(t) = Θ2(0)+b1t5+b2t
4+b3t3+
+b4t2+b5t
Matrix equations are set up and solved for coefficient vectors (a, b), using given initial values Θ(0) and final values Θ(tf), and the results are used to plot the path of the robot hand
// Equations for b coefficients://---------------------------------------d = [ theta2tf - theta20; 0; 0 ]; // Theta 2 movementb= T\d // Coefficient vector bdisp(['Coefficients for theta2 motion:']) disp([string(b')])
// Equations of motion://------------------------------L1 = 4; // Length of upper arm [feet]L2 = 3; // Length of lower arm [feet]t = linspace(0, 2, 401); // Computation stepstq = [ t.^5; t.^4; t.^3 ]; theta1 = theta10 + a'*tq; // Base motor angular speedtheta2 = theta20 + b'*tq; // Elbow motor angular speedx1 = L1*cos(theta1) + L2*cos(theta1 + theta2); // x1 positionx2 = L1*sin(theta1) + L2*sin(theta1 + theta2); // x2 position
// Plot path of hand, add labels & legend://------------------------------------------------------plot(x1,x2),..
xlabel('x_1'),.. ylabel('x_2'),.. title('PATH OF A ROBOT HAND'),.. h1 = legend(['START: t=0s, (x_1,x_2) = (6.5,0); ..
STOP: t=2s, (x_1,x_2) = (0,2)'], 3)
Ex 6Ex 6--5: Robot arm (4/6), 5: Robot arm (4/6),
ScilabScilab conversion (2/2)conversion (2/2)
By requiring that velocity and acceleration at t=0 be zero, the polynomial coefficients a5 and a4become zero. This limits the size of the T matrix (previous slide) to 3x3
The computed coefficient vectors a and b are used to define angular speeds, based upon which the hand position is defined in x1 and x2 coordinates
Ex 6Ex 6--5: Robot arm (5/6), 5: Robot arm (5/6),
plot & displayplot & display
Coefficients for theta1 motion: !0.2028945 -1.0144726 1.3526302 ! Coefficients for theta2 motion: !0.3501567 -1.7507834 2.3343779 !
Ex 6Ex 6--5: Robot arm (6/6), 5: Robot arm (6/6),
discussiondiscussion
MatlabMatlab’’ss %% comment marks had to be changed to comment marks had to be changed to //// MatlabMatlab’’ss builtbuilt--in in pipi function had to be changed to function had to be changed to %pi%pi
Apostrophes (quotation marks) had to be rewritten, but only Apostrophes (quotation marks) had to be rewritten, but only because copybecause copy--pasting gives the wrong type (pasting gives the wrong type (’’ instead of instead of ’’))
The The dispdisp()() command had to be changed because command had to be changed because ScilabScilab does not does not output the a and b coefficients even if respective lines (a=Toutput the a and b coefficients even if respective lines (a=T\\d and d and b=Tb=T\\d) end without a semicolon (a d) end without a semicolon (a bug?bug?))
MatlabMatlab’’ss text()text() command is not recognized by command is not recognized by ScilabScilab (cf. (cf. Chapter Chapter 99). It allows legend beginnings to be located at precise points). It allows legend beginnings to be located at precise points–– The Help Browser does not give an answer on what to doThe Help Browser does not give an answer on what to do–– The The ScilabScilab--forfor--MatlabMatlab--usersusers compendium by compendium by BeilBeil & Grimm& Grimm--StreleStrele
mentions this particular case but does not offer a solution mentions this particular case but does not offer a solution –– ConclusionConclusion: We have to stick to : We have to stick to ScilabScilab’’ss ordinary legend commandsordinary legend commands
The manual conversion from Matlab scripts to Scilab was simple enough. Only the following came up:
Example 6Example 6--6: animation 6: animation
with planet & moon, introwith planet & moon, intro
The task is to animate a planet with a moon rotating around it. The task is to animate a planet with a moon rotating around it. If If possible, the bodies should have different colorspossible, the bodies should have different colors
The task has its first difficulty in finding a way to keep the pThe task has its first difficulty in finding a way to keep the planet lanet static while the moon rotates. My solution is to redraw both bodstatic while the moon rotates. My solution is to redraw both bodies ies for each step that the moon moves. Slow, but it worksfor each step that the moon moves. Slow, but it works
The second difficulty is to give the bodies different colors. ThThe second difficulty is to give the bodies different colors. The e handle command handle command color_mapcolor_map isis nice, but it operates on the Figure nice, but it operates on the Figure level and only one color is possible for graphs on the Axes levelevel and only one color is possible for graphs on the Axes level. l. The presented solution is not perfect, since only the edges of tThe presented solution is not perfect, since only the edges of the he facets that form the spheres have different colors (this can be facets that form the spheres have different colors (this can be done on the Entity level)done on the Entity level)
The third problem is with box alignment. It will be discussed onThe third problem is with box alignment. It will be discussed on the the plot slide plot slide
Ex 6Ex 6--6: planet & moon, 6: planet & moon,
script (1/3)script (1/3)
The spheres (planet, The spheres (planet, moon) are built from moon) are built from rectangular facets. The rectangular facets. The values of the facets are values of the facets are computed here, in computed here, in subroutine subroutine facet()facet()
Basic variables for the Basic variables for the planetplanet
// planet_moon1.sce
// Animation with a moon rotating around a planet. /// The spheres are ccomposed of 3D X, Y, and Z /// facets using the surf() function to plot. /
/ clear,clc,clf;
// **** SUBOUTINE **** //// Attach defined points to the spheres:function [x, y, z] = facet(v, h)
Basic variables for the Basic variables for the moon, both for the moon, both for the moon itself and its moon itself and its location in spacelocation in space
GO TO subroutine GO TO subroutine facet()facet() to compute to compute facet matricesfacet matrices
e1 = gce(); e1.foreground = color('red'); // Facet edge color
// Plot moon & define facet edges:x_loc = Rm*sin(Az); // Location on x axisy_loc = Rm*cos(Az); // Location on y axisC = Rm*[x_loc, -y_loc, 0] // Moon centersurf(C(1)+rm*Xm, C(2)+rm*Ym, C(3)+rm*Zm); // Plot moon
e2 = gce(); e2.foreground = color('blue'); // Facet edge color
show_pixmap(); end f.pixmap = "off";
// **** END MAIN **** //
Ex 6Ex 6--6: planet & moon, 6: planet & moon,
script (3/3)script (3/3)
Loop for rotation Loop for rotation beginsbegins
Delete old graphsDelete old graphs
Put color on the boxPut color on the box
Push planet data to Push planet data to first bufferfirst buffer
Recalculate moon Recalculate moon location & push data location & push data to first bufferto first buffer
show_pixmapshow_pixmap()() = = push plot to screenpush plot to screen
Ex 6Ex 6--6: animation with 6: animation with
planet & moon, plotplanet & moon, plot
And here the beauty is. The moon rotates counterclockwise and is shown in its start position
As said above, this task was not without problems. One thing that I failed to do was to tilt the box somewhat differently. The handle command a = gca(); a.rotation_angles = [alpha,theta] just refused to cooperate and the angles stayed at 51° and -125°respectively (a final bug?)
Measured with tick(); ... tock(), each moon step takes about 150 milliseconds to perform
Dr.EWJohnny Heikell
Dr.EWJohnny Heikell
20. Adieu20. Adieu
Final words to accompany you in Final words to accompany you in your struggle for survival of the your struggle for survival of the fittestfittest
Return to Contents
ThatThat’’s it, Folks!s it, Folks!
We have reached the end of our journey. The road was longer and We have reached the end of our journey. The road was longer and bumpier than I anticipatedbumpier than I anticipated
There is much more to Scilab but we are on our way if we master There is much more to Scilab but we are on our way if we master even this material (think of an office software package and howeven this material (think of an office software package and howlittle of its potential you really know even if you use it dailylittle of its potential you really know even if you use it daily))
The most important next step is to do Scilab simulations on our The most important next step is to do Scilab simulations on our own, own, to solve problems in our particular sphere of interest to solve problems in our particular sphere of interest
Learning = hard brainwork + a tough rear endLearning = hard brainwork + a tough rear end
And for everybodyAnd for everybody’’s sake, keep reminding the Scilab team about the s sake, keep reminding the Scilab team about the need for a comprehensive, upneed for a comprehensive, up--toto--date tutorial. To repeat an old date tutorial. To repeat an old engineering adage: engineering adage: The job isnThe job isn’’t done until the paperwork is done!t done until the paperwork is done!
All the best and take careAll the best and take care
JHJH
“When I think over what I have said, I envy dumb people.”Seneca (4 B.C.—A.D. 65).