If we
take into consideration that the alternative is the backup structural
controlling construction, then the algorithm of any difficult program can be
realized without the operator if from the panel of programming of Mathcad.
User’s
function, which returns the root of an equation and uses half-division method,[1] is created by the first program in
the fig. 39. The cycle with pre-check, which loop
body has the complete alternative. The operator if is excluded from the second program in the fig. 39:
the alternative with one arm is the cycle with pre-check, which loop body is
executed either once or never. The complete alternative (the alternative with two
arms) is two incomplete alternatives: two alternatives with one arm. The
alternative is the tool for shortcut motion along the program only on one
direction (top-down), but the cycle is the shortcut motion on both directions
(top-down and bottom-up). Hence we see the «uselessness» of the alternative.
The continuation (opening) of the theme you will find in tip 45 and in one of the books «Programming
in Mathcad».
When you
realize the branched algorithms the structural directive construction, namely alternative
is used parallel with the cycle. For it we bring the Boolean variable in
the program, which directs the alternative. Then we execute the following
operations according to the first (it is better to say – according to zero) or
the second (non-zero) script depending on what current value (0 – no, not zero –
yes) the Boolean variable has. If every of two arms of the alternative have one
by one operators, then it is possible to try to use the function if from the set of the built-in
functions of Mathcad (please, compare two functions in the fig. 40) instead of the operator if from the programming bar. If at
that something is bound to the same variable in two shoulders of the
alternative then it is possible to do with only
operator, which is used the function if. The example:
c ¬ if(a > b, a, b) instead
of if(a > b, c ¬ a, c ¬ b)
Unfortunately,
the method of change of the operator if to of the same name function stops to work in Mathcad 8 Pro, Mathcad 2000 Pro and Mathcad 2001 Pro – the function ìåòîä_ïîë_äåë_2 in Mathcad PLUS 6.0
and Mathcad 7 Pro gives the right result but if we transfer it in Mathcad 8 Pro
and over it gets caught in an endless loop.
However
for realization the branched algorithms out of a program it is possible to
change the function if to the combination of the operators if and otherwise.
At
that it is expedient to lead the operators return in the plural branching, which
quicken the calculation (tip without number).
Actually
the function if has become
unnecessary: in new version of Mathcad the function is kept for compatibility
with old versions[2]. The same history happened with the
function until (loop
organization, which body has one operator), which the operator while successfully changed. (Although in
eighth and over versions of Mathcad-there is the function until and it works but there is not it
Master function.)
If there
are two or more operators in shoulders of the complete alternative then they
are written under the key words if and otherwise (see the functions in the fig. 33).
If these blocks of the operators are enclosed in brackets then they will
be situated left of corresponding key words (see fig. 41,
where the function of search of minimum using the method of golden section is
else «shortened» in comparison with its analogues in the fig. 33).
The
important remark!
It is impossible to place all operators on one line in shoulders of the
alternative (see tip 33). Such program will work in
Mathcad 7 Pro but it will stop to function (it will get caught in an endless
loop or will return wrong answer) in Mathcad 8 and over.
Placing
of a few operators on one line (see tip 33) has one
more explanation.
Two
first operators of both programs can be executed in any order in the fig. 42 (for example, at first two is bound the
variable b but then one
is bound the variable a or vice versa as in the fig. 42). But it is better
to execute these operators at the same time i.e. parallel!
Compiler of Mathcad supports only the sequential calculations on
uniprocessor machine. The calculation can be appreciably expedited by multisequencing
the calculation. Here is the typical problem for such calculations - two matrixes are summed up:
corresponding element of the second matrix is summed up every element of the
first matrix.
At present time «parallel»
versions of traditional programming languages (FORTRAN, for example) for work on
multiple-processors machines appear.
When we place «parallel»
operators on one line of Mathcad-program (see fig. 42)
first of all we as if prepare it for execution on multiple-processors machine
and in the second place we underscore cause-effect relation of operators and of
operators’ blocks.
In all
programming languages there are the key words and the symbols, which fix begin
and end of the separate soft blocks. In the programming language
Pascal – the words are begin and end, in the programming language C – the
symbols are curly brackets, in the programming language BASIC – the end of a
line, the key words are Next, EndIf, Then, Else and etc. Soft blocks of Mathcad
are fixed by the vertical line, which appear (be prolonged) after keystroke Add
Line on the programming panel. But if there is only one operator in a soft
block then it will not be outlined by the vertical line. It decreases a little «readability» of the
Mathcad-program. In the traditional programs a separate operator and a block of
operators can be marked out by the paragraphs from the left side of a display
or of a paper showing this way the nesting of structures. Mathcad is devoid of
such possibility too or rather a paragraph is entered not by a programmer but
by the system and more over it is not so much showed in case when there is only
one operator in the block.
To
pick out one operator by a vertical line in Mathcad-program it is necessary to
add the commentaries to it (see tip 30). As the
commentaries you can use the key words or symbols of programming languages that
are acquainted the certain user of Mathcad. In the fig. 43
reader sees «almost Pascal» Mathcad-program of search of a root of the
algebraic equation by the half-division method, which «normal» version you can
see in the fig. 39.
In
Mathcad the built-in function Find[3], which works together with the key
word Given, is meant for solution the system
of nonlinear algebraic equations (see the example of the solution of such
problem in tip 10). Unfortunately similar technology is
impossible in Mathcad-program as since we can not put in the key word Given in it. There are three solutions of
the problem:
1.
It is
possible to try to reduce the nonlinear system to linear one using, for
example, change of variables. After it the problem is solved with the help of
the built-in function lsolve[4], which does not demand the key word
Given.
2.
It is
possible to try to reduce the system of equations to one algebraic equation
using variables substitution[5]. Search of roots of the equation is
possible with the help of the function root in a soft block (general case) or polyroots (equation-polynomial). Solution of
the problem can be obtained with the help of enclosure of the built-in function
root: root (f1, root (f2,… and etc.
3.
Starting
with the eighth version the functions Minimize and Maximize are brought in Mathcad, which orient for
solution optimization problems. These functions can work both with the key word
Given (constrained problem – see the
example in tip 15) and without it (unconstrained
problem). This allows searching roots of the system inside a soft block with
the help of the function Minimize. At that, for example, it is possible to minimize squared maximum
coherence of the system: to find such values of the variables that left and
right parts differ each other minimally – see fig. 44.
For it a subsidiary user’s function F(x, y) is formed. It returns maximum values (max) of deviation square of left and right parts
of the equations that the current problem includes. Unfortunately it is
impossible to define the user’s function inside the program (limitation of
Mathcad). After it the main soft user’s function roots(x, y) is formed. Its arguments are the
first approximation to solution of the system. The function returns a matrix,
which the first column keeps commentaries, the first element of the second
column keeps the decision vector and the second element of the second column
keeps maximum residual of the system that is used for control of the accuracy
of the solution. In the fig. 44 four real roots have
been found. Graphical solution of the problem was considered in tip 24 but the analytical one – in tip
29.
Attention! Mathcad-document in the fig. 44
gives the right result only in Mathcad 8 Pro and it stops to work in Mathcad
2000 Pro. The author let know of the bug the developer of Mathcad. The main
point of the answer was the following: «The functions, which include in Solver
of Mathcad (group Solving in Master functions of Mathcad: Minimize, Maximize, Find, MinErr, polyroots and root) are not the creation of MathSoft,
Inc. but they are purchasing from the firm Frontline, Inc. That’s why all
claims we have to direct to it». Nevertheless the mistake has been fixed in
Mathcad 2001.
In
Mathcad a function can return a few values, which are united in a vector or a
matrix (array). The given soft user’s function returns the values of perimeter
and square of a triangle depending on a length of its side in the point 1 in
the fig. 45. But if user wants the arguments to be
dimensional ones for the function returns the value of perimeter and square of
the triangle with corresponding units (length and square – point 2) then
failure will wait for him. At that misleading error report will appear:
«Mismatch units». User thinks that he sums meters with kilogrammes, for
example, but the cause hides in another thing – a vector of Mathcad can keep
the variables only the same dimension. We have already met with this phenomenon
when we considered the methods of programs debugging in tip
36 and 37.
It
is possible to make the function in the fig. 45 to
give two values not at once but by turns (see tip 37)
– depending on the value of the additional argument (point 3): if i = “Perimeter”
then the function Parameters_triangle
returns the triangle's
perimeter, if i = “Square” then the function returns the square. But in this case the work with
dimensions will result in bugs too – see point 4. The function Parameters_triangle like any other function always
returns unit of a dimensional variable from the first «returned» line of the
program.
The
developer of Mathcad was told about the given mistake (the program in the fig. 45 always outputs dimension of an operand of the
first operator return). The
mistake was partly fixed: if we install the first patch on Mathcad 2000 Pro –
after which number of the version becomes longer on letter «A» then the program
will return … non-dimensional value in point 3 in the fig. 45.
In
tips of the firm MathSoft (see Tip of the day –
point 71)
dimension inside the programs is not recommended to use. At that for some reason
the loops are mentioned, but they do not have the possibility to work with
dimensional variables. In this case the point is not only in loops, but also in
return mechanism of variables and certainly in arrays, which are not able to
keep variables of different dimensions.
In
point 7 in the fig. 45 the alternative is changed on
two loops While, which operators body execute either one time or not once.
About this method we have written in tip 39
but here it is used for the attempt of rehabilitation of the program in the fig. 45. We have to admit that the attempt has turned
out to be failed: both alternative and loop work with dimensions not completely
correctly. Way out is in tip 52 and… in Mathcad 2001 Pro
where the mistake has been finally fixed.
There is
a number of special jokers who get pleasure from the attempts of practical
jokes of a computer: «Computer, you think too much of
itself. Let’s look, if you swallow it or not!» – they think this way or about it
when the input wittingly «wrong» information in the computer.
Computer has to be able to protect itself from «free» or «forced»
mistakes of user.
In tip 6 and 21 we have already given the advices about the
protection – not a computer, certainly (though how shall I put it: for example,
user can set in a computer wrong floppy disk, open shady letter, which he has
received via e-mail[6], bring in virus and break soft or
hard part of a computer), but a user himself – from the mistakes of input:
control of hit inside the possible range (tip 6),
control of data addition of necessary dimension (tip 21).
As
rule it is impossible to provide for all potential mistakes of a user in advance.
Usually these mistakes appear during operation of the program. If a mistake is
noticed and it resulted in unwanted consequences then the program will be added
by new operators and functions, which prevent from appearance of the given
mistake.
Our
old problem, which returns volume of a cone depending on its geometrical sizes,
is showed in the fig. 46: diameter of base (d) and length of the cone’s
generatrix (l) supplemented
by control of the ration between d and l. When you
protect a program it is important not only to lock its work if the
initial data are wrong but also to give maximum informative error report[7]: built-in or user’s one. But the
embedding in the program of user’s error report (non-dimensional text constant)
breaks its ability to work with dimension values: the function V returns non-dimensional values in
case if its arguments are dimensional ones.
It
is too difficult to suggest what mistakes user can do when he inputs initial
data. It is possible to go of contraries – to accept only right data and to
identify and cut off wrong data. In this case the operator error will be useful but not the function: ¾ on error ¾ – processing operator of alert conditions.
The first operand will be executed in the given operator if the bug takes place
during the execution of the second operand.
They (see
the title of the tip) can be marked not only as constants but also as variables,
expressions and functions.
The
method of numerical search of local minimum and local maximum of user’s
one-argument function is showed in the fig. 47.
As rule such work is accompanied by the graphical control of the result –
construction of graph inclusive the obtained points in Cartesian coordinates.
Mathcad
allows marking to
points on the graph by red dotted lines. For it in the window for formatting
graphs on the tab Axes we place ticks (the options are turned on) Show Markers.
After it couple of placeholders appear on the graph near the axes y and x where user generally writes constants
(numbers). However we can input their variables (expressions, functions)
and we have done it: not fixed, but floating markers have
appeared and they mark critical points (minimum and maximum) on the graph. If
we find new points of minimum and maximum (of modified initial function, for
example), then the dotted lines for fixation them on the graph will remove
automatically too.
As
well it is possible to insert not only numbers but also the expressions in
placeholders near the axes y and x for floating
fixation of graph scattering by the ordinate and the abscissa. The term
«floating fixation» is strange enough (it is like «boot soft-boiled») but in
the given case it describes quite exactly the technology of graph formatting –
we put variables in places where developer prescribes to put constants.
It
is possible to recommend one more method of fixation the points on a graph for
additional formatting. Very often when one publishes the results of calculation
in Mathcad the graphics are «froze» by the keystroke PrnScr (or Alt + PrnScr)
and then they design as a general picture in the environment of some graphics
editor. In this case it is possible to add the graph as you wish. Rather well
to give notice people who try to repeat such perfect picture in Mathcad of that
such «appearance» of the graph is not provided[8] in Mathcad.
Very
often in Cartesian coordinates of two and more one-variable functions some
curve «lies» down the axis x because of small value of the corresponding function in selected range
of the argument. In Mathcad it is impossible to have two axes y with different scales (we can have
it, for example, in Excel). Nevertheless the solution of the problem exists[9].
The view of the function and its derivative is
showed in the first graph fig. 48. «Dispersion» of
values of the function and its derivative are not commensurable in the given
limit of the argument (8-9) in the graph.
In the second graph values of the function are
multiplied by 10 (the coefficient is sorted out experimentally) and it
«reanimates» the graph: now one can see that derivatives equal zero in the
points of minimum and maximum and etc.
The second difference of the graphs in the fig. 48 allows formulating one more tip (without
number).
The derivative is constructed by numerical calculation
of its values in the first graph. It is long enough and quite inaccurate[10] procedure. Before we will construct
the second graph we form the additional function dy, which keeps the derivative of the function y appointed by the tools of symbolic
mathematics of Mathcad: speed and accuracy of construction of the graph increase abruptly.
[1] Here we have the same situation as in the programs in the fig. 38: control of the execution of the cycle is leaded by the value of the argument, but not the function: à ≈ b – the area of finding the root has narrowed almost till point.
[2] Compatibility «botton-up»: the documents that were written in seventh version of Mathcad have to work in newer versions but inside out it is not obligatory.
[3] Tip without number: it is worth sometimes to use the function Find for solution of the linear systems (instead of the function lsolve). For example, in this case it is possible to bring in physical values. More over the block Given-Find makes the solution more visual.
[4] The function lsolve appeared in Mathcad not long ago. Before it the systems of linear algebraic equations were solved only with the help of the operator X := A-1 B, where À is the matrix of the coefficients of unknowns quantities but  is the vector of absolute terms. Tip without number: it is not worth to use new tools of Mathcad without special necessity. If it is possible to say it makes a calculation deeper in terms of compatibility with old versions of Mathcad. More over «old horse does not spoil a furrow» (see tip 66).
[5] It is possible to do with the help of the command or the operator substitute of symbolic mathematics of Mathcad.
[6] For example, under the name «I love you» (tip was written in May 2000, when virus of the same name raged in Europe and).
[7] Mathcad very often «sins» such mistake – it breaks the execution of the program but gives not quite right built-in error report (see for example, point 2 in the fig. 45).
[8] In Mathcad 2000 it became possible to «bring» text in the graph, which was written on free place of Mathcad-document in advance.
[9] Certainly it is possible to introduce the Excel's graph in Mathcad-document. But we have come to the agreement that our tips are limited only by the tools of Mathcad.