WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     | 1 | 2 || 4 | 5 |   ...   | 19 |

Здесь приведем только элементарные математические функции, используемые чаще всего (табл. 2.1).

Таблица 2.1. Элементарные математические функции Функция Описание функции Тригонометрические sin(x) синус числа x cos(x) косинус числа x tan(x) тангенс числа x cotg(x) котангенс числа x asin(x) арксинус числа x acos(x) арккосинус числа x atan(x) арктангенс числа x Экспоненциальные exp(x) Экспонента числа x log(x) Натуральный логарифм числа x Другие sqrt(x) корень квадратный из числа x abs(x) модуль числа x log10(x) десятичный логарифм от числа x log2(x) логарифм по основанию два от числа x 2.6. Функции в Scilab y sin x Пример вычисления значения выражения z = · ex :

y Листинг 2.13. Вычисление математического выражения -->x=1.2;y=0.3;

-->z=sqrt(abs(sin(x/y)))*exp(x^y) z = 2.2.6.2 Функции, определенные пользователем В первой главе мы уже упоминали о файлах-сценариях и даже создавали небольшую программу, которая решала конкретное квадратное уравнение. Но в эту программу невозможно было передать входные параметры, т.е. это был обычный список команд, воспринимаемый системой как единый оператор.

Функция, как правило, предназначена для неоднократного использования, она имеет входные параметры и не выполняется без их предварительного задания. Рассмотрим несколько способов создания функций в Scilab.

Первый способ это применение оператораdeff, который в общем виде можно записать так:

deff(’[имя1,...,имяN] = имя_функции(переменная_1,...,переменная_M)’, ’имя1=выражение1;...;имяN=выражениеN’) гдеимя1,...,имяN список выходных параметров, то есть переменных, которым будет присвоен конечный результат вычислений, имя_функции имя с которым эта функция будет вызываться, переменная_1,...,переменная_M входные параметры.

Далее приведен самый простой способ применения оператора deff. Здесь показано, как создать и применить функцию для вычисления выражения y sin x z = · ex (значение этого выражения уже было вычислено в листин y ге 2.13):

Листинг 2.14. Пример определения функции пользователя с помощью оператораdeff -->deff(’z=fun1(x,y)’,’z=sqrt(abs(sin(x/y)))*exp(x^y)’);

-->x=1.2;y=0.3;z=fun1(x,y) z = 2.24 Глава 2. Основы работы в Scilab Рассмотрим пример создания и применения функции, вычисляющей площадь треугольника со сторонами a, b и c по формуле Герона a + b + c S = p · (p - a) · (p - b) · (p - c), где p =.

Листинг 2.15. Функция, вычисляющая площадь треугольника по формуле Герона -->deff(’S=G(a,b,c)’,’p=(a+b+c)/2;S=sqrt((p-a)*(p-b)*(p-c))’);

-->G(2,3,3) ans = 1.В следующем листинге приведен пример создания и применения функции, с помощью которой можно найти корни квадратного уравнения вида -b ± D ax2 + bx + c = 0 по формулам D = b2 - 4ac; x1,2 = a:

Листинг 2.16. Пример функции решения квадратного уравнения -->deff(’[x1,x2]=korni(a,b,c)’,’d=b^2-4*a*c;

x1=(-b+sqrt(d))/2/a;x2=(-b-sqrt(d))/2/a’);

-->[x1,x2]=korni(-2,-3,5) x2 = 1.

x1 = 2.Второй способ создания функции это применение конструкции вида:

function[имя1,...,имяN]=имя_функции(переменная_1,...,переменная_M) тело функции endfunction гдеимя1,...,имяN список выходных параметров, то есть переменных, которым будет присвоен конечный результат вычислений;имя_функции имя с которым эта функция будет вызываться,переменная_1,...,переменная_M входные параметры.

Все имена переменных внутри функции, а также имена из списка входных и выходных параметров воспринимаются системой как локальные, т.е. считаются определенными только внутри функции.

Вообще говоря, функции в Scilab играют роль подпрограмм. Поэтому целесообразно набирать их тексты в редакторе и сохранять в виде отдельных файлов.

Причем имя файла должно обязательно совпадать с именем функции. Расширение файлам-функциям обычно присваиваютsci илиsce.

Обращение к функции осуществляется так же, как и к любой другой встроенной функции системы, т.е. из командной строки. Однако функции, хранящиеся в отдельных файлах, должны быть предварительно загружены в систему, например, при помощи оператораexec(имя_файла)или командой главного меню File – Exec..., что, в общем, одно и то же.

2.6. Функции в Scilab В качестве примера рассмотрим следующую задачу.

Задача 2.1.

Решить кубическое уравнение.

Кубическое уравнение ax3 + bx2 + cx + d = 0 (2.1) после деления на a принимает канонический вид:

x3 + rx2 + sx + t = 0, (2.2) где b c d r =, s =, t =.

a a a В уравнении (2.2) сделаем замену r x = y и получим следующее приведенное уравнение:

y3 + py + q = 0, (2.3) где (3s - r2) r3 rs p =, q = 2 - + t.

3 27 Число действительных корней приведенного уравнения (2.3) зависит от знака p 3 q дискриминанта D = + (табл. 2.2).

3 Таблица 2.2. Количество корней кубического уравнения Количество Количество Дискриминант действительных корней комплексных корней D 0 1 D < 0 3 – Корни приведенного уравнения могут быть рассчитаны по формулам Кардано:

-(u + v) (u - v) -(u + v) (u - v) y1 = u+v, y2 = + i 3, y3 = - i 3. (2.4) 2 2 2 Здесь -q -q 3 u = + (D), v = - (D).

2 Далее представлен список команд, реализующий описанный выше способ решения кубического уравнения:

26 Глава 2. Основы работы в Scilab Листинг 2.17. Решение кубического уравнения 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 //Вызов функции и вывод результатов ее работы:



-->exec(’C:\Scilab\scilab-4.1.1\cub.sce’);

-->disp(’exec done’);

Warning :redefining function: cub exec done -->[x1,x2,x3]=cub(3,-20,-3,4) x3 = 0.x2 = - 0.x1 = 6.Глава Массивы и матрицы в Scilab. Решение задач линейной алгебры Для работы с множеством данных удобно использовать массивы. Например, можно создать массив для хранения числовых или символьных данных. В этом случае вместо создания переменной для хранения каждого данного достаточно создать один массив, где каждому элементу будет присвоен порядковый номер.

Таким образом, массив множественный тип данных, состоящий из фиксированного числа элементов. Как и любой другой переменной, массиву должно быть присвоено имя.

Переменную, представляющую собой просто список данных, называют одномерным массивом, или вектором. Для доступа к данным, хранящимся в определенном элементе массива, необходимо указать имя массива и порядковый номер этого элемента, называемый индексом.

Если возникает необходимость хранения данных в виде таблиц, в формате строк и столбцов, то необходимо использовать двумерные массивы (матрицы).

Для доступа к данным, хранящимся в таком массиве, необходимо указать имя массива и два индекса: первый должен соответствовать номеру строки, а второй номеру столбца, в которых хранится необходимый элемент.

Значение нижней границы индексации в Scilab равно единице. Индексы могут быть только целыми положительными числами.

28 Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры 3.1 Ввод и формирование массивов и матриц Задать одномерный массив в Scilab можно следующим образом:

name=Xn:dX:Xk гдеname имя переменной, в которую будет записан сформированный массив, Xn значение первого элемента массива,Xk значение последнего элемента массива,dX шаг, с помощью которого формируется каждый следующий элемент массива, т.е. значение второго элемента составитXn+dX, третьегоXn+ dX+dXи так далее доXk.

Если параметрdXв конструкции отсутствует, это означает, что по умолчанию он принимает значение, равное единице, т.е. каждый следующий элемент массива равен значению предыдущего плюс один:

name=Xn:Xk Переменную, заданную как массив, можно использовать в арифметических выражениях и в качестве аргумента математических функций. Результатом работы таких операторов являются массивы:

Листинг 3.1. Примеры работы с массивами --> Xn=-3.5;dX=1.5;Xk=4.5;

--> X=Xn:dX:Xk X = -3.5000 -2.0000 -0.5000 1.0000 2.5000 4.--> Y=sin(X/2) Y = -0.9840 -0.8415 -0.2474 0.4794 0.9490 0.--> A=0:A = 0 1 2 3 4 --> 0:ans = 0 1 2 3 4 --> ans/2+%pi ans = 3.1416 3.6416 4.1416 4.6416 5.1416 5.Еще один способ задания векторов и матриц в Scilab это их поэлементный ввод.

Так, для определения вектора-строки следует ввести имя массива, а затем после знака присваивания, в квадратных скобках через пробел или запятую, перечислить элементы массива:

name=[x1 x2... xn] или name=[x1, x2,..., xn] 3.1. Ввод и формирование массивов и матриц Пример ввода вектора-строки:

Листинг 3.2. Определение вектора-строки --> V=[1 2 3 4 5] V = 1 2 3 4 --> W=[1.1,2.3,-0.1,5.88] W = 1.1000 2.3000 -0.1000 5.Элементы вектора-столбца вводятся через точку с запятой:

name=[x1; x2;...; xn] Пример ввода вектора-столбца:

Листинг 3.3. Определение вектора-столбца --> X=[1;2;3] X = Обратиться к элементу вектора можно, указав имя массива и порядковый номер элемента в круглых скобках:

name(индекс) Например:

Листинг 3.4. Пример обращения к элементу массива --> W=[1.1,2.3,-0.1,5.88];

--> W(1)+2*W(3) ans = 0.Ввод элементов матрицы также осуществляется в квадратных скобках, при этом элементы строки отделяются друг от друга пробелом или запятой, а строки разделяются между собой точкой с запятой:

name=[x11, x12,..., x1n; x21, x22,..., x2n;...;

xm1, xm2,..., xmn;] Обратиться к элементу матрицы можно, указав после имени матрицы, в круглых скобках через запятую, номер строки и номер столбца на пересечении которых элемент расположен:

name(индекс1, индекс2) 30 Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры Далее приведен пример задания матрицы и обращение к ее элементам:

Листинг 3.5. Пример обращения к элементам матрицы --> A=[1 2 3;4 5 6;7 8 9] A = 1 2 4 5 7 8 --> A(1,2)^A(2,2)/A(3,3) ans = 3.Кроме того, матрицы и векторы можно формировать, составляя их из ранее заданных матриц и векторов:

Листинг 3.6. Пример конкатенации матриц --> v1=[1 2 3]; v2=[4 5 6]; v3=[7 8 9];

--> //Горизонтальная конкатенация векторов-строк:

--> V=[v1 v2 v3] V = 1 2 3 4 5 6 7 8 -->//Вертикальная конкатенация векторов-строк, -->//результат матрица:

--> V=[v1; v2; v3] V = 1 2 4 5 7 8 -->//Горизонтальная конкатенация матриц:

--> M=[V V V] M = 1 2 3 1 2 3 1 2 4 5 6 4 5 6 4 5 7 8 9 7 8 9 7 8 -->//Вертикальная конкатенация матриц:

--> M=[V;V] M = 1 2 4 5 7 8 1 2 4 5 7 8 3.1. Ввод и формирование массивов и матриц Важную роль при работе с матрицами играет знак двоеточия :. Указывая его вместо индекса при обращении к массиву, можно получать доступ к группам его элементов. Например:

Листинг 3.7. Примеры использования операции :

-->//Пусть задана матрица А --> A=[5 7 6 5; 7 10 8 7;6 8 10 9;5 7 9 10] --> //Выделить из матрицы А второй столбец --> A(:,2) ans = --> //Выделить из матрицы А третью строку --> A(3,:) ans = 6 8 10 --> //Выделить из матрицы А подматрицу М --> M=A(3:4,2:3) M = 8 7 --> //Удалить из матрицы А второй столбец --> A(:,2)=[] A = 5 8 7 7 6 10 5 9 --> //Удалить из матрицы А третью строку --> A(3,:)=[] A = 5 8 7 7 5 9 --> //Представить матрицу М в виде вектора-столбца --> v=M(:) v = --> //Выделить из вектора v элементы со второго по четвертый 32 Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры --> b=v(2:4) b = --> //Удалить из массива b второй элемент --> b(2)=[];





3.2 Действия над матрицами Для работы с матрицами и векторами в Scilab предусмотрены следующие операции:

+ сложение;

- вычитание1;

’ транспонирование2;

* матричное умножение3;

* умножение на число;

возведение в степень4;

\ левое деление5;

/ правое деление6;

.* поэлементное умножение матриц;

. поэлементное возведение в степень;

.\ поэлементное левое деление;

./ поэлементное правое деление.

Операции сложения и вычитания определены для матриц одной размерности или векторов одного типа, т.е. суммировать (вычитать) можно либо векторы-столбцы, либо векторы-строки одинаковой длины.

Если в некоторой матрице заменить строки соответствующими столбцами, то получится транспонированная матрица.

Операция умножения вектора на вектор определена только для векторов одинакового размера, причем один из них должен быть вектором-столбцом, а второй вектором-строкой. Матричное умножение выполняется по правилу строка на столбец и допустимо, если количество строк во второй матрице совпадает с количеством столбцов в первой. Кроме того, переместительный закон на произведение матриц не распространяется.

Возвести матрицу в n-ю степень значит умножить ее саму на себя n раз. При этом целочисленный показатель степени может быть как положительным, так и отрицательным. В первом случае выполняется алгоритм умножения матрицы на себя указанное число раз, во втором умножается на себя матрица, обратная к данной.

(A\B) (A-1B), операция может быть применима для решения матричного уравнения вида A · X = B, где X неизвестный вектор.

(B/A) (B · A-1), используют для решения матричных уравнений вида X · A = B.

3.2. Действия над матрицами Пример действий над матрицами:

Листинг 3.8. Примеры матричных операций -->A=[1 2 0;-1 3 1;4 -2 5];

-->B=[-1 0 1;2 1 1;3 -1 -1];

-->//Вычислить (AT+B)2 - 2A(0.5BT-A) -->(A’+B)^2-2*A*(1/2*B’-A) ans = 10. 8. 24.

11. 20. 35.

63. - 30. 68.

--> //Решить матричные уравнения А•Х=В и Х•A=B.

-->A=[3 2;4 3];

-->B=[-1 7;3 5];

-->//Решение матричного уравнения AX=B:

-->X=A\B X = - 9. 11.

13. - 13.

-->//Решение матричного уравнения XA=B:

-->X=B/A X = - 31. 23.

- 11. 9.

-->//Проверка -->X*A-B ans = 0. 0.

0. 0.

Кроме того, если к некоторому заданному вектору или матрице применить математическую функцию, то результатом будет новый вектор или матрица той же размерности, но элементы будут преобразованы в соответствии с заданной функцией:

Листинг 3.9. Пример применения функции к массиву --> x=[0.1 -2.2 3.14 0 -1];

--> sin(x) ans = 0.0998 -0.8085 0.0016 0 -0.34 Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры 3.3 Специальные матричные функции Для работы с матрицами и векторами в Scilab существуют специальные функции. Рассмотрим наиболее часто используемые из них.

Функции определения матриц:

• matrix(A [,n,m]) преобразует матрицуAв матрицу другого размера;

Листинг 3.10. Использование функцииmatrix -->D=[1 2;3 4;5 6];

-->matrix(D,2,3) ans = 1. 5. 4.

3. 2. 6.

-->matrix(D,3,2) ans = 1. 2.

3. 4.

5. 6.

-->matrix(D,1,6) ans = 1. 3. 5. 2. 4. 6.

-->matrix(D,6,1) ans = 1.

3.

5.

2.

4.

6.

• ones(m,n) создает матрицу единиц изmстрок иnстолбцов1;

Листинг 3.11. Использование функцииones -->ones(1,3) //Формируется вектор-строка ans = 1. 1. 1.

-->ones(2,2) //Формируется квадратная матрица ans = 1. 1.

1. 1.

-->m=3; n=2;

Результатом работы функцииones(n1,n2...,nn)будет многомерная матрица единиц.

3.3. Специальные матричные функции -->X=ones(m,n) //Формируется матрица размерности m на n X = 1. 1.

1. 1.

1. 1.

-->M=[1 2 3;4 5 6] M = 1. 2. 3.

4. 5. 6.

-->//Формируется матрица Y, состоящая из единиц, -->//той же размерности, что и матрица M -->Y=ones(M) Y = 1. 1. 1.

1. 1. 1.

• zeros(m,n) создает нулевую матрицу1 изmстрок иnстолбцов2;

Листинг 3.12. Использование функцииzeros -->zeros(3,2) ans = 0. 0.

0. 0.

0. 0.

-->M=[1 2 3 4 5];

-->Z=zeros(M) Z = 0. 0. 0. 0. 0.

• eye(m,n) формирует единичную матрицу3 изmстрок иnстолбцов;

Листинг 3.13. Примеры использования функцииeye -->eye(3,3) ans = 1. 0. 0.

0. 1. 0.

0. 0. 1.

-->eye(5,1) ans = В нулевой матрице все элементы равны нулю.

Результатом работы функцииzeros(n1,n2...,nn)будет многомерная матрица нулей.

В единичной матрице элементы главной диагонали равны единице, а все остальные нулю.

36 Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры 1.

0.

0.

0.

0.

-->m=3; n=4;

-->E=eye(m,n) E = 1. 0. 0. 0.

0. 1. 0. 0.

0. 0. 1. 0.

-->M=[0 1;2 3];

-->//Формируется единичная матрица E -->//той же размерности, что и матрица M -->E=eye(M) E = 1. 0.

0. 1.

-->//Функцию можно использовать без параметров eye().

-->//В этом случае задается матрица с неопределенными -->//размерами, которые будут определены после суммирования -->//с другой, определенной ранее, матрицей.

-->M=[1 2;3 4;5 6]; E=eye();

-->A=E+M A = 2. 2.

3. 5.

5. 6.

-->M-E ans = 0. 2.

3. 3.

5. 6.

Pages:     | 1 | 2 || 4 | 5 |   ...   | 19 |










© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.