В первой главе мы уже рассмотрели создание небольшой программы, которая решает конкретное квадратное уравнение. В этой программе отсутствовал заголовок (первая строка определённого вида), и в неё невозможно было передать входные параметры, то есть это был обычный список команд, воспринимаемый системой как единый оператор.
Функция, как и программа, предназначена для неоднократного использования, но она имеет входные параметры и не выполняется без их предварительного задания. Функция имеет заголовок вида
\[ function\ name1[,name2,... ] = fun(var1[,var2,... ]) \]
где \[ name1[,name2,... ] \] — список выходных параметров, то есть переменных, которым будет присвоен конечный результат вычислений, \[ fun \] — имя функции, \[ var1[,var2,... ] \] — входные параметры. Таким образом простейший заголовок функции выглядит так:
\[ function\ name = fun(var) \]
Все имена переменных внутри функции, а также имена из списка входных и выходных параметров воспринимаются системой как локальные, то есть эти переменные считаются определёнными только внутри функции.
Программы и функции в Octave могут быть созданы при помощи текстового редактора и сохранены в виде файла с расширением .m или .M. Но при создании и сохранении функции следует помнить, что её имя должно совпадать с именем файла.
Вызов программ в Octave осуществляется из командной строки. Программу можно запустить на выполнение, указав имя файла, в котором она сохранена.
Обращение к функции осуществляется так же, как и к любой другой встроенной функции системы, то есть с указанием входных и выходных параметров. Вы можете вызвать функцию из командной строки или использовать её как один из операторов программы.
Пример 2.1. Создать функцию для решения кубического уравнения.
Кубическое уравнение
\[ ax^3+bx^2+cx+d=0 \]после деления на \[ a \] принимает канонический вид:
\[ x^3+rx^2+sx+t=0, \]где \[ r=\frac{b}{a}, s=\frac{c}{a}, t=\frac{d}{a} \]
В уравнении (2.1) сделаем замену
\[ x=y-\frac{r}{3} \]и получим следующее приведённое уравнение:
\[ y^3+py+q=0, \]где \[ p=\frac{(3s-r^2)}{3},q=\frac{2r^3}{27}-\frac{rs}{3}+t \]
Число действительных корней приведённого уравнения (2.2) зависит от знака дискриминанта \[ D =(\frac{p}{3})^3+(\frac{q}{2})^3 \] (табл. 2.10).
Корни приведённого уравнения могут быть рассчитаны по формулам Кардано:
\[ y_1=u+v,y_2=\frac{-(u+v)}{2}+\frac{(u-v)}{2}i\sqrt{3},y_3=\frac{-(u + v)}{2}-\frac{(u-v)}{2}i\sqrt{3} \]Дискриминант | Количество действительных корней | Количество комплексных корнейth |
---|---|---|
D \[ \ge \] 0 | 1 | 3 |
D<0 | 3 | - |
Здесь \[ u=\sqrt[3]{\frac{-q}{2}+\sqrt{D}}, v =\sqrt[3]{\frac{-q}{2}-\sqrt{D}}, \]
Далее представлен список команд (листинг 2.1), реализующий описанный выше способ решения кубического уравнения:
>>> function [ x1, x2, x3]=cub (a, b, c, d) r=b/a; s=c /a; t=d/a; p=(3*s-r ^2) /3; q=2*r ^3/27-r*s/3+t; D=(p/3) ^3+(q /2) ^2; u=(-q/2+ sqrt (D)) ^(1/3); v=(-q/2-sqrt (D)) ^(1/3); y1=u+v; y2=-(u+v ) /2+(u-v ) /2*i*sqrt ( 3 ); y3=-(u+v ) /2 -(u-v ) /2*i*sqrt ( 3 ); x1=y1-r / 3; x2=y2-r / 3; x3=y3-r / 3; endfunction % Вычисляем корни уравнения \[ 3x^3-2x^2-x-4=0 \] >>> [x1, x2, x3]=cub(3, -2, -1, -4) x1 = 1.4905 x2 = -0.41191 + 0.85141i x3 = -0.41191 - 0.85141iЛистинг 2.1. Нахождение корней кубического уравнения (пример 2.1).